Bagaimana cara menonaktifkan "Kunci Posting / Edit Kunci"?

16

Saya ingin menonaktifkan ini hanya untuk satu Jenis Posting, karena tidak terlalu penting jika ada pengguna lain yang mengeditnya (area pengeditan konten utama adalah Ajaxified dan non-admin hanya dapat melihatnya).

masukkan deskripsi gambar di sini

Saya melihat fungsi inti tetapi tidak dapat menemukan titik masuk. Dari fungsi wp_set_post_locksaya menduga bahwa saya harus mencegat get_post_meta, tetapi apakah ada cara resmi untuk melakukannya?

Dan ada kunci kedua yang tampaknya tidak terpengaruh oleh filter wp_check_post_lock_window( seperti yang ditunjukkan oleh birgire , di sini dalam Jawaban). Saya sudah mencoba remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );di berbagai titik tetapi terus berdetak tanpa rasa hormat remove_filter.

masukkan deskripsi gambar di sini

brasofilo
sumber
1
Saya telah menambahkan klarifikasi tentang motif, dan ini membawa solusi ke pikiran: menunjukkan konten ini kepada non-admin di layar lain. Tapi akan menyenangkan untuk mengetahui kait yang tepat untuk post_locktetap.
brasofilo

Jawaban:

10

Sebagai tambahan untuk jawaban @birgire ...

Temuan

register_post_type()memungkinkan untuk mendaftarkan dukungan tipe posting, yang juga dapat dilakukan kemudian saat menggunakanadd_post_type_support() . Dan itu bisa diperiksa melawan bahkan menggunakan semua perkasa post_type_supports( $cpt, $feat ).

Plugin mini umum yang menambahkan fitur baru

Sekarang plugin (mu-) berikut memeriksa jenis baru jenis dukungan pos yang menonaktifkan fitur kunci posting. Itu namanya 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' );
}

Satu plugin per CPT

Kemudian kita dapat dengan mudah menambahkan plugin mini untuk menonaktifkan dukungan tipe posting untuk plugin kita sendiri atau pihak ketiga (menghemat kita beberapa bandwidth dan ukuran DB dalam tabel meta pengguna):

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

Segera setelah plugin kedua diaktifkan, jenis kiriman bir kami tidak lagi memiliki kunci kiriman. Ini seharusnya bekerja dengan baik dan mudah dikembalikan melalui layar admin plugins.

Menonaktifkan API detak jantung

Memperluas plugin untuk menonaktifkan API beatbeat juga:

<?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 );
        } );
    }
}
kaisar
sumber
Ini adalah solusi yang benar-benar berkelas , bagaimana Anda menangani admin-ajax.phpbagian tersebut (Q diperbarui dan A ditambahkan)?
brasofilo
@brasofilo Saya menambahkan suntingan untuk menonaktifkan API Detak Jantung sepenuhnya. Tidak yakin bagaimana Anda ingin mengatasinya, tetapi Anda masih dapat menjalankan API detak jantung di plugin dengan menggunakan wp.heartbeat.start();JavaScript Anda.
kaiser
2
itu ide bagus menggunakan post_type_supportsuntuk menangani ini untuk setiap jenis posting kustom, saya berharap saya bisa memberi Anda lebih banyak upvotes ;-)
birgire
7

Untuk menghapus jendela sembulan edit-kunci , Anda dapat mencoba:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Saya tidak yakin apakah ini jalan yang harus ditempuh, tetapi saya memeriksa sumbernya wp_check_post_lock() dan di sana kami memiliki baris-baris ini:

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

jadi idenya adalah untuk mengubah $time_windowsehingga ifkondisi ini false.

Memperbarui:

Untuk menerapkan ini di edit.phplayar, dengan jenis pos khusus beermisalnya:

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

Dan kemudian kita dapat menambahkan:

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

untuk menghapusnya untuk post.phplayar juga.

Lebih banyak menggali ...

Fungsi _admin_notice_post_locked()ini didefinisikan tepat di bawah wp_set_post_lock()fungsi. Ini berisi garis-garis ini:

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

jadi kita juga dapat mencoba show_post_locked_dialogfilter:

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;
}
birgire
sumber
Bukankah lebih mudah untuk hanya menggunakan __return_false()sebagai cek pertama untuk $timehanya meringkas sebagai bool TRUE?
kaiser
ok mungkin, tapi aku tidak yakin bagaimana untuk mengatur $timeuntuk falsejadi aku pergi untuk $time_windowsebaliknya ...
birgire
3

Kombinasi terakhir yang saya gunakan berakhir adalah

# 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 );

tetapi jika ada yang punya pandangan lain, saya ingin sekali mendengarnya, karena saya tidak begitu memahami seluruh gambar filter yang tersedia.

Sebelumnya, menggunakan load-edit.php+ load-post.php, saya harus menghapus filter wp_refresh_post_lockdengan:

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

tetapi memuat di setiap admin_inittampaknya bukan ide yang baik.

brasofilo
sumber
Silakan gunakan get_current_screen()->post_typesebagai gantinya. Berikut ini adalah plugin yang bagus yang disebut Info Admin Saat Ini untuk membantu Anda mengambil informasi tersebut.
kaiser
1
@kaiser, maksud saya di sini adalah untuk memblokir detak jantung untuk Ajax, mungkin saya harus menambahkan beberapa DOING_AJAXcek ... Dan seperti yang saya pahami, Ajax tidak memiliki global $current_screen(dikembalikan oleh get_current_screen()).
brasofilo
Ah, mungkin. Tak tahu saat ini. Btw, ada wp_is_autosave()- tidak yakin apakah itu bertanggung jawab atas tindakan tersebut.
kaiser
Saya ingin tahu apakah add_filter( 'show_post_locked_dialog', '__return_false' );, dari fungsinya _admin_notice_post_locked(), apakah ada bantuan?
birgire
@Birgire, tidak, tidak bekerja. Saya pikir itu tidak mungkin untuk berhenti wp_ajax_heartbeat()(wp-admin / include / ajax-action.php) menggunakan rantai load-$hook-> get_current_something(). . . . . Juga, ada 3 kait dalam fungsi itu, tapi saya tidak bisa menghentikan ketukan menggunakan mereka (dan mereka punya $screen_id, yang cocok dengan jenis posting.
brasofilo
3

Inilah solusi terakhir yang cocok untuk saya. :

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