1 of 68

¿Realmente necesitas desarrollar �un bloque nuevo?

JuanMa Garrido

Veamos algunas alternativas

2 of 68

JuanMa Garrido

WordPress & Javascript Developer

Developer Relations en

juanmagarrido

juanmaguitar

3 of 68

En WordPress 2025... TODO son bloques

  • El editor de bloques es el núcleo de la experiencia.
  • No solo contenido: diseño, plantillas, patrones... todo.

Intro

4 of 68

Intro

5 of 68

Muchos bloques listos para usar

Intro

6 of 68

…pero también puedo crear

mis propios bloques

Intro

7 of 68

¿Necesito entonces desarrollar un bloque nuevo desde cero…

A veces , pero muchas veces

💡 hay alternativas más rápidas y sostenibles

…si el bloque que necesito no existe?

Intro

8 of 68

Desarrollo de bloques

Intro

9 of 68

APIs de desarrollo sobre bloques registrados

  • Block Styles
  • Block Variations
  • Filters and Hooks (Server)
  • Hooks (Block Editor)
  • Block Bindings
  • Block Patterns

10 of 68

Block Styles

Los Block Styles permiten crear estilos alternativos para bloques individuales.

11 of 68

Block Styles

12 of 68

Block Styles

13 of 68

Block Styles

14 of 68

Block Variations

La “Block Variations API” nos permite definir multiples versiones (variations) de un bloque. Cuando insertamos una “block variation”, aplicamos de golpe una serie de atributos y/o inner blocks definidos para esa variación

15 of 68

Block Variations

16 of 68

Se añaden a la metadata de un block (propiedad variations de block.json)

Se registran con wp.blocks.registerBlockVariation (JS)

Se pueden registrar via PHP con el filtro get_block_type_variations

Block Variations

17 of 68

Block Variations

18 of 68

Block Variations

19 of 68

Filtros PHP

A través de filtros PHP (addFilter) podemos interceptar procesos del servidor relacionados con los bloques, como su registro o su salida renderizada, para customizar bloques existentes.

20 of 68

Filtra el contenido de TODOS los bloques registrados.

Es posible que necesitemos agregar condiciones internas para aplicar nuestra lógica sólo a algunos bloques.

Se puede usar para:

  • Filtrar la salida renderizada de varios bloques
  • Cargar archivos JS o estilos adicionales para bloques específicos

render_block

Filtros PHP

21 of 68

render_block_{$this->name}

Filtra el contenido de un bloque específico.

Es posible que necesitemos agregar condiciones internas para aplicar nuestra lógica sólo a algunos bloques de ese tipo.

Se puede usar para:

  • Filtrar la salida renderizada de un bloque específico
  • Cargar archivos JS o estilos adicionales para un bloque específico

Filtros PHP

22 of 68

Filtros PHP

23 of 68

Filtra los argumentos proporcionados (metadatos y otros) para registrar un tipo de bloque.

Se puede usar para:

  • Modificar o agregar cualquier metadata del block.json (variaciones, atributos, supports…) o cualquier otro argumento (como render_callback) antes del registro (con register_block_type)

Otros filtros para filtrar (sólo) metadatos antes del registro son: block_type_metadata y block_type_metadata_settings

register_block_type_args

Filtros PHP

24 of 68

Filtros PHP

25 of 68

Filtros JS

A través de filtros JS (wp.hooks.addFilter) podemos customizar el comportamiento de bloques existentes en el Editor de Bloques.

26 of 68

Filtra la configuración del bloque al registrarlo en el cliente con JavaScript.

Es posible que necesitemos agregar condiciones internas para aplicar nuestra lógica sólo a algunos bloques.

Se puede usar para:

  • Añadir atributos (o cualquier otro metadato) al bloque antes de ser registrado en el Editor de Bloques

blocks.registerBlockType

Filtros JS

27 of 68

Filtros JS

28 of 68

Modifica el componente de edición del bloque. Recibe el componente original BlockEdit del bloque y devuelve un nuevo componente envuelto (Higher order component).

Es posible que necesitemos agregar condiciones internas para aplicar nuestra lógica sólo a algunos bloques.

Se puede usar para:

  • Añadir controles de bloque (BlockControls o InspectorControls)
  • Pasar props especificas al componente BlockEdit

editor.BlockEdit

Filtros JS

29 of 68

Filtros JS

30 of 68

Modifica el resultado de la función save de un bloque

Se puede usar para reemplazar o extender el marcado del bloque antes de ser guardado en la BD.

blocks.getSaveElement

Filtros JS

31 of 68

Filtros JS

32 of 68

A través de los Block Bindings podemos “vincular” datos dinámicos a los atributos del bloque, que quedan reflejados en el marcado HTML final que se genera para el front-end.

Block Bindings

33 of 68

Block Bindings

34 of 68

Block Bindings

35 of 68

Podemos utilizar fuentes de datos como “custom fields” u otras que definamos a medida

Podemos registrar fuentes de datos en el servidor con register_block_bindings_source

�Podemos registrar fuentes de datos en el cliente (Editor de Bloques) con registerBlockBindingsSource y hacer los valores editables

Los Block Bindings nos permiten proporcionar una o varias fuentes dinámicas para el valor de un atributo de un bloque.

