কীভাবে "পোস্ট লক / সম্পাদনা লক" অক্ষম করবেন?


16

আমি কেবল একটি পোস্ট ধরণের জন্য এটি অক্ষম করতে চাই, কারণ অন্য কোনও ব্যবহারকারী এটি সম্পাদনা করছে কিনা তা আসলেই গুরুত্বপূর্ণ নয় (মূল বিষয়বস্তু সম্পাদনার ক্ষেত্রটি অ্যাজ্যাক্সাইফাইড এবং অ-প্রশাসকরা কেবল এটি দেখতে পাবে)।

এখানে চিত্র বর্ণনা লিখুন

আমি মূল ফাংশনগুলির দিকে তাকিয়েছিলাম তবে কোনও প্রবেশের পয়েন্টটি পাইনি। ফাংশন থেকে wp_set_post_lockআমি অনুমান করছি যে আমাকে আটকাতে হবে get_post_meta, তবে এটি করার কোনও সরকারী উপায় আছে কি?

এবং একটি দ্বিতীয় লক রয়েছে যা ফিল্টার দ্বারা প্রভাবিত বলে মনে হচ্ছে না wp_check_post_lock_window( যেমন একটি উত্তরে বার্জায়ার দেখিয়েছে )। আমি remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );বিভিন্ন পয়েন্টে চেষ্টা করেছি কিন্তু এটি সম্মান না দিয়ে মারধর করে চলেছে remove_filter

এখানে চিত্র বর্ণনা লিখুন


1
উদ্দেশ্যগুলি সম্পর্কে আমি স্পষ্টতা যোগ করেছি এবং এটি মনের একটি সমাধান নিয়ে আসে: এই বিষয়বস্তুকে অন্য স্ক্রিনে প্রশাসনিকদের কাছে দেখানো হচ্ছে। তবে তা post_lockসত্ত্বেও সঠিক হুক জেনে ভাল লাগবে ।
brasofilo

উত্তর:


10

অতিরিক্ত হিসাবে @birgire উত্তর ...

ফলাফল

register_post_type()একটি পোস্ট ধরণের সমর্থন নিবন্ধভুক্ত করার অনুমতি দেয়, যা পরে ব্যবহারের পরেও করাadd_post_type_support() যেতে পারে । এবং যে এমনকি পরে সব অলৌকিক ব্যবহারের বিরুদ্ধে চেক করা হতে পারে post_type_supports( $cpt, $feat )

একটি সাধারণ মিনি প্লাগইন যা একটি নতুন বৈশিষ্ট্য যুক্ত করে

এখন নিম্নলিখিত (মিউ) প্লাগইনটি নতুন ধরণের পোস্ট টাইপ সমর্থনের জন্য যাচাই করে যা পোস্ট লক বৈশিষ্ট্যটি অক্ষম করে। এটি নামকরণ করা হয়েছে disabled_post_lock

<?php
defined( 'ABSPATH' );
/** Plugin Name: (#120179) Maybe Disable Post Type Support */

add_action( 'load-edit.php', 'wpse120179MaybeDisablePostLock' );
function wpse120179MaybeDisablePostLock()
{
    if ( post_type_supports( get_current_screen()->post_type, 'disabled_post_lock' ) )
        add_filter( 'wp_check_post_lock_window', '__return_false' );
}

প্রতি সিপিটিতে একটি প্লাগইন

তারপরে আমরা সহজেই আমাদের নিজস্ব বা তৃতীয় পক্ষের প্লাগইনগুলির জন্য পোস্ট টাইপ সমর্থন অক্ষম করতে মিনি প্লাগইনগুলি যুক্ত করতে পারি (ব্যবহারকারীর মেটা টেবিলটিতে আমাদের কিছু ব্যান্ডউইথ এবং ডিবি আকার সংরক্ষণ করে):

<?php
defined( 'ABSPATH' );
/** Plugin Name: (#120179) Disable Post Type Support for "Beer" Posts */

add_action( 'init', function()
{
    add_post_type_support( 'beer', 'disabled_post_lock' );
} );

