O Gutenberg facilita a criação de conteúdo com blocos, mas, às vezes, você precisa controlar quais blocos estão disponíveis. Talvez você esteja trabalhando no site de um cliente e queira impedir que ele use determinados blocos. Ou talvez você esteja simplificando a experiência de edição ao remover opções desnecessárias.

Neste guia, exploraremos diferentes maneiras de desativar os blocos do Gutenberg, incluindo:

  • Usar a interface de usuário (UI) do WordPress para ocultar blocos no inseridor
  • Bloqueio de blocos para impedir que sejam movidos ou excluídos
  • Restringir blocos com PHP, incluindo regras baseadas em funções de usuário

Por outro lado, não abordaremos a visibilidade condicional de blocos (exibir/ocultar conteúdo com base em condições) ou a desativação de configurações específicas de blocos, como cores de texto e fundo, que são gerenciadas pelo theme.json. No entanto, discutiremos o bloqueio de blocos, pois está diretamente relacionado à desativação de blocos.

Todos os métodos deste guia funcionam sem plugins e se aplicam a qualquer tema baseado em blocos. Vamos começar!

Desativando blocos pela interface do WordPress

A remoção de blocos desnecessários ajuda a simplificar a experiência de edição e pode melhorar um pouco o desempenho do backend, pois os blocos desativados não são carregados na memória.

Qualquer usuário pode desativar blocos no menu Preferences (Preferências) do editor de blocos. Você pode fazer isso clicando no menu de três pontos Configurações (⋮) no canto superior direito para abrir as preferências do editor. Em seguida, na aba Blocks (Blocos), os usuários podem desmarcar qualquer bloco para removê-lo do inseridor de blocos.

Por exemplo, você pode desativar o bloco de Citação (Quote) apenas desmarcando a caixa correspondente, como mostrado abaixo:

Bloco de Citação desativado nas Preferências de Blocos
Imagem mostrando a desativação do bloco de Citação no modal de Preferências de Blocos.

Se quiser ir além, você pode desativar uma categoria inteira de blocos. Por exemplo, desmarcando a categoria Texto, todos os blocos relacionados a texto serão removidos do inseridor, garantindo que não possam mais ser usados. Isso é útil para simplificar o editor e evitar que usuários tenham acesso a blocos desnecessários.

Desativação da categoria de blocos de Texto no modal de Preferências de Blocos
Imagem mostrando a desativação da categoria de Texto nas Preferências de Blocos.

Desabilitando blocos com PHP

Existem duas abordagens distintas para permitir ou restringir o uso de um bloco no WordPress. Dependendo da necessidade, você pode optar por permitir ou bloquear um bloco no Inserter.

Ambas as abordagens podem ser implementadas usando PHP ou JavaScript, cada uma com suas próprias vantagens e desvantagens. Em geral, o PHP é mais simples para permitir a listagem de blocos, enquanto o JavaScript costuma ser mais eficiente para negar a listagem.

Estamos usando PHP em todos os nossos exemplos para demonstrar vários casos de uso.

Permissão de blocos específicos (Allow-listing)

Para permitir apenas determinados blocos no Inserter, utilize o seguinte filtro. Isso garante que apenas os blocos especificados estarão disponíveis para todos os usuários:

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

Esse código deve ser adicionado ao arquivo functions.php de um tema filho (child theme) para evitar que as alterações sejam perdidas quando o tema for atualizado.

Ao usar esse método, certifique-se de que todos os blocos filhos necessários estejam incluídos. Por exemplo, se você permitir o bloco core/list, deverá incluir também core/list-item para evitar erros.

Blocos da lista de permissões.
Blocos da lista de permissões.

O filtro allowed_block_types_all oferece aos desenvolvedores controle sobre os blocos disponíveis no Inserter. Ele aceita dois parâmetros:

  • $allowed_block_types – Um array ou booleano definindo os blocos permitidos (padrão: true).
  • $block_editor_context – Fornece informações sobre o estado atual do editor de blocos, incluindo o artigo que está sendo editado.

