Gutenberg facilita la creación de contenido con bloques, pero a veces necesitas controlar qué bloques están disponibles. Puede que estés trabajando en el sitio de un cliente y quieras evitar que utilice ciertos bloques. O tal vez estés simplificando la experiencia de edición eliminando opciones innecesarias.

En esta guía, exploraremos diferentes formas de desactivar los bloques de Gutenberg, entre ellas:

  • Usando la interfaz de usuario (IU) de WordPress para ocultar bloques en el insertador
  • Bloqueando bloques para evitar que se muevan o eliminen
  • Aplicando restricciones de bloques con PHP, incluido el acceso basado en roles

Dicho esto, no vamos a tratar la visibilidad de los bloques (mostrar/ocultar contenido en función de las condiciones) ni a desactivar ajustes específicos de los bloques, como el texto o los colores de fondo, que se gestionan en theme.json.  Sin embargo, sí hablaremos del bloqueo de bloques, ya que está estrechamente relacionado con la desactivación de los bloques.

Todos los métodos de esta guía funcionan sin plugins y se aplican a cualquier tema basado en bloques. ¡Empecemos!

Desactivar bloques con la interfaz de WordPress

Eliminar bloques innecesarios ayuda a agilizar la experiencia de edición y puede mejorar ligeramente el rendimiento del backend, ya que los bloques desactivados no se cargan en memoria.

Cualquier usuario puede desactivar bloques desde el menú Preferencias del editor de bloques. Para ello, haz clic en el menú de tres puntos Configuración (⋮) de la esquina superior derecha, que abre las preferencias del editor. A continuación, en la pestaña Bloques, los usuarios pueden desmarcar cualquier bloque para eliminarlo del insertador de bloques.

Por ejemplo, puedes desactivar el bloque Cita simplemente desmarcando su casilla, como se muestra a continuación.

Bloque de citas desactivado en Preferencias de Bloques
Una vista del modal de Preferencias de Bloques muestra el bloque Cita como desactivado.

Si quieres ir más allá, puedes desactivar toda una categoría de bloques. Por ejemplo, desmarcar la categoría Texto eliminará todos los bloques relacionados con el texto del insertador, asegurando que ya no estén disponibles para su uso. Esto puede ser útil para agilizar el editor y evitar que los usuarios accedan a bloques innecesarios.

Pantalla modal de preferencias de bloques
Una vista de la pantalla modal Preferencias de Bloques muestra la categoría Texto desactivada.

Desactivar bloques con PHP

Existen dos enfoques fundamentales y muy distintos para permitir o impedir el uso de un bloque con WordPress. Dependiendo de tus necesidades, puedes elegir entre permitir o denegar que un bloque esté disponible en el Insertador.

Ambos enfoques pueden implementarse utilizando PHP o JavaScript, cada uno con sus propias ventajas e inconvenientes. PHP suele ser más sencillo cuando se trata de permitir bloques, mientras que JavaScript suele ser más eficaz cuando se trata de denegar bloques.

Utilizaremos PHP en todos nuestros ejemplos para demostrar varios casos de uso.

Lista de bloques permitidos

Para permitir sólo bloques específicos en el insertador, utiliza el siguiente filtro. Esto garantiza que sólo los bloques designados estén disponibles para todos los usuarios:

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

Este código debe añadirse al archivo functions.php de un tema hijo para evitar que los cambios se pierdan cuando se actualice el tema.

Cuando utilices este método, asegúrate de que se incluyen todos los bloques hijo necesarios. Por ejemplo, si permites el bloque core/list, debes incluir también core/list-item para evitar errores.

Configuración de la lista permitida de bloques
Lista de bloques permitidos

El filtro allowed_block_types_all permite a los desarrolladores controlar los bloques disponibles en el insertador. Acepta dos parámetros:

  • $allowed_block_types – Un array o booleano que define los bloques permitidos (por defecto: true).
  • $block_editor_context – Proporciona información sobre el estado actual del editor de bloques, incluida la entrada que se está editando.

Permitir bloques específicos para colaboradores y autores

