Wie deaktiviere ich die Nachsperre / Bearbeitungssperre?

16

Ich möchte dies nur für einen Beitragstyp deaktivieren, da es nicht wirklich wichtig ist, ob es einen anderen Benutzer gibt, der ihn bearbeitet.

Bildbeschreibung hier eingeben

Ich habe mir die Kernfunktionen angesehen, aber keinen Einstiegspunkt gefunden. Aus der Funktion wp_set_post_lockschätze ich, dass ich das abfangen müsste get_post_meta, aber gibt es eine offizielle Möglichkeit, dies zu tun?

Und es gibt eine zweite Sperre , die von dem Filter nicht betroffen zu sein scheint wp_check_post_lock_window( wie von birgire hier in einer Antwort gezeigt). Ich habe es remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );an verschiedenen Stellen versucht, aber es schlägt weiter, ohne es zu respektieren remove_filter.

Bildbeschreibung hier eingeben

Brasofilo
quelle
1
Ich habe eine Erläuterung zu den Motiven hinzugefügt, die eine Lösung in den Sinn bringt: Nichtadministratoren können diesen Inhalt auf einem anderen Bildschirm anzeigen. Wäre aber trotzdem nett, einen richtigen Haken zu kennen post_lock.
Brasofilo

Antworten:

10

Als Ergänzung zu @birgire Antwort ...

Ergebnisse

register_post_type()Ermöglicht die Registrierung eines Beitragstyp-Supports, der auch später über ausgeführt werden kannadd_post_type_support() . Und das lässt sich auch später noch mit den Allmächtigen überprüfenpost_type_supports( $cpt, $feat ) .

Ein allgemeines Mini-Plugin, das eine neue Funktion hinzufügt

Das folgende (Mu-) Plugin sucht nun nach einer neuen Art von Post-Type-Unterstützung, die die Post-Lock-Funktion deaktiviert. Es heißt 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' );
}

Ein Plugin pro CPT

Dann können wir ganz einfach Mini-Plugins hinzufügen, um die Post-Type-Unterstützung für unsere eigenen Plugins oder für Plugins von Drittanbietern zu deaktivieren (was uns Bandbreite und DB-Größe in der Benutzer-Metatabelle spart):

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

Sobald das zweite Plugin aktiviert ist, hat unser Bierposttyp keine Post-Sperre mehr. Dies sollte gut funktionieren und kann über den Admin-Bildschirm des Plugins leicht rückgängig gemacht werden.

Deaktivieren der Heartbeat-API

Das Plugin erweitern, um die Hearbeat-API ebenfalls zu deaktivieren:

<?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 );
        } );
    }
}
Kaiser
quelle
Dies ist eine wirklich erstklassige Lösung. Wie würden Sie mit dem admin-ajax.phpTeil umgehen (Q aktualisiert und A hinzugefügt)?
Brasofilo
@brasofilo Ich habe eine Bearbeitung hinzugefügt, um die Heartbeat-API vollständig zu deaktivieren. Ich bin mir nicht sicher, wie ich damit umgehen soll, aber Sie können die Heartbeat-API in Plug-ins mithilfe von wp.heartbeat.start();JavaScript ausführen .
Kaiser
2
Es ist eine großartige Idee, post_type_supportsdies für jeden benutzerdefinierten Post-Typ zu handhaben. Ich wünschte, ich könnte Ihnen mehr Upvotes geben ;-)
birgire
7

Versuchen Sie Folgendes, um das Popup-Fenster mit der Bearbeitungssperre zu entfernen :

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Ich bin mir nicht sicher, ob dies der richtige Weg ist, aber ich habe die Quelle von überprüft wp_check_post_lock() und dort haben wir die folgenden Zeilen:

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

Die Idee ist also, sich $time_windowso zu ändern, wie es der ifZustand ist false.

Aktualisieren:

So wenden Sie dies auf dem edit.phpBildschirm an, beerz. B. mit dem benutzerdefinierten Beitragstyp :

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

Und dann können wir hinzufügen:

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

um es auch für den post.phpBildschirm zu entfernen .

Mehr Graben ...

Die Funktion _admin_notice_post_locked()wird definiert knapp unterhalb der wp_set_post_lock()Funktion. Es enthält folgende Zeilen:

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

so kann man auch den show_post_locked_dialogfilter ausprobieren :

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
quelle
Wäre es nicht einfacher, __return_false()stattdessen nur den ersten Check zu verwenden, um die $timeSumme als zu betrachten bool TRUE?
Kaiser
ok vielleicht, aber ich bin mir nicht sicher, wie ich es einstellen soll $time, falsealso habe ich mich für $time_window... entschieden
birgire
3

Die letzte Kombination, mit der ich aufgehört habe, ist

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

aber wenn jemand eine andere Einstellung hat, würde ich gerne hören, da ich nicht wirklich das ganze Bild der verfügbaren Filter verstehe.

Bisher musste ich mit load-edit.php+ load-post.phpden Filter entfernen wp_refresh_post_lockmit:

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

Aber das Laden bei jedem admin_initscheint keine gute Idee zu sein.

Brasofilo
quelle
Bitte verwenden Sie get_current_screen()->post_typestattdessen. Hier ist ein nettes Plugin namens Current Admin Info , das Sie beim Abrufen solcher Informationen unterstützt.
Kaiser
1
@kaiser, meine Absicht hier ist es, den Herzschlag für Ajax zu blockieren, vielleicht sollte ich ein paar DOING_AJAXChecks hinzufügen ... Und wie ich es verstehe, hat Ajax keine global $current_screen(zurückgegeben von get_current_screen()).
Brasofilo
Ah, vielleicht. Keine Ahnung im Moment. Übrigens wp_is_autosave()- ich bin mir nicht sicher, ob das für eine dieser Aktionen verantwortlich ist.
Kaiser
Ich frage mich, ob add_filter( 'show_post_locked_dialog', '__return_false' );von der Funktion _admin_notice_post_locked()eine Hilfe ist?
Birgire
@ Birgire, nein, hat nicht funktioniert. Ich denke, das ist nicht möglich wp_ajax_heartbeat()(wp-admin / includes / ajax-actions.php) mit der Kette zu stoppen load-$hook-> get_current_something(). . . . . Es gibt auch 3 Hooks in dieser Funktion, aber ich bin nicht in der Lage, den Beat zu stoppen, indem ich sie benutze (und sie haben $screen_id, was dem Post-Typ entspricht.
Brasofilo
3

Hier ist die endgültige Lösung, die für mich funktioniert. :

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
quelle