"पोस्ट लॉक / एडिट लॉक" को कैसे निष्क्रिय करें?


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फिर भी एक उचित हुक जानना अच्छा होगा ।
ब्रासोफिलो

जवाबों:


10

@ उत्तर के अतिरिक्त …

जाँच - परिणाम

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 I ने हार्टबीट एपीआई को पूरी तरह से निष्क्रिय करने के लिए एक एड किया। सुनिश्चित नहीं है कि आप इसे कैसे संभालना चाहते हैं, लेकिन आप अभी भी wp.heartbeat.start();अपने जावास्क्रिप्ट में उपयोग करके प्लगइन्स में दिल की धड़कन एपीआई चला सकते हैं ।
केसर

2
इसे का उपयोग बहुत अच्छा विचार है post_type_supportsप्रत्येक कस्टम पोस्ट प्रकार के लिए इस संभाल करने के लिए, काश मैं आप अधिक upvotes दे सकता है ;-)
birgire

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()लिए पहली जाँच के रूप में उपयोग करने के लिए आसान नहीं होगा ? $timebool TRUE
kaiser

ठीक है, हो सकता है, लेकिन मुझे यकीन नहीं है कि कैसे सेट $timeकरने के लिए falseइसलिए मैं $time_windowइसके बजाय चला गया ...
बिरगीरे

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
@kaiser, यहाँ मेरा उद्देश्य अजाक्स के लिए दिल की धड़कन को अवरुद्ध करना है, हो सकता है कि मुझे कुछ DOING_AJAXजाँच जोड़नी चाहिए ... और जैसा कि मैं समझता हूँ, अजाक्स के पास कोई नहीं है global $current_screen(द्वारा लौटाया गया get_current_screen())।
ब्रासोफिलो

आह, हो सकता है। फिलहाल दुनो। Btw, वहाँ है wp_is_autosave()- यकीन है कि अगर उन कार्यों में से किसी के लिए खाता नहीं है।
kaiser

मुझे आश्चर्य है कि add_filter( 'show_post_locked_dialog', '__return_false' );, फ़ंक्शन से _admin_notice_post_locked(), किसी भी मदद की है?
बिरगीरे

@ प्रसव, नहीं, काम नहीं किया। मैं सोच रहा हूँ कि संभव बंद करने के लिए नहीं है wp_ajax_heartbeat()(WP-व्यवस्थापक / शामिल / ajax-actions.php) श्रृंखला का उपयोग कर load-$hook-> 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');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.