Permitindo blocos específicos para contribuidores e autores

O código a seguir restringe os blocos disponíveis para usuários sem o recurso publish_pages (contribuidores e autores):

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

No exemplo acima, os contribuidores e autores só podem usar os blocos de parágrafo, título, imagem, capa e lista.

Permitindo blocos para tipos de artigos e usuários específicos

O código a seguir adiciona o bloco Shortcode no Inserter ao editar uma página, mas o mantém indisponível para outros tipos de artigos:

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

Vale lembrar que contribuidores e autores não podem criar ou modificar páginas por padrão, então essa configuração aparecerá apenas em artigos para esses usuários.

Todos os usuários verão apenas seis blocos, mas administradores e editores terão acesso ao bloco de Shortcode ao editar uma página.

Configurações de disponibilidade do bloco de shortcode.
O bloco de shortcode está disponível somente para administradores e editores de uma página.

Em nosso exemplo, o impacto que isso tem sobre os colaboradores e autores é nulo, pois, por padrão, eles não podem adicionar novas páginas. No entanto, se você usar um plugin de gerenciamento de funções, essa capacidade poderá ser alterada.

Permitindo blocos baseados no ID do artigo

Se houver casos em que você deseja permitir um conjunto de blocos somente para determinados artigos, utilize o seguinte código:

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

Neste exemplo, somente os blocos de parágrafo, título e imagem estarão disponíveis para os artigos com ID 2 e 3.

Esses três blocos estão disponíveis somente para dois IDs.
Esses três blocos estão disponíveis somente para dois IDs.

Essa abordagem funciona bem para um pequeno conjunto de IDs, mas se você gerencia vários artigos e páginas dinâmicas, é melhor filtrar por taxonomias ou campos personalizados.

Lista de exclusão de blocos (Deny-listing)

A lista de blocos permitidos já funciona como um método de exclusão implícita, pois qualquer bloco não incluído será bloqueado. No entanto, se preferir permitir todos os blocos, exceto alguns específicos, pode usar o método inverso. O exemplo abaixo remove os blocos de título (heading) e capa (cover) para todos os usuários:

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

Neste caso, a função busca todos os blocos registrados e remove heading e cover.

Atenção: Esse método não funciona para blocos registrados via JavaScript. Se um bloco foi registrado com JavaScript, ele precisará ser desregistrado diretamente via JavaScript.

Excluindo categorias inteiras de blocos

Se você quiser remover categorias inteiras de blocos, como Widgets, Embeds ou blocos de Tema, use o código abaixo:

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

Essa abordagem filtra categorias inteiras de blocos, simplificando a experiência do editor de blocos.

Categorias de bloco removidas: Widgets, Embeds e Tema
As categorias de blocos de widgets, embed e tema foram removidas.

Bloqueando blocos com a interface do WordPress

Ao bloquear um bloco, você evita que ele seja movido ou excluído e ainda permite edições de conteúdo. Qualquer usuário pode bloquear ou desbloquear um bloco a qualquer momento usando a opção Bloquear na barra de ferramentas do bloco.

Para bloquear ou desbloquear um bloco, clique no ícone de três pontos Configurações (⋮) no bloco, clique em Bloquear e, em seguida, selecione a opção Bloquear tudo para ativar automaticamente as opções Impedir movimentação e Impedir remoção, mas essas opções também podem ser aplicadas separadamente.

Opções de bloqueio modal para um único bloco.
O modal Lock mostra as opções disponíveis para um único bloco.

É importante saber que, mesmo quando um bloco é bloqueado, os usuários ainda podem alterar seu conteúdo e estilo, a menos que outras restrições sejam aplicadas.

Não é possível impedir alterações de estilo apenas com o recurso de bloqueio. Para restringir o estilo do bloco, devem ser feitas modificações no arquivo theme.json arquivo.

