Como desabilitar o “Bloqueio de Postagem / Bloqueio de Edição”?

13

Eu quero desabilitar isso apenas para um Post Type, já que realmente não importa se há outro usuário editando-o (a área principal de edição de conteúdo é Ajaxified e os não administradores só podem ver isso).

Euolheiparaasfunçõesprincipais,masnãoconseguiencontrarumpontodeentrada.Dafunção wp_set_post_lock Acredito que eu teria que interceptar o get_post_meta , mas existe uma maneira oficial de fazê-lo?

E há um segundo bloqueio que não parece ser afetado pelo filtro wp_check_post_lock_window ( como mostrado por birgire , aqui em uma resposta). Eu tentei remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 ); em vários pontos, mas continua batendo sem respeitar remove_filter .

    
por brasofilo 26.10.2013 / 16:22

4 respostas

9

Como complemento da resposta @birgire

Resultados

register_post_type() permite registrar um suporte de tipo de postagem, que também pode ser dado mais tarde usando add_post_type_support() . E isso pode ser verificado até mesmo depois usando o todo poderoso post_type_supports( $cpt, $feat ) .

Um mini plugin geral que adiciona um novo recurso

Agora, o seguinte plugin (mu-) verifica um novo tipo de suporte de tipo de postagem que desabilita o recurso de bloqueio de postagem. Tem o nome 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' );
}

Um plugin por CPT

Em seguida, podemos adicionar facilmente mini-plug-ins para desativar o suporte de tipo de postagem para nossos plug-ins próprios ou de terceiros (economizando um pouco de largura de banda e tamanho de banco de dados na tabela meta do usuário):

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

Assim que o segundo plug-in é ativado, o tipo de postagem cerveja não tem mais bloqueio de postagem. Isso deve funcionar bem e é facilmente revertível através da tela de administração de plugins.

Desativando a API de pulsação

Estendendo o plug-in para desativar também a 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 );
        } );
    }
}
    
por kaiser 27.10.2013 / 05:16
7

Para remover a janela pop-up edit-lock , você pode tentar:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Não tenho certeza se esse é o caminho certo, mas verifiquei a origem de wp_check_post_lock() e lá temos estas linhas:

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

então a ideia é alterar $time_window , então a condição if é false .

Atualização:

Para aplicar isso na tela edit.php , com o tipo de postagem personalizado beer , por exemplo:

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

E então podemos adicionar:

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

para removê-lo também para a tela post.php .

Mais escavações ...

A função _admin_notice_post_locked() é definida logo abaixo da função wp_set_post_lock() . Ele contém estas linhas:

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

para que um também possa experimentar o 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;
}
    
por birgire 26.10.2013 / 18:34
3

A combinação final que acabei de usar é

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

mas se alguém tiver outra ideia, adoraria ouvir, pois não estou realmente compreendendo toda a imagem dos filtros disponíveis.

  

Anteriormente, usando load-edit.php + load-post.php , tive de remover   o filtro wp_refresh_post_lock com:

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

mas o carregamento a cada admin_init não parece ser uma boa ideia.

    
por brasofilo 27.10.2013 / 08:36
3

Aqui está a solução final que funciona para mim. :

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');
    
por Trubisha 26.04.2015 / 17:23