“Post Lock / Edit Lock” nasıl devre dışı bırakılır?


16

Bunu sadece bir Yazı Türü için devre dışı bırakmak istiyorum, çünkü başka bir kullanıcı düzenliyorsa gerçekten önemli değil (ana içerik düzenleme alanı Ajaxified ve yöneticiler sadece bunu görebilir).

resim açıklamasını buraya girin

Temel işlevlere baktım ama bir giriş noktası bulamadım. İşlevinden wp_set_post_lockben müdahale etmesi gerekir olduğunu tahmin ediyorum get_post_meta, ama bir orada resmi Bunu yapmanın yolu?

Ve filtreden etkilenmemiş gibi görünen ikinci bir kilit var wp_check_post_lock_window( burada Birgire tarafından gösterildiği gibi, bir Yanıtta ). Ben remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );çeşitli noktalarda denedim ama saygı olmadan dayak devam ediyor remove_filter.

resim açıklamasını buraya girin


1
Güdüler hakkında bir açıklama ekledim ve akla bir çözüm getiriyor: bu içeriği başka bir ekranda yönetici olmayanlara göstermek. Ancak post_lockyine de uygun bir kanca bilmek güzel olurdu .
brasofilo

Yanıtlar:


10

@Birgire yanıtına ek olarak …

Bulgular

register_post_type()daha sonraadd_post_type_support() kullanımda yapılabilecek bir yazı tipi desteğinin kaydedilmesine izin verir . Ve bu daha sonra bile tüm kudretli kullanarak kontrol edilebilir post_type_supports( $cpt, $feat ).

Yeni bir özellik ekleyen genel bir mini eklenti

Şimdi aşağıdaki (mu-) eklentisi, post lock özelliğini devre dışı bırakan yeni bir yazı tipi desteği türünü denetler. Adı 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 başına bir eklenti

Ardından, kendi veya üçüncü taraf eklentilerimiz için yazı tipi desteğini devre dışı bırakmak için kolayca mini eklentiler ekleyebiliriz (kullanıcı meta tablosunda bize bazı bant genişliği ve DB boyutu tasarrufu):

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

İkinci eklenti etkinleştirilir etkinleştirilmez bira direği tipimizde artık kilit yok. Bu iyi çalışmalı ve eklenti yönetici ekranından kolayca geri döndürülebilir.

Kalp atışı API'sını devre dışı bırakma

Hearbeat API'sını da devre dışı bırakmak için eklentiyi genişletme:

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

Bu gerçekten şık bir çözüm, admin-ajax.phpparçayı nasıl ele alırsınız (Q güncellendi ve A eklendi)?
brasofilo

@brasofilo Heartbeat API'sını tamamen devre dışı bırakmak için bir düzenleme ekledim. Bunu nasıl ele almak istediğinizden emin değilsiniz, ancak wp.heartbeat.start();JavaScript'inizi kullanarak kalp atışı API'sını eklentilerde çalıştırabilirsiniz .
kaiser

2
post_type_supportsHer özel yazı türü için bunu işlemek için harika bir fikir , keşke size daha fazla vekâlet verebilirim ;-)
birgire

7

Düzenleme kilidi açılır penceresini kaldırmak için şunları deneyebilirsiniz:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Bu yolun gidip gitmediğinden emin değilim, ama kaynağını kontrol ettim wp_check_post_lock() ve orada şu satırlar var:

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

fikir değişmek, $time_windowböylece ifdurum değişiyor false.

Güncelleme:

Bunu edit.phpekranda, beerörneğin özel yazı türüyle uygulamak için:

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

Ve sonra ekleyebiliriz:

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

post.phpekran için de kaldırmak için .

Daha fazla kazma ...

İşlev _admin_notice_post_locked(), işlevin hemen altında tanımlanırwp_set_post_lock() . Şu satırları içerir:

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

böylece show_post_locked_dialogfiltre de denenebilir :

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

Sadece bir özet olarak özetlemek __return_false()için kullanmak daha kolay olmaz mıydı ? $timebool TRUE
kaiser

Tamam belki, ama emin nasıl ayarlanacağı değilim $timeiçin falsene gittim bu yüzden $time_window... yerine
birgire

3

Kullanmayı bitirdiğim son kombinasyon

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

ancak başka birinin başka bir özelliği varsa, duymak isterim, çünkü mevcut filtrelerin resmini gerçekten anlamadım.

Daha önce load-edit.php+ kullanarak load-post.phpfiltreyi kaldırmak zorunda kaldım 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 );
});

ancak her admin_initşeye yüklemek iyi bir fikir gibi görünmüyor.


Lütfen get_current_screen()->post_typebunun yerine kullanın. İşte size bu tür bilgileri almanıza yardımcı olacak Güncel Yönetici Bilgisi adlı güzel bir eklenti .
kaiser

1
@kaiser, buradaki amacım Ajax'ın kalp atışlarını engellemek, belki biraz DOING_AJAXkontrol eklemeliyim ... Ve anladığım kadarıyla Ajax'ın global $current_screen(geri döndüğü get_current_screen()) yok.
brasofilo

Ah, belki. Şu anda Dunno. Btw, var wp_is_autosave()- bunun bu eylemlerden herhangi birine karşılık gelip gelmediğinden emin değilim.
kaiser

Acaba add_filter( 'show_post_locked_dialog', '__return_false' );, fonksiyondan _admin_notice_post_locked()herhangi bir yardımcı olup olmadığını?
birgire

@birgire, hayır, işe yaramadı. Ben wp_ajax_heartbeat()zinciri kullanarak durdurmak mümkün değil düşünüyorum (wp-admin / include / ajax-actions.php) load-$hook-> get_current_something(). . . . . Ayrıca, bu işlevde 3 kanca vardır, ancak bunları kullanarak ritmi durduramıyorum (ve bunlar $screen_id, yazı tipiyle eşleşen.
brasofilo

3

İşte benim için çalışan son çözüm. :

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');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.