Block Bindings

36 of 68

Un patrón de bloques (Block Pattern) es un grupo de bloques, preconfigurados y presentados al usuario para ser reutilizados.

Block Patterns

37 of 68

Podemos registrar patrones desde themes (patterns folder) o desde plugins (register_block_pattern)

Podemos insertar patrones en templates (Site Editor) o en nuestro contenido (Post Editor)

Block Patterns

38 of 68

Los componentes de un patrón se pueden bloquear (Block Locking API) para que no puedan ser movidos o borrados.

Block Patterns

39 of 68

Podemos controlar qué bloques se pueden insertar en el patrón (allowedBlocks attribute - no UI)

Block Patterns

40 of 68

Podemos limitar que sólo se puedan hacer cambios al contenido (templateLock: content attribute - no UI)

Block Patterns

41 of 68

Block Patterns

42 of 68

Podemos crear patrones sincronizados (antes “bloques reutilizables”) donde los cambios en el patrón original son aplicados a todas las instancias del patrón

En estos patrones sincronizados también podemos definir sobreescrituras (overrides) para poder customizar valores en la instancia sin afectar al patrón original

Block Patterns

43 of 68

Block Patterns

44 of 68

Block Patterns

45 of 68

Ejemplos

46 of 68

Hand Drawn: versión de estilo de core/quote que aplica un borde como escrito a a mano

47 of 68

Ejemplos: Hand Drawn

48 of 68

👉 register_block_style("core/quote", array(...) ); → Creamos una variación de estilo del bloque "core/quote" llamada “Hand Drawn”

👉 Le pasamos los estilos inline

👉 Al registrarlo en el servidor se podría tunear desde el theme via theme.json

Ejemplos: Hand Drawn

49 of 68

Ejemplos: Hand Drawn

50 of 68

Quote API Editor: versión ampliada de core/quote que permite cargar citas de autores (de una API externa) desde el Editor de Bloques

51 of 68

Ejemplos: Quote API Editor

52 of 68

Ejemplos: Quote API Editor

53 of 68

👉 enqueue_block_editor_assets → Cargamos el JS en el editor (wp_enqueue_script) con este filtro

👉 addFilter(blocks.registerBlockType,...) → Ampliamos los atributos de "core/quote" para incluir un atributo namespace (que utilizaremos para distinguir variaciones)

👉 registerBlockVariation("core/quote", {...}); → Creamos una variación del bloque "core/quote" llamada “Quote API Editor” con el atributo namespace = "quote-api-editor"

Ejemplos: Quote API Editor

54 of 68

Ejemplos: Quote API Editor

55 of 68

Ejemplos: Quote API Editor

56 of 68

👉 addFilter(editor.BlockEdit,...) → Ampliamos el Edit component de nuestra variación para:�- incluir paneles de control exclusivos�- añadir la lógica de obtener datos de la API �- insertar la cita obtenida en nuestra variación del bloque

👉 Utilizamos nuestro atributo namespace para filtrar nuestra variación

Ejemplos: Quote API Editor

57 of 68

Ejemplos: Quote API Editor

58 of 68

Ejemplos: Quote API Editor

59 of 68

Quote API Frontend: versión ampliada de core/quote que permite cargar citas random en el Frontend (de una API externa) en base a unos tags

60 of 68

Ejemplos: Quote API Frontend

61 of 68

👉 enqueue_block_editor_assets → Cargamos el JS en el editor (wp_enqueue_script) con este filtro

👉 addFilter(blocks.registerBlockType,...) → Ampliamos los atributos de "core/quote" para incluir un atributo namespace (que utilizaremos para distinguir variaciones) y otro atributo tags

👉 registerBlockVariation("core/quote", {...}); → Creamos una variación del bloque "core/quote" llamada “Quote API Frontend” con el atributo namespace = "quote-api-frontend"

Ejemplos: Quote API Frontend

62 of 68

Ejemplos: Quote API Frontend

63 of 68

Ejemplos: Quote API Frontend

64 of 68

👉 addFilter(editor.BlockEdit,...) → Ampliamos el Edit component de nuestra variación para:�- incluir paneles de control exclusivos�- añadir los tags como atributos del bloque

👉 render_block_core/quote → Filtramos el renderizado para el frontend para que incluya nuestra lógica de obtener las quotes desde la API y devolver el marcado correcto

Ejemplos: Quote API Frontend

65 of 68

Ejemplos: Quote API Frontend

66 of 68

Interactive Video Player: versión ampliada de un patrón que permite reproducir un video al pulsar un botón

67 of 68

👉 register_block_pattern → Registramos nuestro patrón al que le añadimos la clase interactive-video al bloque container

👉 render_block_core/group → Filtramos el renderizado para el frontend de nuestro patrón

  • WP_HTML_Tag_Processor → añadimos las directivas de la Interactivity API
  • wp_enqueue_script_module → Cargamos el JS (como módulo) en el frontend con la lógica de la Interactivity API

��

Ejemplos: Interactive Video Player

68 of 68

¡Gracias!

Hago streams sobre desarrollo WordPress (sobre todo de bloques) los viernes a las 17:00 (hora española)

/juanma_codes

/@juanmacodes/streams