Blog

Más allá de los bloques básicos: Creación de bloques personalizados de Gutenberg para mejorar la funcionalidad de WordPress

Desbloquea todo el potencial del Editor de Bloques de WordPress aprendiendo a crear tus propios bloques personalizados de Gutenberg. Esta guía proporciona pasos prácticos, ejemplos de código y mejores prácticas para extender la funcionalidad y el diseño de tu sitio.

Resumen

El Editor de Bloques de WordPress, Gutenberg, ha revolucionado la creación de contenido con su sistema modular de bloques. Si bien los bloques principales ofrecen versatilidad, los bloques personalizados son esenciales para funcionalidades y marca únicas. Este artículo te guía a través del proceso de desarrollo de tus propios bloques de Gutenberg, cubriendo conceptos esenciales como el registro de bloques, atributos y renderizado. Exploraremos ejemplos prácticos, discutiremos las mejores prácticas para la organización y seguridad del código, y destacaremos cómo los bloques personalizados se integran con la arquitectura y los hooks de WordPress. Al dominar el desarrollo de bloques personalizados, puedes mejorar significativamente las capacidades y la experiencia de usuario de tu sitio de WordPress.

Más allá de los bloques básicos: Creación de bloques personalizados de Gutenberg para mejorar la funcionalidad de WordPress

La llegada del editor de bloques de Gutenberg en WordPress 5.0 marcó un cambio significativo en la forma en que se crea y gestiona el contenido. Alejándose del enfoque lineal del editor clásico, Gutenberg introdujo un sistema modular donde el contenido se construye utilizando "bloques" discretos. Si bien el conjunto predeterminado de bloques cubre una amplia gama de necesidades comunes, muchos sitios web requieren funcionalidades únicas, elementos de diseño específicos o integraciones que van más allá de lo que está fácilmente disponible. Aquí es donde entra en juego el desarrollo de bloques personalizados de Gutenberg, que ofrece una forma potente de extender las capacidades de WordPress y adaptarlo precisamente a las demandas de tu proyecto.

El desarrollo de bloques personalizados te permite crear componentes reutilizables que agilizan la creación de contenido para los editores, garantizan la coherencia de la marca e implementan funciones complejas directamente dentro de la interfaz del editor. Esta guía te llevará a través del proceso, desde la comprensión de los fundamentos hasta la implementación de las mejores prácticas para bloques personalizados robustos y mantenibles.

Comprensión de la arquitectura del editor de bloques

Antes de sumergirse en el desarrollo, es crucial comprender cómo funcionan Gutenberg y sus bloques dentro del ecosistema de WordPress. WordPress en sí está construido sobre una arquitectura modular de PHP y MySQL. Los temas controlan la presentación y los plugins agregan funcionalidad. Gutenberg, como característica principal de WordPress, se integra perfectamente en esta estructura. Utiliza JavaScript (principalmente React) para su experiencia de edición dinámica en el navegador, mientras que PHP maneja el registro y renderizado del lado del servidor.

Los bloques personalizados son esencialmente componentes de JavaScript que se registran en WordPress. Cuando un usuario agrega un bloque personalizado a una publicación o página, Gutenberg almacena su configuración (atributos) en la base de datos. Al renderizar la publicación en el front-end, WordPress utiliza PHP para interpretar esta configuración y generar el HTML apropiado, a menudo utilizando el mismo componente de JavaScript o una plantilla PHP separada.

Los componentes centrales de un bloque personalizado

Cada bloque personalizado de Gutenberg, en su esencia, consta de varias partes clave:

  1. Registro: Este es el proceso de informar a WordPress sobre tu nuevo bloque. Implica definir su nombre, título, icono y otros metadatos. Esto se hace principalmente utilizando la función registerBlockType de JavaScript.
  2. Atributos: Estos son los campos de datos asociados con tu bloque. Piénsalos como la configuración o las propiedades que un usuario puede modificar para una instancia específica del bloque (por ejemplo, contenido de texto, URL de imagen, elección de color). Los atributos se definen en el registro de JavaScript del bloque.
  3. Función edit: Esta función de JavaScript define cómo aparece y se comporta el bloque dentro del editor de Gutenberg. Es donde construyes la interfaz de usuario interactiva que los creadores de contenido utilizarán para configurar el bloque.
  4. Función save: Esta función de JavaScript define el marcado HTML estático que se guardará en la base de datos y se renderizará en el front-end de tu sitio web. Debe reflejar el estado actual de los atributos del bloque.

Paso a paso: Creación de tu primer bloque personalizado

Creemos un bloque personalizado simple que muestre un "Llamado a la acción" (CTA) con un titular y un botón. Este ejemplo se centrará en los aspectos esenciales de JavaScript para el registro y la edición de bloques, asumiendo que se ha configurado un entorno de desarrollo básico de WordPress.

Prerrequisitos:

  • Un entorno de desarrollo local de WordPress.
  • Comprensión básica de JavaScript, React y PHP.
  • Node.js y npm (o yarn) instalados para la compilación de activos.

1. Configuración del proyecto:

Los bloques personalizados se desarrollan típicamente como parte de un plugin. Crea un archivo de plugin nuevo (por ejemplo, my-custom-blocks/my-custom-blocks.php) y un archivo JavaScript para tu bloque (por ejemplo, src/index.js). También necesitarás un proceso de compilación para compilar tu JavaScript. Un enfoque común es usar @wordpress/scripts, que proporciona una forma conveniente de manejar la compilación.

En el directorio raíz de tu plugin, crea un archivo package.json:

{
  "name": "my-custom-blocks",
  "version": "1.0.0",
  "description": "Un plugin para bloques personalizados de Gutenberg.",
  "main": "index.js",
  "scripts": {
    "build": "wp-scripts build",
    "start": "wp-scripts start"
  },
  "keywords": ["wordpress", "gutenberg", "block"],
  "author": "Tu Nombre",
  "license": "GPL-2.0-or-later",
  "devDependencies": {
    "@wordpress/scripts": "^26.0.0" 
  }
}

Instala las dependencias: npm install.

2. Registro del bloque (JavaScript):

En tu archivo src/index.js, usarás registerBlockType del paquete @wordpress/blocks.

import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';

// Importa componentes para el editor
import { Edit } from './edit';
import { Save } from './save';

registerBlockType( 'my-custom-blocks/cta', {
    title: __( 'Llamada a la acción', 'my-custom-blocks' ),
    icon: 'megaphone',
    category: 'widgets',
    attributes: {
        headline: {
            type: 'string',
            default: '',
        },
        buttonText: {
            type: 'string',
            default: 'Más información',
        },
        buttonUrl: {
            type: 'string',
            default: '#',
        },
    },
    edit: Edit,
    save: Save,
} );

3. Definición de la interfaz del editor (src/edit.js):

Este componente maneja cómo se ve y funciona el bloque dentro del editor.

import { __ } from '@wordpress/i18n';
import { useBlockProps, RichText, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, TextControl } from '@wordpress/components';

export const Edit = ( { attributes, setAttributes } ) => {
    const blockProps = useBlockProps();

    const onChangeHeadline = ( newHeadline ) => {
        setAttributes( { headline: newHeadline } );
    };

    const onChangeButtonText = ( newButtonText ) => {
        setAttributes( { buttonText: newButtonText } );
    };

    const onChangeButtonUrl = ( newButtonUrl ) => {
        setAttributes( { buttonUrl: newButtonUrl } );
    };

    return (
        <>
            <InspectorControls>
                <PanelBody title={ __( 'Configuración del botón', 'my-custom-blocks' ) }>
                    <TextControl
                        label={ __( 'Texto del botón', 'my-custom-blocks' ) }
                        value={ attributes.buttonText }
                        onChange={ onChangeButtonText }
                    />
                    <TextControl
                        label={ __( 'URL del botón', 'my-custom-blocks' ) }
                        value={ attributes.buttonUrl }
                        onChange={ onChangeButtonUrl }
                    />
                </PanelBody>
            </InspectorControls>
            <div { ...blockProps }>
                <RichText
                    tagName="h3"
                    placeholder={ __( 'Introduce tu titular aquí...', 'my-custom-blocks' ) }
                    value={ attributes.headline }
                    onChange={ onChangeHeadline }
                    allowedFormats={ [ 'core/bold', 'core/italic' ] }
                />
                <a href={ attributes.buttonUrl } className="wp-element-button">
                    { attributes.buttonText }
                </a>
            </div>
        </>
    );
};

4. Definición de la función save (src/save.js):

Esta función determina la salida HTML para el front-end.

import { useBlockProps, RichText } from '@wordpress/block-editor';

export const Save = ( { attributes } ) => {
    const blockProps = useBlockProps.save();

    return (
        <div { ...blockProps }>
            <RichText.Content
                tagName="h3"
                value={ attributes.headline }
            />
            <a href={ attributes.buttonUrl } className="wp-element-button">
                { attributes.buttonText }
            </a>
        </div>
    );
};

5. Encolado del script del bloque (PHP):

En tu archivo de plugin principal (my-custom-blocks.php), necesitas registrar y encolar tu archivo JavaScript compilado.

<?php
/**
 * Nombre del plugin: Mis Bloques Personalizados
 * Descripción: Agrega bloques personalizados de Gutenberg.
 * Versión: 1.0
 * Autor: Tu Nombre
 */

function my_custom_blocks_register_block() {
    // Carga automáticamente el archivo block.json y encola el script.
    register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'my_custom_blocks_register_block' );
?>

6. Compilación de los activos:

Ejecuta npm run build en el directorio de tu plugin. Esto compilará tu JavaScript en la carpeta build.

Ahora, activa el plugin en WordPress. ¡Deberías ver tu bloque "Llamada a la acción" disponible en el editor!

Mejores prácticas para el desarrollo de bloques personalizados