El siguiente código restringe los bloques disponibles para los usuarios sin la capacidad publish_pages (colaboradores y 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;
}

En el ejemplo anterior, los Colaboradores y Autores sólo pueden utilizar los bloques de párrafo, encabezado, imagen, portada y lista.

Permitir bloques para tipos de entrada y usuarios específicos

El siguiente código añade el bloque Shortcode al insertador al editar una página, pero lo mantiene no disponible para otros tipos de entrada:

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

Ten en cuenta que, dado que los colaboradores con rol de autor no pueden crear ni modificar páginas, el resultado aparecerá únicamente en una entrada.

Los usuarios solo verán seis bloques, pero los administradores y editores también verán el bloque shortcode disponible solo para una página.

Configuración de disponibilidad del bloque Shortcode
El bloque shortcode sólo está disponible para Administradores y Editores para una página.

En nuestro ejemplo, el impacto que esto tiene en los colaboradores y autores es nulo, ya que, por defecto, no pueden añadir nuevas páginas. Sin embargo, el uso de un plugin de Gestión de Roles podría alterar esa capacidad.

Permitir bloques basados en el ID de la entrada

Si hay casos en los que deseas permitir un conjunto de bloques solo para ciertas publicaciones, esto es lo que puedes hacer:

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

En este ejemplo, sólo los bloques de párrafo, encabezado e imagen estarán disponibles para los ID de entrada 2 y 3.

Bloques restringidos a IDs de entradas específicas
Estos tres bloques sólo están disponibles para dos IDs.

Este método es adecuado si se trata de un pequeño conjunto de IDs de entradas. Pero si se trata de una situación dinámica en la que se añaden páginas o entradas continuamente, considera la posibilidad de filtrar por taxonomías y campos personalizados.

Bloques en la lista de denegados

La inclusión en la lista de permitidos, por implicación, es una forma de denegación, ya que se deniegan los bloques no disponibles. Pero puedes adoptar el enfoque inverso si prefieres permitir la mayoría de los bloques, con excepción de unos pocos. En este ejemplo, los bloques de encabezado y portada ya no están disponibles para ningún usuario.

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

Básicamente, buscamos todos los bloques registrados y eliminamos los bloques de encabezamiento y portada.

Ten cuidado si crees que puedes desregistrar cualquier bloque con este método. Si un bloque — del core o de otro tipo — está registrado con JavaScript, debes anular su registro con JavaScript.

Eliminar categorías enteras de bloques

Si quieres eliminar categorías enteras de bloques, como Widgets, Embebidos o Bloques de temas, utiliza este método:

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

Este enfoque filtra categorías enteras de bloques, simplificando la experiencia del editor de bloques.

Se han eliminado las categorías de Widgets, embebidos y bloques de temas.
Se han eliminado las categorías de Widgets, embebidos y bloques de temas.

Bloquear bloques con la interfaz de usuario de WordPress

Bloquear un bloque impide que se mueva o se elimine, a la vez que permite editar el contenido. Cualquier usuario puede bloquear o desbloquear un bloque en cualquier momento mediante la opción Bloquear de la barra de herramientas de bloques.

Para bloquear o desbloquear un bloque, haz clic en los tres puntos de Configuración (⋮) del bloque, haz clic en Bloquear y, a continuación, selecciona la opción Bloquear todo para activar automáticamente tanto Impedir movimiento como Impedir eliminación, pero estas opciones también se pueden aplicar por separado.

La pantalla modal Bloquear muestra las opciones disponibles para un solo bloque.
La pantalla modal Bloquear muestra las opciones disponibles para un solo bloque.

Es importante saber que, aunque un bloque esté bloqueado, los usuarios pueden modificar su contenido y estilo a menos que se apliquen otras restricciones.

Impedir los cambios de estilo no es posible únicamente mediante la función de bloqueo. Para restringir el estilo de los bloques, hay que hacer modificaciones en el archivo theme.json.

