Restringe el uso de bloques, mejora la experiencia de edición y preserva la integridad del diseño directamente desde el código.
Gutenberg, el editor por bloques nativo de WordPress, ha revolucionado la creación de contenidos. Sin embargo, en muchos casos es necesario limitar qué bloques están disponibles, ya sea para simplificar el entorno de edición, evitar errores en diseños personalizados o restringir el acceso a funcionalidades avanzadas.
Esta guía explora métodos efectivos para desactivar bloques de Gutenberg y bloquear su edición o eliminación, utilizando tanto la interfaz nativa de WordPress como filtros PHP avanzados. No se requieren plugins, lo que garantiza un enfoque limpio, ligero y totalmente compatible con temas basados en bloques.
Desde el propio editor de bloques, cualquier usuario puede eliminar bloques innecesarios del insertador:
También es posible desmarcar categorías completas, como “Texto”, “Medios” o “Widgets”, reduciendo drásticamente el número de bloques disponibles.
⚠️ Este método es local y por usuario, y no impide que otros roles accedan a los bloques desactivados.
El enfoque más robusto y escalable es mediante filtros PHP, que permiten definir bloques permitidos o bloques denegados en función del tipo de contenido, el rol del usuario o incluso el ID del post.
add_filter('allowed_block_types_all', 'permitir_bloques_basicos', 10, 2);
function permitir_bloques_basicos($allowed_blocks, $context) {
return [
'core/paragraph',
'core/heading',
'core/image',
'core/cover',
'core/list',
'core/list-item',
];
}
add_filter('allowed_block_types_all', 'bloques_por_rol', 10, 2);
function bloques_por_rol($allowed_blocks, $context) {
if (!current_user_can('publish_pages')) {
return [
'core/paragraph',
'core/heading',
'core/image',
];
}
return $allowed_blocks;
}
add_filter('allowed_block_types_all', 'bloques_por_tipo', 10, 2);
function bloques_por_tipo($allowed_blocks, $context) {
if (!empty($context->post) && $context->post->post_type === 'page') {
return [
'core/paragraph',
'core/heading',
'core/image',
'core/shortcode',
];
}
return [
'core/paragraph',
'core/heading',
'core/image',
];
}
add_filter('allowed_block_types_all', 'bloques_por_id', 10, 2);
function bloques_por_id($allowed_blocks, $context) {
if (!empty($context->post)) {
$id = $context->post->ID;
$permisos = [
10 => ['core/paragraph', 'core/image'],
25 => ['core/paragraph', 'core/heading'],
];
return $permisos[$id] ?? $allowed_blocks;
}
return $allowed_blocks;
}
En lugar de definir qué se permite, también se puede excluir solo lo que se quiere bloquear:
add_filter('allowed_block_types_all', 'denegar_bloques', 10, 2);
function denegar_bloques($allowed_blocks, $context) {
$todos = WP_Block_Type_Registry::get_instance()->get_all_registered();
unset($todos['core/heading']);
unset($todos['core/cover']);
return array_keys($todos);
}
add_filter('allowed_block_types_all', 'eliminar_categorias_bloques', 10, 2);
function eliminar_categorias_bloques($allowed_blocks, $context) {
$categorias_a_ocultar = ['widgets', 'embed', 'theme'];
$registrados = WP_Block_Type_Registry::get_instance()->get_all_registered();
$permitidos = [];
foreach ($registrados as $nombre => $bloque) {
if (!isset($bloque->category) || !in_array($bloque->category, $categorias_a_ocultar, true)) {
$permitidos[] = $nombre;
}
}
return $permitidos;
}
La función de “bloqueo” permite impedir que ciertos bloques se muevan o se eliminen desde la interfaz gráfica, aunque no impide su edición.
Para bloques con hijos, también se puede bloquear toda la estructura, ideal para diseños reutilizables.
⚠️ Cualquier usuario puede desbloquearlos manualmente… a menos que se use código para evitarlo.
add_filter('block_editor_settings_all', 'desactivar_bloqueo_total', 10, 2);
function desactivar_bloqueo_total($settings, $context) {
$settings['canLockBlocks'] = false;
return $settings;
}
Esto elimina toda la funcionalidad de bloqueo/desbloqueo del editor.
add_filter('block_editor_settings_all', 'bloqueo_por_rol', 10, 2);
function bloqueo_por_rol($settings, $context) {
if (!current_user_can('edit_theme_options')) {
$settings['canLockBlocks'] = false;
$settings['codeEditingEnabled'] = false;
}
return $settings;
}
Este enfoque garantiza que usuarios sin permisos avanzados no puedan desbloquear ni editar en HTML los bloques protegidos.
theme.json para definir estilos, estructuras y restricciones aún más potentes.Ventajas clave del enfoque sin plugins:
