È facile creare contenuti con i blocchi di Gutenberg, ma a volte bisogna controllare quali sono i blocchi disponibili. A volte si lavora sul sito di un cliente e si vuole impedire che questo usi determinati blocchi. Altre volte si può avere la necessità di semplificare l’esperienza di editing eliminando opzioni non necessarie.

In questa guida vedremo come disabilitare i blocchi di Gutenberg in diversi modi:

  • Usando l’interfaccia utente di WordPress per nascondere i blocchi nel pannello di inserimento.
  • Bloccando i blocchi per evitare che vengano spostati o eliminati
  • Applicando le restrizioni dei blocchi con PHP, ad esempio restringendo l’accesso in base ai ruoli

Detto questo, non tratteremo la visibilità dei blocchi (mostrare/nascondere il contenuto in base a delle condizioni) o la disattivazione di impostazioni specifiche dei blocchi come il testo o i colori di sfondo, che vengono gestiti tramite il file theme.json. Vedremo invece come bloccare i blocchi perché questo è strettamente legato alla disattivazione.

Tutti i metodi descritti in questa guida non richiedono plugin e sono applicabili a qualsiasi tema basato sui blocchi. Iniziamo!

Disabilitare i blocchi dall’interfaccia di WordPress

Rimuovendo i blocchi non necessari, si rende più fluida l’esperienza di editing e si migliorano leggermente le prestazioni del backend, perché i blocchi disabilitati non vengono caricati in memoria.

Ogni utente può disabilitare i blocchi dal menu Preferenze dell’editor dei blocchi. Vi si accede facendo clic sul pulsante Impostazioni (i tre punti ) nell’angolo in alto a destra. Quindi, nella scheda Blocchi, gli utenti possono deselezionare qualsiasi blocco per rimuoverlo dal pannello di inserimento dei blocchi.

Si può, ad esempio, disabilitare il blocco Citazione semplicemente deselezionando la casella corrispondente, come mostrato di seguito.

Blocco citazione disabilitato nelle Preferenze dei blocchi
Il modale delle Preferenze dei blocchi mostra il blocco Citazione come disabilitato.

Se si desidera andare oltre, si può disabilitare un’intera categoria di blocchi. Ad esempio, deselezionando la categoria Testo, vengono rimossi dal pannello di inserimento tutti i blocchi relativi al testo, in modo che non siano più disponibili per l’uso. Questo può essere utile per snellire l’editor e impedire agli utenti di accedere a blocchi non necessari.

Il modale delle Preferenze dei blocchi
Una vista del modale delle Preferenze dei blocchi mostra la categoria Testo disabilitata.

Disabilitare i blocchi con PHP

Per consentire o impedire l’utilizzo di un blocco con WordPress si possono seguire due approcci ben distinti. A seconda delle esigenze, si può scegliere se consentire o impedire che un blocco sia disponibile nel pannello di inserimento.

Entrambi gli approcci possono essere implementati utilizzando PHP o JavaScript. Le due soluzioni hanno ognuna i propri vantaggi e svantaggi. La soluzione basata su PHP è generalmente più semplice quando si vuole consentire l’inserimento di blocchi, mentre il metodo JavaScript è spesso più efficiente quando si tratta di negarne l’inserimento.

Nei nostri esempi utilizzeremo PHP per dimostrare i vari casi d’uso.

Consentire l’inserimento di blocchi

Per visualizzare nell’inseritore solo blocchi specifici, si può utilizzare il seguente filtro, utile per garantire che solo i blocchi stabiliti siano disponibili per tutti gli utenti:

add_filter('allowed_block_types_all', 'allowed_block_types_all_users', 10, 2 );

function allowed_block_types_all_users( $allowed_blocks, $block_editor_context ) {
    return array(
        'core/paragraph',
        'core/heading',
        'core/image',
        'core/cover',
        'core/list',
        'core/list-item'
    );
}

Questo codice va aggiunto al file functions.php di un child theme per evitare che le modifiche vengano perse quando il tema viene aggiornato.

Con questo metodo è necessario assicurarsi che siano inclusi tutti i blocchi child necessari. Ad esempio, se si consente l’uso del blocco core/list, per evitare errori bisogna includere anche core/list-item.

