web-dev-qa-db-ja.com

"Post Lock/Edit Lock"を無効にするには?

他のユーザーが編集している場合は問題にならないので、1つの投稿タイプについてのみこれを無効にします(メインのコンテンツ編集領域はAjaxifiedで、管理者以外には表示されます)。

enter image description here

コア機能を調べましたが、エントリポイントが見つかりませんでした。 wp_set_post_lock 関数からget_post_metaを傍受しなければならないと思いますが、 official の方法はありますか?

そして 秒ロック はフィルタwp_check_post_lock_windowの影響を受けないようです( birgire で示されているように、ここでは回答にあります)。私はいろいろなところでremove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );を試してみましたが、remove_filterを尊重することなく打ち続けています。

enter image description here

15
brasofilo

@birgireanswerへの追加として…

調査結果

register_post_type() はポストタイプのサポートを登録することを可能にし、それは同様に add_post_type_support() を使って後で行うことができます。そしてそれは後でもっと強力な post_type_supports( $cpt, $feat ) を使ってチェックすることができます)。

新機能を追加した一般的なミニプラグイン

以下の(mu-)プラグインは、ポストロック機能を無効にする新しい種類のポストタイプのサポートをチェックします。 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ごとに1つのプラグイン

それから私達は私達の自身またはサードパーティのプラグインのポストタイプサポートを無効にするためにミニプラグインを簡単に追加することができます(ユーザーメタテーブルの帯域幅と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' );
} );

2番目のプラグインがアクティブになるとすぐに、beerpostタイプにはポストロックがなくなります。これはうまく機能するはずで、プラグイン管理画面から簡単に元に戻すことができます。

ハートビート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 );
        } );
    }
}
10
kaiser

edit-lock popupウィンドウを削除するには、次のようにします。

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...

そのため、if条件がfalseになるように$time_windowを変更することを考えています。

更新:

これを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()definedwp_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;
}
7
birgire

これが私のために働く最後の解決策です。 :

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');
3
Trubisha

私が使い終わった最後の組み合わせは

# 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でロードすることはお勧めできません。

3
brasofilo