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

16

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

ingrese la descripción de la imagen aquí

Miré las funciones principales pero no pude encontrar un punto de entrada. Por la función, wp_set_post_locksupongo que tendría que interceptar get_post_meta, pero ¿hay alguna forma oficial de hacerlo?

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

ingrese la descripción de la imagen aquí

brasofilo
fuente
1
He agregado una aclaración sobre los motivos, y me trae una solución: mostrar este contenido a los no administradores en otra pantalla. Pero sería bueno saber un gancho adecuado para post_lockno obstante.
brasofilo

Respuestas:

10

Como complemento a la respuesta @birgire ...

Recomendaciones

register_post_type()permite registrar un soporte de tipo de publicación, que también se puede hacer más adelante usandoadd_post_type_support() . Y eso puede verificarse incluso más tarde usando el todo poderoso post_type_supports( $cpt, $feat ).

Un mini plugin general que agrega una nueva característica

Ahora el siguiente complemento (mu-) busca un nuevo tipo de soporte de tipo de publicación que deshabilite 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 nuestros complementos propios o de terceros (ahorrándonos algo de ancho de banda y tamaño de base de datos en la metatabla 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 de cerveza ya no tendrá más bloqueo de publicación. Esto debería funcionar bien y es fácilmente revertable a través de la pantalla de administración de complementos.

Deshabilitar la API de latidos

Extender 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 );
        } );
    }
}
emperador
fuente
Esta es una solución realmente elegante , ¿cómo manejaría la admin-ajax.phppieza (Q actualizado y A agregado)?
brasofilo
@brasofilo Agregué una edición para deshabilitar la API Heartbeat por completo. No estoy seguro de cómo quiere manejar eso, pero aún puede ejecutar la API heartbeat en complementos utilizando wp.heartbeat.start();su JavaScript.
kaiser
2
es una gran idea usar el post_type_supportspara manejar esto para cada tipo de publicación personalizada, desearía poder darle más votos a favor ;-)
birgire
7

Para eliminar la ventana emergente de bloqueo de edición , puede 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 wp_check_post_lock() y allí 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...

entonces la idea es cambiar, $time_windowentonces la ifcondición es false.

Actualizar:

Para aplicar esto en la edit.phppantalla, con el tipo de publicación personalizada, beerpor 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 para la post.phppantalla.

Más excavaciones ...

La función _admin_notice_post_locked()se define justo debajo de la wp_set_post_lock()función. Contiene estas líneas:

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

entonces uno también puede probar el show_post_locked_dialogfiltro:

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
fuente
¿No sería más fácil usarlo __return_false()como la primera verificación para $timeresumirlo como a bool TRUE?
kaiser
bien quizás, pero no estoy seguro de cómo configurar $timede falsemodo que fui a $time_windowsu lugar ...
birgire
3

La combinación final que terminé 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 saberlo, ya que realmente no entiendo la imagen completa de los filtros disponibles.

Anteriormente, usando load-edit.php+ load-post.php, tenía que eliminar el filtro wp_refresh_post_lockcon:

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 uno admin_initno parece una buena idea.

brasofilo
fuente
Por favor, use get_current_screen()->post_typeen su lugar. Aquí hay un buen complemento llamado Current Admin Info para ayudarlo a recuperar dicha información.
kaiser
1
@kaiser, mi intención aquí es bloquear los latidos del corazón de Ajax, tal vez debería agregar algún DOING_AJAXcheque ... Y como lo entiendo, Ajax no tiene global $current_screen(devuelto por get_current_screen()).
brasofilo
Ah, tal vez. No sé por el momento. Por cierto, no está wp_is_autosave()seguro de si eso tiene en cuenta cualquiera de esas acciones.
kaiser
Me pregunto si add_filter( 'show_post_locked_dialog', '__return_false' );, desde la función _admin_notice_post_locked(), ¿es de alguna ayuda?
Birgire
@ Birgire, no, no funcionó. Estoy pensando que no es posible detener wp_ajax_heartbeat()(wp-admin / includes / ajax-actions.php) usando la cadena load-$hook-> get_current_something(). . . . . Además, hay 3 ganchos en esa función, pero no puedo detener el ritmo al usarlos (y tienen $screen_id, que coincide con el tipo de publicación.
brasofilo
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');
Trubisha
fuente