Como registrar patrones y variaciones de bloques vía JS en WordPress

Contents

Encabezado principal del Hero

Subtítulo o entrada que complementa el héroe.

// cierre column 66%
/
// cierre column 34%
// cierre columns
} ) } ) } )( window.wp )

Detalles importantes del ejemplo:

  • El contenido del patrón es HTML con los comentarios que indican bloques: lt!– wp:heading –gt … lt!– /wp:heading –gt. Esto permite que el patrón se inserte como bloques reales.
  • Usa la función de i18n (wp.i18n.__) para internacionalizar el título y descripción.
  • Las imágenes o IDs incluidos en el contenido deben existir o se pueden dejar como placeholders es común usar bloques con contenido genérico que el usuario reemplaza.

3. Registrar variaciones de bloques desde JavaScript

Las variaciones permiten ofrecer sabores del mismo bloque con atributos preconfigurados (por ejemplo, un botón de estilo corporativo). Se suelen registrar sobre bloques core (core/button, core/columns, core/quote) u otros bloques registrados por plugins.

Ejemplo: variación para core/button y otra variación para core/columns con innerBlocks definidos.

( function( wp ) {
    var registerBlockVariation = wp.blocks.registerBlockVariation
    var unregisterBlockVariation = wp.blocks.unregisterBlockVariation
    var domReady = wp.domReady
    var __ = wp.i18n.__

    domReady( function() {
        // Variación para core/button: estilo brand
        registerBlockVariation( core/button, {
            name: brand,
            title: __( Botón marca, mi-textdomain ),
            attributes: {
                className: is-style-brand,
                // puedes predefinir other attributes como backgroundColor, textColor, etc.
            },
            isDefault: false
        } )

        // Variación para core/columns con 2 columnas preconfiguradas
        registerBlockVariation( core/columns, {
            name: two-equal,
            title: __( Dos columnas iguales, mi-textdomain ),
            attributes: {
                // no hace falta attributes si se usan innerBlocks
            },
            innerBlocks: [
                [ core/column, { width: 50% } ],
                [ core/column, { width: 50% } ]
            ],
            isDefault: false
        } )

        // Ejemplo: si quieres eliminar una variación registrada por otro plugin o core
        // unregisterBlockVariation( core/button, outline )
    } )
} )( window.wp )

Notas:

  • innerBlocks en registerBlockVariation acepta una estructura como la que usan las plantillas: arrays con [blockName, attributes, innerBlocks].
  • Si necesitas condiciones para mostrar una variación, puedes gestionarlas en tu UI o registrar/desregistrar condicionalmente con lógica JS.

4. Registrar categorías de patrones (si necesitas nuevas)

Las categorías de patrones ayudan a clasificar los patrones en el explorador. Habitualmente se registran en PHP, ya que es un ajuste del servidor y está disponible en todas las cargas. Ejemplo:

lt?php
function mi_plugin_register_pattern_categories() {
    if ( function_exists( register_block_pattern_category ) ) {
        register_block_pattern_category(
            mi-categoria,
            array( label => __( Mis patrones, mi-textdomain ) )
        )
    }
}
add_action( init, mi_plugin_register_pattern_categories )
?gt

Si registras tu patrón JS con categories: [ mi-categoria ], el patrón aparecerá dentro de esa categoría.

5. Buenas prácticas y recomendaciones

  1. Namespacing: Usa prefijos únicos (mi-plugin/, mi_tema/) para evitar colisiones de nombres de patrones y variaciones.
  2. Internacionalización: Usa wp.i18n.__ o wp.i18n._x en los títulos y descripciones JS para que sean traducibles.
  3. Separar contenido y estilos: El patrón debe contener HTML/estructura, pero evita estilos CSS inline excesivos en su lugar, incluye estilos en el tema o en tu plugin para mantener consistencia.
  4. Evitar IDs fijos: No incluyas IDs únicos (por ejemplo, id=123) en content del patrón salvo cuando sea necesario puede provocar duplicados no deseados.
  5. Control de versiones: Si actualizas patrones en producción, ten cuidado: los patrones ya insertados en posts no se actualizan automáticamente.
  6. Compatibilidad: Comprueba las APIs disponibles según la versión mínima de WP en tu plugin maneja feature detection si necesitas ser compatible con versiones muy antiguas.