দ্বিতীয় প্লাগইনটি সক্রিয় হওয়ার সাথে সাথেই আমাদের বিয়ার পোস্টের ধরণের আর কোনও পোস্ট লক নেই। এটি দুর্দান্তভাবে কাজ করা উচিত এবং প্লাগইন অ্যাডমিন স্ক্রিনের মাধ্যমে সহজেই ফেরানো যায়।

হার্টবিট এপিআই অক্ষম করা হচ্ছে

হিডবিট এপিআই অক্ষম করতে প্লাগইনটি প্রসারিত করা:

<?php
defined( 'ABSPATH' );
/** Plugin Name: (#120179) Maybe Disable Post Type Support */

add_action( 'load-edit.php', 'wpse120179MaybeDisablePostLock' );
function wpse120179MaybeDisablePostLock()
{
    if ( post_type_supports( get_current_screen()->post_type, 'disabled_post_lock' ) )
    {
        add_filter( 'wp_check_post_lock_window', '__return_false' );
        add_filter( 'heartbeat_settings', function( $settings )
        {
            return wp_parse_args( [ 'autostart' => false ], $settings );
        } );
    }
}

এটি সত্যিই উত্কৃষ্ট সমাধান, আপনি কীভাবে admin-ajax.phpঅংশটি পরিচালনা করবেন (কিউ আপডেট এবং একটি যুক্ত হয়েছে)?
brasofilo

@ ব্রাসোফিলো আমি হার্টবিট API পুরোপুরি অক্ষম করার জন্য একটি সম্পাদনা যুক্ত করেছি। আপনি কীভাবে এটি পরিচালনা করতে চান তা নিশ্চিত নয় তবে আপনি এখনও wp.heartbeat.start();জাভাস্ক্রিপ্ট ব্যবহার করে প্লাগিনগুলিতে হার্টবিট এপিআই চালাতে পারেন ।
কায়সার

2
post_type_supportsপ্রতিটি কাস্টম পোস্ট টাইপের জন্য এটি হ্যান্ডেল করার জন্য এটি দুর্দান্ত ধারণা , আমি আশা করি আমি আপনাকে আরও উচ্চতর উপহার দিতে পারব ;-)
বার্গায়ার

7

সম্পাদনা-লক পপআপ উইন্ডোটি সরাতে , আপনি চেষ্টা করতে পারেন:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

এই পথে যাওয়ার উপায় কিনা তা আমি নিশ্চিত নই, তবে আমি উত্সটি পরীক্ষা করেছিলাম wp_check_post_lock() এবং সেখানে আমাদের এই লাইন রয়েছে:

...cut...

$time_window = apply_filters( 'wp_check_post_lock_window', 120 );

if ( $time && $time > time() - $time_window && $user != get_current_user_id() )
    return $user;
return false;

...cut...

শর্তটি $time_windowতাই ধারণা পরিবর্তন করা ifহয় false

হালনাগাদ:

edit.phpস্ক্রিনে এটি প্রয়োগ করতে , কাস্টম পোস্টের beerউদাহরণ সহ উদাহরণস্বরূপ:

function wpse_120179()
{
    if( 'beer' === get_current_screen()->post_type )
        add_filter( 'wp_check_post_lock_window', '__return_zero' );

}
add_action( 'load-edit.php', 'wpse_120179' );

এবং তারপরে আমরা যুক্ত করতে পারি:

add_action( 'load-post.php', 'wpse_120179' );

post.phpপর্দার জন্য এটি অপসারণ ।

আরও খনন করা হচ্ছে ...

ফাংশন _admin_notice_post_locked()হয় সংজ্ঞায়িত শুধু নিচের wp_set_post_lock()ফাংশন। এতে এই লাইন রয়েছে:

...cut...
if ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) )
    return;
...cut...

সুতরাং কেউ show_post_locked_dialogফিল্টার চেষ্টা করতে পারেন :

add_filter( 'show_post_locked_dialog', 'wpse_120179_close_dialog', 99, 3 );

function wpse_120179_close_dialog( $show, $post, $user )
{
    if( 'beer' === $post->post_type )
        return FALSE;

    return $show;
}

এর __return_false()পরিবর্তে কেবল প্রথম $timeঅঙ্ক হিসাবে একটি অঙ্ক হিসাবে প্রথমে ব্যবহার করা কি সহজ হবে না bool TRUE?
কায়সার