El desarrollo de bloques personalizados va más allá de simplemente hacerlos funcionales. Adherirse a las mejores prácticas garantiza que tus bloques sean seguros, eficientes, accesibles y mantenibles.

  • Espacios de nombres: Utiliza siempre un espacio de nombres único para tu bloque (por ejemplo, my-custom-blocks/cta). Esto evita conflictos con otros bloques. La función registerBlockType se encarga de esto.
  • Organización del código: Mantén tu código JavaScript y PHP limpio y bien organizado. Para bloques complejos, considera dividir tu JavaScript en componentes más pequeños y reutilizables.
  • Seguridad:
    • Sanitización: Al guardar datos en la base de datos (especialmente contenido generado por el usuario), siempre sanitízalo. WordPress proporciona funciones como sanitize_text_field, esc_url, etc.
    • Escapado: Al mostrar datos en el navegador, siempre escápalo para evitar ataques de Cross-Site Scripting (XSS). Utiliza funciones como esc_html, esc_attr, esc_url.
    • Nonces: Para cualquier solicitud AJAX o envío de formularios relacionados con tu bloque, utiliza nonces para verificar que la solicitud se origina en una fuente legítima de WordPress.
  • Internacionalización (i18n): Utiliza las funciones __() y _x() (de @wordpress/i18n) para todas las cadenas dirigidas al usuario en tu JavaScript. Esto hace que tu bloque sea traducible.
  • Accesibilidad: Asegúrate de que tu bloque sea utilizable por todos. Utiliza HTML semántico, proporciona atributos ARIA cuando sea necesario y prueba con lectores de pantalla.
  • Rendimiento:
    • Carga diferida: Para bloques que cargan activos pesados o datos complejos, considera implementar técnicas de carga diferida.
    • Renderizado eficiente: Optimiza tu función save y cualquier renderizado del lado del servidor para que sea lo más eficiente posible.
    • Encolado de activos: Solo encola los scripts y estilos necesarios para tu bloque. Utiliza enqueue_block_style y enqueue_block_script_handle para activos específicos del bloque.
  • Modularidad y extensibilidad: Aprovecha los hooks (acciones y filtros) de WordPress en tu PHP para permitir que otros plugins o temas modifiquen el comportamiento o la salida de tu bloque.
  • block.json: Para bloques más complejos, utiliza un archivo block.json para declarar metadatos del bloque, dependencias, estilos y manejadores de scripts. Este es el estándar moderno para el desarrollo de bloques y simplifica la gestión de activos.

Integración con la arquitectura de WordPress

Los bloques personalizados no son entidades aisladas. Se integran profundamente con la arquitectura central de WordPress:

  • Hooks: Puedes usar acciones y filtros de PHP en tu plugin para modificar el registro de bloques, agregar estilos o scripts personalizados condicionalmente, o incluso alterar la salida renderizada de los bloques principales. Por ejemplo, podrías usar el filtro block_type_metadata_settings para modificar la configuración de un bloque registrado.
  • Integración con temas: Los temas basados en bloques y la Edición Completa del Sitio (FSE) dependen en gran medida de los bloques. Los bloques personalizados se pueden diseñar para integrarse perfectamente en las plantillas de FSE, lo que permite a los usuarios crear sitios completos utilizando un flujo de trabajo coherente basado en bloques.
  • Interoperabilidad de plugins: Tus bloques personalizados pueden interactuar con otros plugins. Por ejemplo, un bloque de producto personalizado podría extraer datos de un plugin de comercio electrónico, o un bloque de galería personalizado podría integrarse con un plugin específico de biblioteca de medios.

Conceptos avanzados y consideraciones

  • Renderizado del lado del servidor (SSR): Para bloques que requieren datos dinámicos o lógica compleja que se maneja mejor en el servidor, puedes implementar el renderizado del lado del servidor. Esto implica definir una función render_callback en tu PHP al registrar el bloque.
  • Bloques dinámicos: Los bloques que utilizan SSR a menudo se denominan bloques dinámicos. No guardan HTML estático en la base de datos; en cambio, solo guardan sus atributos, y el render_callback genera el HTML en cada carga de página.
  • Estilos de bloque: Puedes definir estilos personalizados para tus bloques que los usuarios pueden seleccionar dentro del editor.
  • Variaciones de bloque: Crea variaciones de un bloque base para ofrecer versiones preconfiguradas con diferentes configuraciones o apariencias predeterminadas.
  • Diferencias entre editor y front-end: Ten en cuenta que las funciones edit y save podrían necesitar manejar diferentes escenarios. La función edit es para la experiencia de edición interactiva, mientras que la función save es para la salida HTML estática. A veces, podrías necesitar un render_callback separado para el renderizado dinámico del front-end.

Conclusión

El desarrollo de bloques personalizados de Gutenberg es una habilidad poderosa que desbloquea un nuevo nivel de personalización y funcionalidad para los sitios web de WordPress. Al comprender los componentes centrales (registro, atributos, funciones edit y save) y adherirse a las mejores prácticas de seguridad, rendimiento y accesibilidad, puedes crear bloques robustos, reutilizables y fáciles de usar. Ya sea que estés creando un plugin personalizado para un cliente o mejorando tu propio sitio, dominar los bloques personalizados elevará significativamente tus capacidades de desarrollo de WordPress, permitiéndote ir más allá de las ofertas estándar y crear experiencias digitales verdaderamente únicas.

Sources (5)