¿Cómo deshabilitar el "Bloqueo de publicación / Bloqueo de edición"?

13

Quiero deshabilitar esto solo para un tipo de publicación, ya que no importa si hay otro usuario que lo edite (el área de edición de contenido principal es Ajaxified y los usuarios que no son administradores solo pueden ver eso).

Observélasfuncionesbásicasperonopudeencontrarunpuntodeentrada.Delafunción wp_set_post_lock supongo que tendría que interceptar get_post_meta , pero ¿hay una forma oficial de hacerlo?

Y hay un segundo bloqueo que no hace parece que no está afectado por el filtro wp_check_post_lock_window ( como se muestra en birgire , aquí en una Respuesta). He intentado remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 ); en varios puntos pero sigue latiendo sin respetar remove_filter .

    
pregunta brasofilo 26.10.2013 - 16:22

4 respuestas

9

Como una adición a @birgire responde ...

Conclusiones

register_post_type() permite registrar un soporte de tipo de publicación, que también puede ser haga más tarde utilizando add_post_type_support() . Y eso puede verificarse incluso más tarde con el poderoso post_type_supports( $cpt, $feat ) .

Un mini complemento general que agrega una nueva función

Ahora, el siguiente complemento (mu-) comprueba un nuevo tipo de soporte de tipo de publicación que desactive la función de bloqueo de publicación. Se llama 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 complemento por CPT

Luego, podemos agregar fácilmente mini complementos para deshabilitar el soporte de tipo de publicación para los complementos propios o de terceros (lo que nos ahorra ancho de banda y tamaño de base de datos en la tabla meta del usuario):

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

Tan pronto como se active el segundo complemento, nuestro tipo de publicación beer no tendrá más bloqueo de publicación. Esto debería funcionar bien y se puede revertir fácilmente a través de la pantalla de administración de complementos.

Deshabilitando la API de heartbeat

Extendiendo el complemento para deshabilitar también la API de 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 );
        } );
    }
}
    
respondido por el kaiser 27.10.2013 - 05:16
7

Para eliminar la ventana emergente edit-lock , puedes intentar:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

No estoy seguro de si este es el camino a seguir, pero verifiqué la fuente de wp_check_post_lock() Y ahí tenemos estas líneas:

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

la idea es cambiar $time_window para que la condición if sea false .

Actualización:

Para aplicar esto en la pantalla edit.php , con el tipo de publicación personalizada beer por ejemplo:

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

Y luego podemos agregar:

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

para eliminarlo también en la pantalla post.php .

Más excavaciones ...

La función _admin_notice_post_locked() es definido justo debajo de la función wp_set_post_lock() . Contiene estas lineas:

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

por lo que también se puede probar el filtro 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;
}
    
respondido por el birgire 26.10.2013 - 18:34
3

La combinación final que he terminado de usar es

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

pero si alguien tiene otra opinión, me encantaría escucharla, ya que no estoy entendiendo la imagen completa de los filtros disponibles.

  

Anteriormente, utilizando load-edit.php + load-post.php , tuve que eliminar   el filtro wp_refresh_post_lock con:

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

pero cargar en cada admin_init no parece una buena idea.

    
respondido por el brasofilo 27.10.2013 - 08:36
3

Aquí está la solución final que funciona para 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');
    
respondido por el Trubisha 26.04.2015 - 17:23

Lea otras preguntas en las etiquetas