Blocchi consentiti
Blocchi consentiti.

Il filtro allowed_block_types_all permette di controllare i blocchi disponibili nel pannello di inserimento. Accetta due parametri:

  • $allowed_block_types – Un array o un booleano che definisce i blocchi consentiti (default: true).
  • $block_editor_context – Fornisce informazioni sullo stato attuale dell’editor dei blocchi, compreso il post in fase di modifica.

Consentire l’inserimento di blocchi specifici per collaboratori e autori

Il codice che segue limita i blocchi disponibili per gli utenti che non dispongono della funzionalità publish_pages (collaboratori e autori):

add_filter('allowed_block_types_all', 'allowed_block_types_for_non_admins', 10, 2);

function allowed_block_types_for_non_admins($allowed_blocks, $block_editor_context) {
    // Apply restrictions if the user does not have the 'publish_pages' capability
    if (!current_user_can('publish_pages')) {
        // Define the allowed blocks for users without 'publish_pages' capability
        $allowed_blocks = array(
            'core/paragraph',
            'core/heading',
            'core/image',
            'core/cover',
            'core/list',
            'core/list-item'
        );
    }
    return $allowed_blocks;
}

In questo esempio, i collaboratori e gli autori possono utilizzare solo i blocchi paragrafo, titolo, immagine, copertina ed elenco.

Consentire l’inserimento di blocchi per tipi di post e utenti specifici

Il codice che segue aggiunge il blocco Shortcode al pannello di inserimento quando si modifica una pagina, ma non lo rende disponibile per altri tipi di post:

add_filter('allowed_block_types_all', 'allowed_block_types', 25, 2);

function allowed_block_types($allowed_blocks, $editor_context) {
    $allowed_blocks = array(
        'core/paragraph',   
        'core/heading',    
        'core/image',      
        'core/cover',      
        'core/list',       
        'core/list-item'
    );

    // Check if the editor context has a post object and if its type is 'page'
    if (!empty($editor_context->post) && 'page' === $editor_context->post->post_type) {
        $allowed_blocks[] = 'core/shortcode';
    }

    return $allowed_blocks;
}

Si tenga presente che, dato che i collaboratori e gli autori non possono creare o modificare le pagine, il risultato apparirà solo in un post.

Tutti gli utenti vedranno solo sei blocchi ma anche gli amministratori e gli editor vedranno il blocco shortcode disponibile solo per le pagine.

Impostazioni per la disponibilità del blocco shortcode
Il blocco shortcode è disponibile solo per gli amministratori e gli editor delle pagine.

Nel nostro esempio, l’impatto su collaboratori e autori è nullo in quanto, di default, non possono aggiungere nuove pagine. Tuttavia, con un plugin per la gestione dei ruoli si possono controllare i permessi in modo più granulare.

Consentire l’accesso ai blocchi in base all’ID del post

Se si desidera consentire l’accesso ad una serie di blocchi solo per alcuni post, ecco come fare:

add_filter('allowed_block_types_all', 'allowed_block_types', 10, 2);

function allowed_block_types($allowed_blocks, $editor_context) {
    // Check if the editor context has a post object
    if (!empty($editor_context->post)) {
        $post_id = $editor_context->post->ID;

        // Define allowed blocks for specific post IDs
        $allowed_blocks_by_post = array(
            2 => array('core/paragraph', 'core/heading', 'core/image'),
            3 => array('core/paragraph', 'core/heading', 'core/image')
        );

        // Check if the current post ID has a defined allowed blocks array
        if (array_key_exists($post_id, $allowed_blocks_by_post)) {
            return $allowed_blocks_by_post[$post_id];
        }
    }
    return $allowed_blocks;
}

In questo esempio, solo i blocchi paragrafo, titolo e immagine saranno disponibili per gli ID dei post 2 e 3.

Blocchi limitati a specifici ID di post
Questi tre blocchi sono disponibili solo per due ID.

Questo va bene per un piccolo gruppo di post. Ma in una situazione dinamica, in cui le pagine o i post vengono aggiunti in continuazione, è bene considerare la possibilità di filtrare le tassonomie e i campi personalizzati.

Negare l’inserimento nella lista dei blocchi

