如何禁用“后锁定/编辑锁定”?

时间:2013-10-26 作者:brasofilo

我只想对一种帖子类型禁用它,因为如果有其他用户编辑它,这并不重要(主要内容编辑区域是Ajaxified的,非管理员只能看到)。

enter image description here

我查看了核心函数,但找不到入口点。从函数wp_set_post_lock 我想我必须拦截get_post_meta, 但是,有没有一种官方的方法可以做到这一点?

还有一个second lock 这似乎不受过滤器的影响wp_check_post_lock_window (as shown by birgire, 这里是答案)。我试过了remove_filter( \'heartbeat_received\', \'wp_refresh_post_lock\', 10, 3 ); 在不同的点上,但它不尊重remove_filter.

enter image description here

4 个回复
SO网友:kaiser

作为对@birgire 回答(&hellip);

调查结果

register_post_type() 允许注册post类型支持,也可以done later on using add_post_type_support(). 甚至可以在以后使用全能post_type_supports( $cpt, $feat ).

一个添加新功能的通用迷你插件现在,下面的(mu)插件将检查一种新的post类型支持,该支持将禁用post锁功能。它的名字是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\' );
}
每个CPT一个插件,然后我们可以轻松添加迷你插件来禁用对我们自己或第三方插件的post类型支持(为我们节省一些带宽和用户元表中的DB大小):

<?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\' );
} );
一旦第二个插件被激活beer post类型没有更多的post锁。这应该可以很好地工作,并且可以通过插件管理屏幕轻松恢复。

禁用心跳API扩展插件以禁用hearbeat API:

<?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 );
        } );
    }
}

SO网友:birgire

要删除“编辑锁定”弹出窗口,可以尝试:

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()defined 就在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;
}

SO网友:brasofilo

我最后使用的组合是

# 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 这似乎不是个好主意。

SO网友:Trubisha

以下是对我有效的最终解决方案:

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\');

结束