Para los bloques que contienen elementos anidados, existe una opción adicional para bloquear sólo el bloque padre o bloquear también todos los bloques interiores. Esto garantiza que los elementos agrupados permanezcan estructurados, al tiempo que permite realizar ediciones controladas en su interior.

La pantalla modal Bloquear muestra las opciones disponibles para un bloque padre.
La pantalla modal Bloquear muestra las opciones disponibles para un bloque padre.

Bloquear bloques con PHP

Aunque la interfaz de usuario de WordPress proporciona un bloqueo básico de bloques, no impone restricciones en todo el sitio. Cualquier usuario con acceso de editor puede desbloquear un bloque, lo que facilita la anulación del contenido bloqueado. Para restringir permanentemente el bloqueo de bloques, PHP es la mejor solución.

Con PHP, puedes eliminar por completo la capacidad de bloquear y desbloquear bloques, asegurándote de que ningún usuario pueda eludir las restricciones. Antes del lanzamiento de WordPress 5.9, cuando se introdujo el bloqueo de bloques, WordPress funcionaba de esta manera.

El bloqueo de páginas es útil en muchos casos, sobre todo cuando se mantiene contenido estructurado. Al aplicar restricciones de bloques con PHP, puedes:

  • Preservar la integridad del diseño impidiendo que los usuarios modifiquen bloques clave.
  • Evitar ediciones accidentales que podrían romper el diseño.
  • Agilizar la creación de contenidos reduciendo las opciones innecesarias.
  • Garantizar la coherencia de patrones y plantillas, especialmente para proyectos de clientes.

Eliminar la funcionalidad de bloqueo de bloques para todos los usuarios

El siguiente fragmento de PHP desactiva por completo el bloqueo de bloques, impidiendo que cualquier usuario bloquee o desbloquee bloques:

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 esto aplicado, la función de bloqueo de bloques se elimina por completo del editor de bloques. Los usuarios no verán las opciones de bloqueo, y nadie, independientemente de su rol, podrá bloquear o desbloquear bloques.

Para los usuarios que alojen su sitio con Kinsta, realizar cambios en los archivos del tema es fácil y seguro utilizando SFTP, que está activado por defecto para todos los sitios de WordPress.

Restringir el bloqueo de bloques en función de los roles de usuario

En lugar de eliminar por completo el bloqueo de bloques, es posible que quieras restringir quién puede bloquear y desbloquear bloques. El siguiente fragmento de PHP permite que solo los administradores y editores modifiquen los bloqueos de bloques, mientras que los autores y colaboradores no pueden desbloquear ningún bloque establecido por un administrador o 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;
}

Este enfoque limita el control de los bloques a los usuarios con la capacidad edit_theme_options, normalmente administradores y editores. Los autores y colaboradores no podrán desbloquear bloques establecidos por usuarios de nivel superior.

Además, el acceso al Editor de Código está desactivado, lo que impide que los usuarios modifiquen manualmente el marcado de los bloques para eludir las restricciones. Esto garantiza que los bloques bloqueados permanezcan inalterados, incluso por usuarios con conocimientos de programación.

Resumen

Elegir entre permitir o denegar bloques — o una combinación de ambos — depende de tus necesidades específicas. Puede que quieras restringir ciertos bloques para una experiencia de edición más limpia, reforzar la coherencia del diseño o controlar el acceso en función de los roles de los usuarios.

Hablando de roles de usuario, las capacidades se pueden modificar para personalizar aún más la forma en que se gestionan los bloques. Esto abre aún más posibilidades más allá de lo que hemos tratado aquí.

Ten en cuenta que WordPress evoluciona con el tiempo. Las futuras actualizaciones podrían introducir nuevas formas de gestionar los bloques o modificar la funcionalidad existente, por lo que mantenerse al día con el desarrollo de WordPress es importante para garantizar que tu enfoque siga siendo eficaz.

¿Buscas una solución de alojamiento segura y fácil de usar para los desarrolladores? Kinsta facilita la gestión de tus archivos de WordPress, incluida la edición de archivos de temas a través de SFTP, garantizando personalizaciones seguras y fluidas sin poner en riesgo la estabilidad del sitio.

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.