Consentire l’inserimento in lista è un modo implicito di negare l’inserimento in lista, in quanto i blocchi non disponibili vengono bloccati. Ma si può adottare l’approccio inverso se si preferisce consentire l’accesso alla maggior parte dei blocchi tranne alcuni. In questo esempio, i blocchi titolo e copertina non sono più disponibili per nessun utente.

add_filter('allowed_block_types_all', 'deny_blocks');

function deny_blocks($allowed_blocks) {
    // Get all registered blocks
    $blocks = WP_Block_Type_Registry::get_instance()->get_all_registered();

    // Disable two specific blocks
    unset($blocks['core/heading']);
    unset($blocks['core/cover']);

    return array_keys($blocks);
}

In sostanza, troviamo tutti i blocchi registrati e poi rimuoviamo i blocchi Intestazione e Copertina.

È bene fare attenzione se si pensa di poter eliminare qualsiasi blocco in questo modo. Se un blocco – core o di altro tipo – è registrato con JavaScript, bisognerà bloccarlo con JavaScript.

Negare l’inserimento nella lista di intere categorie di blocchi

Se è necessario rimuovere intere categorie di blocchi, come Widget, Embed o Tema, si può seguire questo approccio:

add_filter('allowed_block_types_all', 'disable_blocks_by_categories', 10, 2);

function disable_blocks_by_categories($allowed_blocks, $editor_context) {
    // Get all registered blocks
    $registered_blocks = WP_Block_Type_Registry::get_instance()->get_all_registered();

    // Specify the categories to disable
    $categories_to_disable = array('widgets', 'embed', 'theme');

    // Initialize an array to hold allowed block names
    $allowed_block_names = array();

    // Loop through registered blocks
    foreach ($registered_blocks as $block_name => $block_type) {
        // Check if the block has categories defined
        if (isset($block_type->category)) {
            // If the block's category is NOT in the disabled list, allow it
            if (!in_array($block_type->category, $categories_to_disable, true)) {
                $allowed_block_names[] = $block_name;
            }
        } else {
            // If the block has no category defined, allow it by default
            $allowed_block_names[] = $block_name;
        }
    }
    return $allowed_block_names;
}

Questo codice filtra intere categorie di blocchi, rendendo più semplice l’esperienza di editing nell’editor dei blocchi.

Rimosse le categorie di blocchi: Widget, Embed e Tema
Le categorie di blocchi Widget, Embed e Tema sono state rimosse.

Bloccare i blocchi con la UI di WordPress

Bloccare un blocco impedisce che possa essere spostato o cancellato, pur consentendo la modifica dei contenuti. Ogni utente può bloccare o sbloccare un blocco in qualsiasi momento utilizzando l’opzione Blocca nella barra degli strumenti del blocco.

Si accede alle Impostazioni (i tre puntini ) sul blocco, poi clic su Blocca e poi si seleziona l’opzione Blocca tutto per attivare automaticamente sia l’opzione Blocca lo spostamento che l’opzione Blocca la rimozione, ma queste opzioni possono essere applicate anche separatamente.

La finestra di blocco per un singolo blocco
La finestra di blocco mostra le opzioni disponibili per un singolo blocco.

È importante sottolineare che, anche quando un blocco è bloccato, gli utenti possono comunque modificarne il contenuto e lo stile, a meno che non vengano applicate ulteriori restrizioni.

Impedire le modifiche allo stile non è possibile attraverso la funzione di blocco. Per limitare lo stile del blocco, è necessario apportare delle modifiche al file theme.json.

Per i blocchi che contengono elementi annidati, c’è un’opzione aggiuntiva per bloccare solo il blocco parent o bloccare anche tutti i blocchi interni. In questo modo ci si assicura che gli elementi raggruppati rimangano strutturati pur consentendo modifiche controllate al loro interno.

Le opzioni disponibili per un blocco parent
La finestra di blocco mostra le opzioni disponibili per un blocco parent.

Bloccare i blocchi con PHP

Sebbene l’interfaccia utente di WordPress fornisca un blocco di base, non applica restrizioni a livello di sito. Qualsiasi utente con accesso all’editor può sbloccare un blocco. Per limitare in modo permanente il blocco dei blocchi, la soluzione migliore è procedere via PHP.

