Come disabilitare il “Blocco post / Modifica blocco”?


16

Voglio disabilitarlo solo per un tipo di post, in quanto non importa se c'è un altro utente che lo modifica (l'area di modifica del contenuto principale è Ajaxified e i non amministratori possono solo vederlo).

inserisci qui la descrizione dell'immagine

Ho esaminato le funzioni principali ma non sono riuscito a trovare un punto di accesso. Dalla funzione wp_set_post_locksto indovinando che dovrei intercettare il get_post_meta, ma c'è un modo ufficiale per farlo?

E c'è un secondo lucchetto che non sembra essere influenzato dal filtro wp_check_post_lock_window( come mostrato da Birgire , qui in una risposta). Ho provato remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );in vari punti, ma continua a battere senza rispetto remove_filter.

inserisci qui la descrizione dell'immagine


1
Ho aggiunto un chiarimento sui motivi e mi viene in mente una soluzione: mostrare questo contenuto ai non amministratori in un'altra schermata. Ma sarebbe bello conoscere comunque un vero gancio post_lock.
brasofilo,

Risposte:


10

In aggiunta alla risposta di @birgire ...

I risultati

register_post_type()consente di registrare un supporto per tipo di post, che può anche essere fatto in seguito utilizzandoadd_post_type_support() . E questo può essere verificato anche in seguito usando il tutto potentepost_type_supports( $cpt, $feat ) .

Un mini plug-in generale che aggiunge una nuova funzionalità

Ora il seguente plug-in (mu-) verifica la presenza di un nuovo tipo di supporto di tipo post che disabilita la funzione di blocco post. Si chiama 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 per CPT

Quindi possiamo facilmente aggiungere mini plug-in per disabilitare il supporto del tipo di post per i nostri plug-in propri o di terze parti (salvandoci un po 'di larghezza di banda e dimensioni del DB nella meta tabella dell'utente):

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

Non appena il secondo plugin viene attivato la nostra birra tipo di post non ha più blocco post. Questo dovrebbe funzionare bene ed è facilmente riverificabile attraverso la schermata di amministrazione dei plugin.

Disabilitazione dell'API heartbeat

Estensione del plug-in per disabilitare anche 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 );
        } );
    }
}

Questa è una soluzione davvero di classe , come gestiresti la admin-ajax.phpparte (Q aggiornata e A aggiunta)?
brasofilo,

@brasofilo Ho aggiunto una modifica per disabilitare completamente l'API Heartbeat. Non sei sicuro di come gestirlo, ma puoi comunque eseguire l'API heartbeat nei plugin utilizzando wp.heartbeat.start();JavaScript.
Kaiser

2
è una buona idea usare il post_type_supportsper gestire questo per ogni tipo di post personalizzato, vorrei poterti dare più voti ;-)
birgire

7

Per rimuovere la finestra popup di blocco della modifica , puoi provare:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Non sono sicuro che questa sia la strada da percorrere, ma ho controllato la fonte di wp_check_post_lock() e lì abbiamo queste righe:

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

quindi l'idea è di cambiare $time_windowcosì la ifcondizione è false.

Aggiornare:

Per applicarlo sullo edit.phpschermo, beerad esempio con il tipo di post personalizzato :

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 quindi possiamo aggiungere:

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

per rimuoverlo anche per lo post.phpschermo.

Più scavo ...

La funzione _admin_notice_post_locked()è definita appena sotto la wp_set_post_lock()funzione. Contiene queste righe:

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

quindi si può anche provare il 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;
}

Non sarebbe più semplice da usare __return_false()invece come primo controllo per $timeriassumere come bool TRUE?
Kaiser

ok forse, ma non sono sicuro di come impostare $timea falsecosì sono andato per il $time_windowposto ...
birgire

3

La combinazione finale che ho finito di usare è

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

ma se qualcuno ha un altro approccio, mi piacerebbe sentirlo, dato che non capisco davvero l'intera immagine dei filtri disponibili.

In precedenza, usando load-edit.php+ load-post.php, dovevo rimuovere il 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 );
});

ma caricare ad ogni admin_initnon sembra una buona idea.


Si prega di utilizzare get_current_screen()->post_typeinvece. Ecco un bel plugin chiamato Current Admin Info per aiutarti a recuperare tali informazioni.
Kaiser

1
@kaiser, la mia intenzione qui è quella di bloccare il battito cardiaco per Ajax, forse dovrei aggiungerne un po ' DOING_AJAX controllo ... E a quanto ho capito, Ajax non ha global $current_screen(restituito da get_current_screen()).
brasofilo,

Ah, forse Non so al momento. A proposito, non c'è wp_is_autosave()- non sono sicuro che ciò spieghi una di quelle azioni.
Kaiser

mi chiedo se add_filter( 'show_post_locked_dialog', '__return_false' ); , dalla funzione _admin_notice_post_locked(), sia di qualche aiuto?
birgire,

@birgire, no, non ha funzionato. Sto pensando che non è possibile interrompere wp_ajax_heartbeat()(wp-admin / Includes / ajax-actions.php) usando la catena load-$hook-> get_current_something(). . . . . Inoltre, ci sono 3 hook in quella funzione, ma non riesco a fermare il ritmo usandoli (e hanno $screen_id, che corrisponde al tipo di post.
brasofilo,

3

Ecco la soluzione finale che funziona per me. :

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');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.