6. Depuración y pruebas

  • Habilita la consola del navegador (F12) y revisa errores JS al abrir el editor de bloques.
  • Utiliza wp.domReady para asegurarte de que las funciones de wp.blocks están disponibles.
  • Si no ves un patrón, revisa que el script JS realmente se carga (Network tab) y que las dependencias estén satisfechas.
  • Prueba a llamar unregisterBlockPattern con el identificador para comprobar que puedes eliminarlo también prueba a listar patrones desde la consola con window.wp.blocks ?

Ejemplo completo de flow (PHP JS)

Resumen de pasos para desplegar un patrón/variación desde un plugin:

  1. Registrar categoría de patrones (opcional) en init (PHP).
  2. Encolar script JS en enqueue_block_editor_assets.
  3. En el JS, usar wp.domReady para llamar a registerBlockPattern y registerBlockVariation.
  4. Probar en el editor, hacer ajustes en content, atributos o i18n.

7. Ejemplos avanzados y consideraciones

Patrones dinámicos: si necesitas obtener contenido dinámico (por ejemplo, plantillas con datos de la base de datos), puedes generar el bloque content desde PHP y exponerlo vía REST o localize_script, y luego registrarlo desde JS usando esa cadena HTML. Otra opción es registrar el patrón en PHP directamente con register_block_pattern si el contenido depende del servidor.

Compatibilidad con themes: si tu tema define estilos particulares, documenta las clases que tus patrones usan para que funcionen correctamente en el front-end.

Cómo remover o reemplazar patrones/variaciones de terceros

  • Para desactivar un patrón ya registrado por otro plugin, usa unregisterBlockPattern con el nombre completo (namespace/slug) en tu JS ejecutado en domReady.
  • Para desactivar variaciones indeseadas, usa unregisterBlockVariation( blockName, variationName ).

8. Ejemplo final: registrar, desregistrar y versionado

En este ejemplo se registran dos patrones, se desregistra uno existente y se registra una variación además demostramos cómo usar i18n y domReady.

