Como desativar o "Bloqueio de publicação / edição de bloqueio"?

16

Quero desabilitar isso apenas para um Tipo de postagem, pois realmente não importa se houver outro usuário editando (a área principal de edição de conteúdo é Ajaxified e não administradores podem ver apenas isso).

insira a descrição da imagem aqui

Eu olhei para as funções principais, mas não consegui encontrar um ponto de entrada. Pela função wp_set_post_lock, acho que teria que interceptar o arquivo get_post_meta, mas existe uma maneira oficial de fazer isso?

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.

insira a descrição da imagem aqui

brasofilo
fonte
1
Adicionei um esclarecimento sobre os motivos, e isso traz uma solução: mostrar esse conteúdo para não administradores em outra tela. Mas seria bom saber um gancho adequado para, post_lockno entanto.
Brasofilo 26/10/2013

Respostas:

10

Como complemento à resposta @birgire

Constatações

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

Um mini plug-in geral que adiciona um novo recurso

Agora, o seguinte (mu-) plugin verifica um novo tipo de suporte ao tipo de postagem que desativa o recurso de bloqueio de postagem. É nomeado 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 plug-in por CPT

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

<?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, nosso tipo de publicação de cerveja não tem mais bloqueio de publicação. Isso deve funcionar bem e é facilmente revertível através da tela de administração de plug-ins.

Desativando a API de pulsação

Estendendo o plug-in para desativar também a API do 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 );
        } );
    }
}
kaiser
fonte
Esta é uma solução realmente elegante , como você lidaria com a admin-ajax.phppeça (atualização Q e adição de A)?
Brasofilo 27/10/2013
@brasofilo Adicionei uma edição para desativar completamente a API do Heartbeat. Não sabe ao certo como deseja lidar com isso, mas você ainda pode executar a API de pulsação nos plug-ins usando wp.heartbeat.start();seu JavaScript.
Kaiser #
2
é ótima idéia usar o post_type_supportsde lidar com isso para cada tipo de pós personalizado, eu gostaria de poder lhe dar mais upvotes ;-)
birgire
7

Para remover a janela pop - up de edição-bloqueio , você pode tentar:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Não tenho certeza se esse é o caminho a seguir, mas verifiquei a fonte wp_check_post_lock() e temos as seguintes 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 idéia é mudar $time_windowpara que a ifcondição seja false.

Atualizar:

Para aplicar isso na edit.phptela, com o tipo de postagem personalizada, beerpor 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 post.phptela.

Mais escavação ...

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

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

então também se pode tentar o 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
fonte
Não seria mais fácil usar apenas __return_false()como a primeira verificação para $timeresumir apenas como bool TRUE?
Kaiser #
ok, talvez, mas não tenho certeza de como definir $timea falseentão eu fui para $time_windowem vez disso ...
birgire
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 opinião, eu adoraria ouvir, pois não estou realmente entendendo toda a imagem dos filtros disponíveis.

Anteriormente, usando load-edit.php+ load-post.php, eu tinha que remover o filtro wp_refresh_post_lockcom:

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 carregar em todos os admin_initlugares não parece uma boa ideia.

brasofilo
fonte
Por favor, use em seu get_current_screen()->post_typelugar. Aqui está um bom plug-in chamado Informações do administrador atual para ajudá-lo a recuperar essas informações.
Kaiser #
1
@kaiser, minha intenção aqui é bloquear o batimento cardíaco do Ajax, talvez eu deva adicionar um DOING_AJAXcheque ... E pelo que entendi, o Ajax não tem global $current_screen(retornado por get_current_screen()).
Brasofilo 27/10
Ah, talvez. Não sei no momento. Aliás, não há wp_is_autosave()certeza se isso é responsável por alguma dessas ações.
Kaiser #
Gostaria de saber se add_filter( 'show_post_locked_dialog', '__return_false' );, a partir da função _admin_notice_post_locked(), é de alguma ajuda?
birgire
@ Birgire, não, não funcionou. Eu estou pensando que não é possível parar wp_ajax_heartbeat()(wp-admin / includes / ajax-actions.php) usando a cadeia load-$hook-> get_current_something(). . . . . Além disso, existem 3 ganchos em que função, mas eu não vou ser capaz de parar a batida de usá-los (e eles têm $screen_id, o que corresponde ao tipo post.
brasofilo
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');
Trubisha
fonte