verificare se Gutenberg è attualmente in uso
Come posso verificare se l'editor attualmente in uso è Gutenberg in un plugin WordPress?
Ho bisogno di questo perché Gutenberg non ha post_submitbox_misc_actions
, quindi mi serve un fallback che verrà utilizzato solo se l'editor corrente è Gutenberg.

Funzioni/Metodi API Necessari:
Avrai bisogno del metodo WP_Screen::is_block_editor()
per verificare se ti trovi attualmente nell'Editor Gutenberg (da WordPress 5.0).
Inoltre, se installi Gutenberg come plugin separato, avrai a disposizione la funzione is_gutenberg_page()
per eseguire lo stesso controllo.
Quindi, per una soluzione completa, dovrai combinare questi due elementi.
Naturalmente, questo controllo deve essere eseguito dalle pagine del pannello di amministrazione e quando i dati interni sono pronti per chiamare la funzione. Quindi dovrai effettuare il controllo utilizzando un hook appropriato. Ad esempio, se provi a verificare questo utilizzando l'hook init
, non funzionerà.
Gutenberg stesso verifica la funzione is_gutenberg_page()
dalla funzione gutenberg_init()
, che viene caricata utilizzando l'hook replace_editor
. Quindi l'hook replace_editor
è un buon punto per eseguire questo controllo.
Tuttavia, suggerirei di utilizzare admin_enqueue_scripts
per effettuare il controllo, poiché:
admin_enqueue_scripts
è il primo hook che viene attivato dopo lo stesso controllois_gutenberg_page()
che Gutenberg esegue autonomamente.A causa della natura di Gutenberg, è più probabile che tu debba caricare script/stili esterni per il tuo scopo.
admin_enqueue_scripts
è un hook ben noto e viene attivato solo dalle pagine del pannello di amministrazione. Quindi il frontend non ne è influenzato.
Detto questo, se tutto ciò di cui hai bisogno è caricare alcuni script/stili, allora puoi utilizzare l'hook
enqueue_block_editor_assets
per gli asset dell'editor e l'hookenqueue_block_assets
per gli asset sia dell'editor che del frontend (da WordPress 5.0).Non fornisco il codice relativo qui poiché non era direttamente richiesto nella domanda, ma potrebbe essere sufficiente per la maggior parte degli scopi.
Soluzione:
Codice di esempio per il controllo Gutenberg
add_action( 'admin_enqueue_scripts', 'wpse_gutenberg_editor_action' );
function wpse_is_gutenberg_editor() {
if( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) {
return true;
}
$current_screen = get_current_screen();
if ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) {
return true;
}
return false;
}
function wpse_gutenberg_editor_action() {
if( wpse_is_gutenberg_editor() ) {
// il tuo codice relativo all'editor Gutenberg qui
}
else {
// questo non è Gutenberg.
// potrebbe non essere nemmeno un editor, devi verificare lo schermo se hai bisogno di controllare un altro editor.
}
}

Funziona solo con il plugin Gutenberg, non funziona in wp5 se il plugin non è installato

La funzione is_gutenberg_page
proviene dal plugin Gutenberg, mentre il metodo is_block_editor
è disponibile dalla versione 5.0. La funzione qui sotto combina entrambi in un'unica funzione di verifica.
Il codice seguente è tratto da Freemius SDK, riconoscimenti al loro team:
function is_gutenberg_page() {
if ( function_exists( 'is_gutenberg_page' ) &&
is_gutenberg_page()
) {
// Il plugin Gutenberg è attivo.
return true;
}
$current_screen = get_current_screen();
if ( method_exists( $current_screen, 'is_block_editor' ) &&
$current_screen->is_block_editor()
) {
// Pagina Gutenberg su 5+.
return true;
}
return false;
}