( function( wp ) {
    var registerBlockPattern = wp.blocks.registerBlockPattern
    var unregisterBlockPattern = wp.blocks.unregisterBlockPattern
    var registerBlockVariation = wp.blocks.registerBlockVariation
    var unregisterBlockVariation = wp.blocks.unregisterBlockVariation
    var domReady = wp.domReady
    var __ = wp.i18n.__

    domReady( function() {
        // Desregistrar un patrón de ejemplo que queremos reemplazar
        try {
            unregisterBlockPattern( core/old-pattern )
        } catch ( e ) {
            // ignore si no existe
            console.warn( No se pudo desregistrar core/old-pattern:, e )
        }

        // Registrar patrón nuevo
        registerBlockPattern( mi-plugin/hero-oscuro, {
            title: __( Hero oscuro, mi-textdomain ),
            description: __( Hero con fondo oscuro y botón claro, mi-textdomain ),
            categories: [ mi-categoria, featured ],
            content:
                  
                

Mensaje principal

Texto complementario del hero oscuro.

} ) // Registrar variación de botón registerBlockVariation( core/button, { name: ghost, title: __( Ghost Button, mi-textdomain ), attributes: { className: is-style-ghost }, isDefault: false } ) // Ejemplo de cómo desregistrar una variación por nombre // unregisterBlockVariation( core/button, outline ) } ) } )( window.wp )

Conclusión

Registrar patrones y variaciones desde JavaScript te da flexibilidad para generar, modificar y condicionar el registro en tiempo de ejecución, algo útil cuando tus patrones dependen de parámetros del cliente o de recursos generados por build. Sigue las mejores prácticas de namespacing, i18n y separación de estilos para mantener patrones mantenibles y compatibles. Usa PHP para registrar categorías o generar contenido dinámico del lado del servidor si lo necesitas.

Recursos

Introducción

En este tutorial explico, paso a paso y con todo lujo de detalles, cómo registrar patrones (block patterns) y variaciones de bloques (block variations) desde JavaScript en WordPress. Verás ejemplos completos de código para integrarlo en tu plugin o tema, mejores prácticas, cómo organizar categorías y cómo depurarlo en el editor de bloques. Los ejemplos usan la API pública del editor (wp.) para asegurar compatibilidad con instalaciones estándar de Gutenberg/WordPress.

Requisitos

  • WordPress 5.8 (o una versión que incluya las APIs modernas de bloques).
  • Acceso para añadir un plugin o modificar el functions.php de un tema hijo.
  • Familiaridad básica con JavaScript y PHP.
  • Conocimientos mínimos sobre cómo funcionan los bloques en el editor (markup HTML con comentarios de bloque).

Conceptos clave

  • Patrón (Block Pattern): fragmentos de contenido compuestos por uno o varios bloques que el usuario puede insertar desde el explorador de patrones.
  • Variación de bloque (Block Variation): una variante de un bloque existente con atributos, innerBlocks o estilos por defecto.
  • Categorías de patrones: agrupaciones que ayudan a organizar patrones en el selector del editor.
  • Nota: Muchos ejemplos en la documentación antigua usan PHP para patrones aquí te muestro cómo hacerlo desde JS para cargar y gestionar patrones dinámicamente o como parte de un build de JS.

Resumen rápido de funciones JS (tabla)

Función Qué hace
wp.blocks.registerBlockPattern Registra un patrón nuevo para que aparezca en el explorador de patrones.
wp.blocks.unregisterBlockPattern Elimina un patrón registrado.
wp.blocks.registerBlockVariation Registra una variación para un bloque concreto (por ejemplo core/button).
wp.blocks.unregisterBlockVariation Elimina una variación registrada.

1. Cómo cargar el script JS en el editor

Primero debes encolar tu script para que se ejecute en el editor de bloques. Usa el hook enqueue_block_editor_assets. En el ejemplo asumimos que tu archivo JS se llama editor-patterns.js y está en la carpeta del plugin.

lt?php
function mi_plugin_enqueue_editor_scripts() {
    wp_enqueue_script(
        mi-plugin-editor-patterns,
        plugins_url( build/editor-patterns.js, __FILE__ ),
        array( wp-blocks, wp-dom-ready, wp-i18n ),
        filemtime( plugin_dir_path( __FILE__ ) . build/editor-patterns.js )
    )
}
add_action( enqueue_block_editor_assets, mi_plugin_enqueue_editor_scripts )
?gt

Explicación breve:

  • Dependencias: wp-blocks (para registerBlockPattern, registerBlockVariation), wp-dom-ready (asegura que el editor esté listo), wp-i18n (para internacionalización si la usas).
  • Versionado dinámico con filemtime para evitar caché durante desarrollo.

2. Registrar patrones desde JavaScript

En JS puedes usar wp.domReady para ejecutar el registro una vez que el editor esté listo. El bloque de contenido del patrón suele ser HTML concomentarios de bloque (block comments), exactamente el mismo formato que exporta el editor.

Ejemplo: registro de un patrón simple llamado my-plugin/hero con título, descripción, categorías y contenido HTML.

( function( wp ) {
    var registerBlockPattern = wp.blocks.registerBlockPattern
    var domReady = wp.domReady
    var __ = wp.i18n.__

    domReady( function() {
        registerBlockPattern( my-plugin/hero, {
            title: __( Hero con CTA, mi-textdomain ),
            description: __( Sección hero con fondo, título, texto y botón., mi-textdomain ),
            categories: [ featured, text ],
            keywords: [ hero, llamada a la acción, cta ],
            viewportWidth: 1200,
            content:
                  
                

Encabezado principal del Hero

Subtítulo o entrada que complementa el héroe.

// cierre column 66%
/
// cierre column 34%
// cierre columns
} ) } ) } )( window.wp )

Detalles importantes del ejemplo:

  • El contenido del patrón es HTML con los comentarios que indican bloques: lt!– wp:heading –gt … lt!– /wp:heading –gt. Esto permite que el patrón se inserte como bloques reales.
  • Usa la función de i18n (wp.i18n.__) para internacionalizar el título y descripción.
  • Las imágenes o IDs incluidos en el contenido deben existir o se pueden dejar como placeholders es común usar bloques con contenido genérico que el usuario reemplaza.

3. Registrar variaciones de bloques desde JavaScript

Las variaciones permiten ofrecer sabores del mismo bloque con atributos preconfigurados (por ejemplo, un botón de estilo corporativo). Se suelen registrar sobre bloques core (core/button, core/columns, core/quote) u otros bloques registrados por plugins.

Ejemplo: variación para core/button y otra variación para core/columns con innerBlocks definidos.

( function( wp ) {
    var registerBlockVariation = wp.blocks.registerBlockVariation
    var unregisterBlockVariation = wp.blocks.unregisterBlockVariation
    var domReady = wp.domReady
    var __ = wp.i18n.__

    domReady( function() {
        // Variación para core/button: estilo brand
        registerBlockVariation( core/button, {
            name: brand,
            title: __( Botón marca, mi-textdomain ),
            attributes: {
                className: is-style-brand,
                // puedes predefinir other attributes como backgroundColor, textColor, etc.
            },
            isDefault: false
        } )

        // Variación para core/columns con 2 columnas preconfiguradas
        registerBlockVariation( core/columns, {
            name: two-equal,
            title: __( Dos columnas iguales, mi-textdomain ),
            attributes: {
                // no hace falta attributes si se usan innerBlocks
            },
            innerBlocks: [
                [ core/column, { width: 50% } ],
                [ core/column, { width: 50% } ]
            ],
            isDefault: false
        } )

        // Ejemplo: si quieres eliminar una variación registrada por otro plugin o core
        // unregisterBlockVariation( core/button, outline )
    } )
} )( window.wp )

Notas:

  • innerBlocks en registerBlockVariation acepta una estructura como la que usan las plantillas: arrays con [blockName, attributes, innerBlocks].
  • Si necesitas condiciones para mostrar una variación, puedes gestionarlas en tu UI o registrar/desregistrar condicionalmente con lógica JS.

4. Registrar categorías de patrones (si necesitas nuevas)

Las categorías de patrones ayudan a clasificar los patrones en el explorador. Habitualmente se registran en PHP, ya que es un ajuste del servidor y está disponible en todas las cargas. Ejemplo:

lt?php
function mi_plugin_register_pattern_categories() {
    if ( function_exists( register_block_pattern_category ) ) {
        register_block_pattern_category(
            mi-categoria,
            array( label => __( Mis patrones, mi-textdomain ) )
        )
    }
}
add_action( init, mi_plugin_register_pattern_categories )
?gt

Si registras tu patrón JS con categories: [ mi-categoria ], el patrón aparecerá dentro de esa categoría.

5. Buenas prácticas y recomendaciones

  1. Namespacing: Usa prefijos únicos (mi-plugin/, mi_tema/) para evitar colisiones de nombres de patrones y variaciones.
  2. Internacionalización: Usa wp.i18n.__ o wp.i18n._x en los títulos y descripciones JS para que sean traducibles.
  3. Separar contenido y estilos: El patrón debe contener HTML/estructura, pero evita estilos CSS inline excesivos en su lugar, incluye estilos en el tema o en tu plugin para mantener consistencia.
  4. Evitar IDs fijos: No incluyas IDs únicos (por ejemplo, id=123) en content del patrón salvo cuando sea necesario puede provocar duplicados no deseados.
  5. Control de versiones: Si actualizas patrones en producción, ten cuidado: los patrones ya insertados en posts no se actualizan automáticamente.
  6. Compatibilidad: Comprueba las APIs disponibles según la versión mínima de WP en tu plugin maneja feature detection si necesitas ser compatible con versiones muy antiguas.

6. Depuración y pruebas

  • Habilita la consola del navegador (F12) y revisa errores JS al abrir el editor de bloques.
  • Utiliza wp.domReady para asegurarte de que las funciones de wp.blocks están disponibles.
  • Si no ves un patrón, revisa que el script JS realmente se carga (Network tab) y que las dependencias estén satisfechas.
  • Prueba a llamar unregisterBlockPattern con el identificador para comprobar que puedes eliminarlo también prueba a listar patrones desde la consola con window.wp.blocks ?

Ejemplo completo de flow (PHP JS)

Resumen de pasos para desplegar un patrón/variación desde un plugin:

  1. Registrar categoría de patrones (opcional) en init (PHP).
  2. Encolar script JS en enqueue_block_editor_assets.
  3. En el JS, usar wp.domReady para llamar a registerBlockPattern y registerBlockVariation.
  4. Probar en el editor, hacer ajustes en content, atributos o i18n.

7. Ejemplos avanzados y consideraciones

Patrones dinámicos: si necesitas obtener contenido dinámico (por ejemplo, plantillas con datos de la base de datos), puedes generar el bloque content desde PHP y exponerlo vía REST o localize_script, y luego registrarlo desde JS usando esa cadena HTML. Otra opción es registrar el patrón en PHP directamente con register_block_pattern si el contenido depende del servidor.

Compatibilidad con themes: si tu tema define estilos particulares, documenta las clases que tus patrones usan para que funcionen correctamente en el front-end.

Cómo remover o reemplazar patrones/variaciones de terceros

  • Para desactivar un patrón ya registrado por otro plugin, usa unregisterBlockPattern con el nombre completo (namespace/slug) en tu JS ejecutado en domReady.
  • Para desactivar variaciones indeseadas, usa unregisterBlockVariation( blockName, variationName ).

8. Ejemplo final: registrar, desregistrar y versionado

En este ejemplo se registran dos patrones, se desregistra uno existente y se registra una variación además demostramos cómo usar i18n y domReady.

( function( wp ) {
    var registerBlockPattern = wp.blocks.registerBlockPattern
    var unregisterBlockPattern = wp.blocks.unregisterBlockPattern
    var registerBlockVariation = wp.blocks.registerBlockVariation
    var unregisterBlockVariation = wp.blocks.unregisterBlockVariation
    var domReady = wp.domReady
    var __ = wp.i18n.__

    domReady( function() {
        // Desregistrar un patrón de ejemplo que queremos reemplazar
        try {
            unregisterBlockPattern( core/old-pattern )
        } catch ( e ) {
            // ignore si no existe
            console.warn( No se pudo desregistrar core/old-pattern:, e )
        }

        // Registrar patrón nuevo
        registerBlockPattern( mi-plugin/hero-oscuro, {
            title: __( Hero oscuro, mi-textdomain ),
            description: __( Hero con fondo oscuro y botón claro, mi-textdomain ),
            categories: [ mi-categoria, featured ],
            content:
                  
                

Mensaje principal

Texto complementario del hero oscuro.

} ) // Registrar variación de botón registerBlockVariation( core/button, { name: ghost, title: __( Ghost Button, mi-textdomain ), attributes: { className: is-style-ghost }, isDefault: false } ) // Ejemplo de cómo desregistrar una variación por nombre // unregisterBlockVariation( core/button, outline ) } ) } )( window.wp )

Conclusión

Registrar patrones y variaciones desde JavaScript te da flexibilidad para generar, modificar y condicionar el registro en tiempo de ejecución, algo útil cuando tus patrones dependen de parámetros del cliente o de recursos generados por build. Sigue las mejores prácticas de namespacing, i18n y separación de estilos para mantener patrones mantenibles y compatibles. Usa PHP para registrar categorías o generar contenido dinámico del lado del servidor si lo necesitas.

Recursos



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *