「Post Lock / Edit Lock」を無効にする方法は?


16

これを無効にするのは、1つの投稿タイプに対してだけです。他のユーザーが編集している場合、それは実際には問題になりません(メインのコンテンツ編集エリアはAjaxifiedであり、管理者以外はそれしか見ることができません)

ここに画像の説明を入力してください

コア機能を調べましたが、エントリポイントが見つかりませんでした。関数から、wp_set_post_lockを傍受する必要があると推測してget_post_metaいますが、それを行う公式の方法はありますか?

そして、フィルターの影響を受けていないように見える2番目のロックがありますwp_check_post_lock_window(これは回答のbirgire示されています)。私はremove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );いろいろなポイントで試しましたが、それは尊重せずに暴行し続けますremove_filter

ここに画像の説明を入力してください


1
動機に関する説明を追加しました。これにより、解決策が思い浮かびます。このコンテンツを非管理者に別の画面で表示できます。しかし、post_lockそれでも適切なフックを知っておくといいでしょう。
ブラソフィロ

回答:


10

@birgireの答えに加えて…

調査結果

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番目のプラグインがアクティブになるとすぐに、ビールポストタイプにはポストロックがなくなります。これはうまくいくはずで、プラグイン管理画面から簡単に元に戻すことができます。

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

これは本当に上品なソリューションですが、admin-ajax.phpパーツをどのように処理しますか(Q更新およびA追加)?
ブラソフィロ

@brasofilo Heartbeat APIを完全に無効にする編集を追加しました。どのようにそれを処理したいかはわかりませんwp.heartbeat.start();が、JavaScript を使用してプラグインでハートビートAPIを実行できます。
カイザー

2
post_type_supportsカスタムポストタイプごとにこれを処理するためにを使用することをお勧めします。より多くの賛成票を差し上げたいと思います;-)
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_windowif条件が変わるように変更することです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
カイザー

[OK]を、多分、私は確かに設定する方法はないよ$timefalse私が行ってきましたので$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
@kaiserは、ここに私の意図は、多分私はいくつか追加する必要があり、AjaxのためのハートビートをブロックすることはありませんDOING_AJAXチェックを...そして私はそれを理解し、アヤックスは何を持っているglobal $current_screen(で返されますget_current_screen())。
ブラソフィロ

ああ、多分。現時点ではダンノ。ところで、ありますwp_is_autosave()-これらのアクションのいずれかに説明があるかどうかはわかりません。
カイザー

かしらadd_filter( 'show_post_locked_dialog', '__return_false' );関数から、_admin_notice_post_locked()任意の助けのでしょうか?
処女

@birgire、いや、うまくいきませんでした。wp_ajax_heartbeat()チェーンload-$hook-> を使用して停止することは不可能だと考えています(wp-admin / includes / ajax-actions.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.