Para blocos que contêm elementos aninhados, há uma opção adicional para bloquear somente o bloco principal ou bloquear também todos os blocos internos. Isso garante que os elementos agrupados permaneçam estruturados e, ao mesmo tempo, permite edições controladas dentro deles.

Opções de bloqueio do modal para o bloco principal.
Opções de bloqueio do modal para o bloco principal.

Bloqueio de blocos com PHP

Embora a interface do usuário do WordPress ofereça bloqueio básico de blocos, ela não impõe restrições em todo o site. Qualquer usuário com acesso de editor pode desbloquear um bloco, facilitando a substituição do conteúdo bloqueado. Para restringir permanentemente o bloqueio de blocos, o PHP é a melhor solução.

Com o PHP, você pode remover completamente a capacidade de bloquear e desbloquear blocos, garantindo que nenhum usuário possa contornar as restrições. Era assim que o WordPress funcionava antes do lançamento do WordPress 5.9, quando o bloqueio de blocos foi introduzido.

O bloqueio de blocos é útil em muitos cenários, especialmente na manutenção de conteúdo estruturado. Ao impor restrições de bloco com PHP, você pode:

  • Preservar a integridade do design, impedindo que os usuários modifiquem os principais blocos.
  • Evitar edições acidentais que possam comprometer a estrutura do layout.
  • Simplificar a criação de conteúdo reduzindo as opções desnecessárias.
  • Garantir a consistência de padrões e modelos, especialmente para projetos de clientes.

Removendo a funcionalidade de bloqueio de blocos para todos os usuário

O seguinte trecho de PHP desativa totalmente o bloqueio de blocos, impedindo que qualquer usuário bloqueie ou desbloqueie blocos:

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

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

Após aplicar esse código, a opção de bloqueio de blocos será removida do editor de blocos. Os usuários não verão as opções de bloqueio, independentemente do nível de permissão.

Para os usuários que hospedam seu site com a Kinsta, fazer alterações nos arquivos de tema é fácil e seguro usando o SFTP, que é ativado por padrão para todos os sites WordPress.

Restringindo o bloqueio de blocos com base nas funções do usuário

Em vez de remover completamente o bloqueio de blocos, você pode querer restringir quem pode bloquear e desbloquear blocos. O seguinte trecho de PHP permite que somente administradores e editores modifiquem bloqueios de blocos, enquanto autores e colaboradores não podem desbloquear nenhum bloco definido por um administrador ou 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;
}

Essa abordagem limita o controle de blocos aos usuários com o recurso edit_theme_options, normalmente administradores e editores. Os autores e colaboradores não poderão desbloquear blocos definidos por usuários de nível superior.

Além disso, o acesso ao Code Editor é desativado, impedindo que os usuários modifiquem manualmente a marcação do bloco para contornar as restrições. Isso garante que os blocos bloqueados permaneçam inalterados, mesmo por usuários com conhecimento de codificação.

Resumo

A decisão entre permitir ou bloquear blocos (ou uma combinação de ambos) depende das suas necessidades. Talvez você queira restringir determinados blocos para obter uma experiência de edição mais limpa, reforçar a consistência do design ou controlar o acesso com base nas funções do usuário.

Por falar em funções de usuário, os recursos podem ser modificados para personalizar ainda mais a forma como os blocos são gerenciados. Isso abre ainda mais possibilidades além das que abordamos aqui.

Lembre-se de que o WordPress está em constante evolução. Futuras atualizações podem adicionar novas formas de gerenciar blocos ou modificar funcionalidades existentes. Por isso, acompanhar o desenvolvimento do WordPress é essencial para garantir que sua abordagem continue eficaz.

Você está procurando uma solução de hospedagem segura e amigável ao desenvolvedor? A Kinsta facilita o gerenciamento de seus arquivos do WordPress, incluindo a edição de arquivos de temas via SFTP, garantindo personalizações seguras e contínuas sem arriscar a estabilidade do site.

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.