ঠিক আছে হয়তো, কিন্তু আমি নিশ্চিত সেট কিভাবে আছি $timeকরতে falseতাই আমি জন্য গিয়েছিলাম $time_windowপরিবর্তে ...
birgire

3

চূড়ান্ত সংমিশ্রণটি আমি ব্যবহার করে শেষ করেছি

# Takes care of the message "Someone else is editing this"
add_action( 'load-edit.php', function()
{
    if( 'beer' === get_current_screen()->post_type )
        add_filter( 'wp_check_post_lock_window', '__return_false' );
});

# Takes care of post.php and the "User has taken over" message
add_filter( 'show_post_locked_dialog', function( $bool, $post, $user )
{
    if( 'beer' === $post->post_type )
        return false;
    return $bool;
}, 
10, 3 );

তবে কারও কাছে যদি অন্যটি থাকে তবে আমি শুনতে পছন্দ করব, কারণ আমি উপলব্ধ ফিল্টারগুলির পুরো ছবিটি সত্যিই বুঝতে পারি না।

পূর্বে, load-edit.php+ ব্যবহার করে load-post.phpআমাকে ফিল্টারটি সরিয়ে ফেলতে হয়েছিল wp_refresh_post_lock:

add_action( 'admin_init', function()
{
    if( !defined('DOING_AJAX') || !isset( $_POST['screen_id'] ) || 'beer' !== $_POST['screen_id'] )
        return;

    remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10 );
});

তবে প্রত্যেকটিতে লোড করা admin_initভাল ধারণা বলে মনে হয় না।


get_current_screen()->post_typeপরিবর্তে ব্যবহার করুন। এই জাতীয় তথ্য পুনরুদ্ধারে আপনাকে সহায়তা করার জন্য কারেন্ট অ্যাডমিন ইনফো নামে একটি দুর্দান্ত প্লাগইন এখানে রয়েছে
কায়সার

1
@ কাইজার, আমার উদ্দেশ্য এখানে অজাক্সের জন্য হার্টবিটকে ব্লক করা, সম্ভবত আমার কিছুটা DOING_AJAXচেক যুক্ত করা উচিত ... এবং আমি এটি বুঝতে পেরেছি, এজাক্সটির কোনও global $current_screen(ফিরে আসে get_current_screen()) নেই।
brasofilo

আহ, হতে পারে। এই মুহুর্তে ডান্নো। বিটিডব্লিউ, আছে wp_is_autosave()- নিশ্চিত নয় যে যদি সেগুলির কোনও ক্রিয়াকলাপের অ্যাকাউন্ট হয়।
কায়সার

আমি ভাবছি যদি add_filter( 'show_post_locked_dialog', '__return_false' );, ফাংশন থেকে _admin_notice_post_locked(), কোনও সাহায্য হয়?
বার্জায়ার

@ বিবিরগায়ার, না, কাজ হয়নি। আমি ভাবছি wp_ajax_heartbeat()চেইন load-$hook-> ব্যবহার করে থামানো সম্ভব হবে না (wp-admin / / / ajax-steps.php) get_current_something()। । । । । এছাড়াও, যে ফাংশন 3 আঙ্গুলসমূহ, কিন্তু আমি তাদের ব্যবহার বীট বন্ধ করতে পারবে না করছি (এবং তারা আছে $screen_id, যা পোস্টের প্রকারের সাথে মেলে।
brasofilo

3

এখানে চূড়ান্ত সমাধানটি আমার পক্ষে কাজ করে। :

function my_remove_post_locked() {
    $current_post_type = get_current_screen()->post_type;   

    // Disable locking for page, post and some custom post type
    $post_types_arr = array(
        'page',
        'post',
        'custom_post_type'
    );

    if(in_array($current_post_type, $post_types_arr)) {
        add_filter( 'show_post_locked_dialog', '__return_false' );
        add_filter( 'wp_check_post_lock_window', '__return_false' );
        wp_deregister_script('heartbeat');
    }
}

add_action('load-edit.php', 'my_remove_post_locked');
add_action('load-post.php', 'my_remove_post_locked');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.