Comment désactiver le “Verrouillage / Verrouillage”?

13

Je souhaite désactiver cette option uniquement pour un type de publication, car cela n'a pas vraiment d'importance si un autre utilisateur le modifie (la zone d'édition principale du contenu est Ajaxified et les non-administrateurs ne peuvent que le voir).

J'aiexaminélesfonctionsprincipalesmaisjen'aipastrouvédepointd'entrée.Àpartirdelafonction wp_set_post_lock , je suppose que je devrais intercepter get_post_meta , mais y at-il une manière officielle de le faire?

Et il existe un deuxième verrou qui ne le fait pas. 'ne semble pas être affecté par le filtre wp_check_post_lock_window ( comme indiqué par birgire , ici dans une réponse). J'ai essayé remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 ); à divers moments, mais cela continue de battre sans respecter remove_filter .

    
posée brasofilo 26.10.2013 - 16:22

4 réponses

9

En complément de la @birgire réponse…

Constatations

register_post_type() permet d’enregistrer un support de type publication, qui peut aussi bien être à quitter ultérieurement à l'aide de add_post_type_support() . Et cela peut être vérifié encore plus tard en utilisant le tout puissant post_type_supports( $cpt, $feat ) .

Un mini plugin général qui ajoute une nouvelle fonctionnalité

Le plug-in (mu-) suivant recherche un nouveau type de prise en charge du type de publication qui désactive la fonctionnalité de post-verrouillage. Il s'appelle 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' );
}

Un plugin par CPT

Ensuite, nous pouvons facilement ajouter des mini-plugins pour désactiver la prise en charge du type de post pour nos propres plugins ou des plugins tiers (nous permettant d'économiser de la bande passante et la taille de la base de données dans le méta-tableau de l'utilisateur):

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

Dès que le second plug-in est activé, notre type de publication Bière n'a plus de verrou de publication. Cela devrait fonctionner correctement et est facilement réversible via l'écran d'administration des plugins.

Désactivation de l'API Heartbeat

Extension du plug-in pour désactiver également l'API Hearbeat:

<?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 );
        } );
    }
}
    
réponse donnée kaiser 27.10.2013 - 05:16
7

Pour supprimer la fenêtre contextuelle edit-lock , vous pouvez essayer:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Je ne sais pas si c'est la voie à suivre, mais j'ai vérifié la source de wp_check_post_lock() et là nous avons ces lignes:

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

donc l'idée est de changer $time_window pour que la condition if soit false .

Mise à jour:

Pour appliquer cela sur l'écran edit.php , avec le type de message personnalisé beer , par exemple:

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

Ensuite, nous pouvons ajouter:

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

pour le supprimer également pour l'écran post.php .

Encore plus de recherches ...

La fonction _admin_notice_post_locked() est définie juste en dessous de la fonction wp_set_post_lock() . Il contient les lignes suivantes:

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

donc on peut aussi essayer le filtre 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;
}
    
réponse donnée birgire 26.10.2013 - 18:34
3

La combinaison finale que j'ai terminée avec est

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

mais si quelqu'un en a une autre, j'aimerais bien l'entendre, car je ne comprends pas vraiment le tableau complet des filtres disponibles.

  

Auparavant, avec load-edit.php + load-post.php , je devais supprimer   le filtre wp_refresh_post_lock avec:

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

mais charger à chaque admin_init ne semble pas une bonne idée.

    
réponse donnée brasofilo 27.10.2013 - 08:36
3

Voici la solution finale qui fonctionne pour moi. :

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');
    
réponse donnée Trubisha 26.04.2015 - 17:23

Lire d'autres questions sur les étiquettes