Con PHP si può rimuovere completamente la possibilità di bloccare e sbloccare i blocchi, in modo che nessun utente possa aggirare le restrizioni. Questo è il modo in cui WordPress funzionava prima del rilascio di WordPress 5.9, quando è stata introdotta la funzionalità di blocco.

Il blocco dei blocchi è utile in molte situazioni, in particolare per la gestione di contenuti strutturati. Applicando le restrizioni dei blocchi con PHP, è possibile:

  • Preservare l’integrità del design impedendo agli utenti di modificare i blocchi chiave.
  • Prevenire le modifiche accidentali che potrebbero rovinare i layout.
  • Rendere più semplice la creazione di contenuti riducendo le opzioni non necessarie.
  • Garantire la coerenza in pattern e template, soprattutto per i progetti dei clienti.

Rimuovere la funzionalità di blocco dei blocchi per tutti gli utenti

Il seguente snippet PHP disabilita completamente il blocco dei blocchi, impedendo a qualsiasi utente di bloccarli o sbloccarli:

add_filter('block_editor_settings_all', 'example_disable_block_locking', 10, 2);

function example_disable_block_locking($settings, $context) {
   $settings['canLockBlocks'] = false; 
   return $settings;
}

Con questo codice, la funzione di blocco dei blocchi viene completamente rimossa dall’editor dei blocchi. Gli utenti non vedranno le opzioni di blocco e nessuno, indipendentemente dal ruolo, potrà bloccare o sbloccare i blocchi.

Per gli utenti che hanno il proprio sito su Kinsta, è possibile modificare in sicurezza i file del tema grazie all’utilizzo di SFTP, che è abilitato di default per tutti i siti WordPress.

Limitare il blocco dei blocchi in base ai ruoli degli utenti

Invece di eliminare completamente la funzionalità di blocco, si potrebbero regolare i permessi in modo da stabilire in modo più preciso chi può bloccare e sbloccare i blocchi. Il seguente snippet PHP consente di modificare i blocchi solo agli amministratori e agli editor, mentre gli autori e i collaboratori non potranno sbloccare alcun blocco se questo è stato impostato da un amministratore o da un editor.

add_filter('block_editor_settings_all', 'example_disable_block', 10, 2);

function example_disable_block ($settings, $context ) {
   if (
       isset( $context->post ) &&
       'post' === $context->post->post_type &&
       ! current_user_can( 'edit_theme_options' )
   ) {
       $settings['canLockBlocks'] = false; 
       $settings['codeEditingEnabled'] = false;   
   }
   return $settings;
}

Questo approccio limita il controllo dei blocchi agli utenti con le capacità di edit_theme_options, in genere gli amministratori e gli editor. Gli autori e i collaboratori non potranno sbloccare i blocchi impostati dagli utenti di livello superiore.

Inoltre, l’accesso all’Editor di Codice è disabilitato. In questo modo si impedisce agli utenti di modificare manualmente il markup dei blocchi per aggirare le restrizioni. I blocchi bloccati rimarranno invariati, anche per gli utenti sviluppatori.

La scelta di consentire o negare i blocchi – o una combinazione di entrambi – dipende dalle proprie specifiche esigenze. Si potrebbe voler limitare l’accesso ad alcuni blocchi per offrire un’esperienza di editing più pulita, imporre la coerenza del design o controllare l’accesso in base ai ruoli degli utenti.

A proposito di ruoli utente, le funzionalità possono essere modificate per personalizzare ulteriormente la gestione dei blocchi. Questo offre maggiori opportunità oltre a quelle che abbiamo trattato qui.

Si tenga presente che WordPress si evolve nel tempo. I futuri aggiornamenti potrebbero introdurre nuovi strumenti per gestire i blocchi o modificare le funzionalità esistenti, quindi è importante rimanere aggiornati sullo sviluppo di WordPress.

Stai cercando una soluzione di hosting sicura e adatta agli sviluppatori? Kinsta consente di gestire facilmente i file di WordPress, compresa la modifica dei file dei temi tramite SFTP, permettendo di personalizzare in modo semplice e sicuro il proprio sito senza metterne a rischio la stabilità.

Bud Kraus

Bud Kraus has been working with WordPress as an in-class and online instructor, site developer, and content creator since 2009. He has produced instructional videos and written many articles for WordPress businesses.