Gutenberg è stato integrato in WordPress 5.0 e ora puoi verificarlo utilizzando la funzione
use_block_editor_for_post
.if(use_block_editor_for_post($post)){ //L'editor a blocchi è attivo per questo articolo. }
In alternativa, quando crei un nuovo articolo puoi usare la funzione
use_block_editor_for_post_type
per verificare se Gutenberg è attivo per questo tipo di contenuto.if(use_block_editor_for_post_type($postType)){ //Gutenberg è attivo. }

La mia variazione era https://pastebin.com/Fv3gYdhp

has_blocks
è il metodo migliore per verificare il contenuto, ma nota anche che se vuoi solo controllare se nella sezione di amministrazione viene utilizzato l'editor a blocchi, puoi fare un controllo come questo (per gestire sia il nuovo editor a blocchi che il plugin Gutenberg):
if (is_admin()) {
global $current_screen;
if (!isset($current_screen)) {$current_screen = get_current_screen();}
if ( ( method_exists($current_screen, 'is_block_editor') && $current_screen->is_block_editor() )
|| ( function_exists('is_gutenberg_page')) && is_gutenberg_page() ) ) {
// FAI QUALCOSA QUI
}
}

È fantastico, ma non credo sia necessario chiamare global $current_screen
.

vero, tendo a scrivere gli esempi in questo modo perché non so in quale contesto verranno utilizzati - potrebbero rompersi facilmente a seconda del contesto... Ho appena aggiunto un ulteriore controllo is_admin e isset a questo scopo.

Nella versione attuale di WP (5.0.2) lo snippet sopra non funziona quando viene eseguito in una funzione collegata all'hook current_screen
perché is_block_editor
viene impostato più tardi. Funziona solo se viene eseguito in un momento successivo (ad esempio load-(page)
). Sembra un bug in WP.

L'oggetto WP_Screen
ora contiene una proprietà booleana per questo. Il seguente codice funziona per me:
if( ! function_exists( 'get_current_screen' ) ) {
return false;
}
$screen = get_current_screen();
$is_block_editor = $screen->is_block_editor;
Vedi https://developer.wordpress.org/reference/classes/wp_screen/is_block_editor/

Gutenberg 3.6 ha introdotto funzioni come has_blocks
e has_block
. Queste sostituiscono la funzione deprecata gutenberg_post_has_blocks
.
Se has_blocks
restituisce true, significa che Gutenberg è stato utilizzato durante la modifica del post.
Puoi utilizzare has_blocks()
senza parametri se la variabile globale $post
è già impostata (ad esempio in un ciclo di query) oppure verificare direttamente il contenuto del post con has_blocks( $content )

Qui ho condiviso la funzione personalizzata che puoi utilizzare per verificare se Gutenberg è abilitato o meno.
if ( is_gutenberg_enable() ) {
// Inserisci il tuo codice
}
Questa è la funzione personalizzata:
/**
* Verifica se Gutenberg è abilitato.
* Deve essere utilizzata non prima dell'azione plugins_loaded.
*
* @return bool
*/
function is_gutenberg_enable() {
$gutenberg = false;
$block_editor = false;
if ( has_filter( 'replace_editor', 'gutenberg_init' ) ) {
// Gutenberg è installato e attivato.
$gutenberg = true;
}
if ( version_compare( $GLOBALS['wp_version'], '5.0-beta', '>' ) ) {
// Editor a blocchi.
$block_editor = true;
}
if ( ! $gutenberg && ! $block_editor ) {
return false;
}
include_once ABSPATH . 'wp-admin/includes/plugin.php';
if ( ! is_plugin_active( 'classic-editor/classic-editor.php' ) ) {
return true;
}
$use_block_editor = ( get_option( 'classic-editor-replace' ) === 'no-replace' );
return $use_block_editor;
}

Questo è uno dei fork dello script kagg-design? Includere davvero il plugin.php di wp-admin è una buona idea?

È leggermente diverso. Come standard, dovremmo evitare il plugin.php ma in alcuni casi puoi usarlo se vuoi. Qui l'ho usato per il controllo del plugin.

Verifica se Gutenberg è attivo.
Non Chiamare la Classe if ( zwp_is_block_editor() ) {
Errore
if ( zwp_is_block_editor() ) {
class Auto_Save_Images_BLock_Editor
{
..............
}
new Auto_Save_Images_BLock_Editor();
}
OK
if ( ! zwp_is_block_editor() ) {
class Auto_Save_Images_Classic_Editor
{
..............
}
new Auto_Save_Images_Classic_Editor();
}
if ( ! function_exists( 'zwp_is_block_editor' ) ) {
function zwp_is_block_editor() {
// Ottiene l'oggetto schermo corrente
$screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
$is_block_editor = $screen ? $screen->is_block_editor() : false;
if ( $is_block_editor ) {
// Esegui qui le operazioni per l'editor a blocchi
return true;
} else {
// Esegui qui le operazioni per l'editor classico
return false;
}
}
}
