Cómo extender el bloque de galería en Gutenberg

19 mar 2018, 11:12:40
Vistas: 16.1K
Votos: 17

Estoy experimentando con Gutenberg antes de su inclusión en el núcleo, y me gustaría saber cómo extender el bloque de galería existente para cambiar su visualización. Por ejemplo, en lugar de una cuadrícula de miniaturas me gustaría mostrar un slideshow de imágenes. ¿Es posible? Si es así, ¿cómo? Agradecería cualquier ayuda.

3
Comentarios

Hay un capítulo sobre Extensibilidad en el Manual de Gutenberg, que podría ser el primer paso para ver si esos filtros de la parte de Modificación de Bloques pueden utilizarse para este caso.

birgire birgire
19 mar 2018 17:59:52

Parece que este capítulo se ha añadido recientemente. No lo había visto antes. En cualquier caso, como está marcado como experimental, esta función es propensa a cambios. Esperaré hasta que sea estable. ¡Gracias!

leemon leemon
20 mar 2018 00:18:21

La siguiente documentación está más actualizada: https://github.com/WordPress/gutenberg/blob/master/docs/extensibility.md

leemon leemon
20 mar 2018 13:55:22
Todas las respuestas a la pregunta 2
1
21

Ok, he estado experimentando con esto un poco y he logrado cambiar la salida del bloque Galería, con las siguientes advertencias:

  • La vista previa no coincide con la salida. Creo que esto es posible pero parece ser un poco más complicado.
  • Ciertas clases y marcado son requeridos en la salida para que el bloque pueda analizar el contenido y mantenerlo editable. Estas clases tienen estilos en el front-end que necesitarán ser manejados. No estoy seguro en este punto si hay una manera de filtrar cómo el bloque hace esto. Si fuera posible, podría no ser una buena idea si significa que los bloques de Galería se rompen cuando un tema o plugin se desactiva. Un bloque totalmente nuevo probablemente sería el camino a seguir para situaciones donde esto sería necesario.
  • No estoy realmente seguro de cómo funcionan los tamaños de imagen en esta etapa.
  • El método de enlaces JavaScript utilizados podría no ser relevante en la versión final. Gutenberg usa @wordpress/hooks mientras que la discusión sobre qué sistema de enlaces usar en el Core está en curso.
  • Dado que la salida de los Bloques se guarda como HTML, no como un shortcode o meta, no será posible modificar la salida de Galerías existentes sin editarlas.

Lo primero que necesitamos hacer es registrar un script. Esto se hace con wp_enqueue_scripts(), pero en el hook enqueue_block_editor_assets.

El script debe tener el script wp-blocks como dependencia. Es casi seguro que ya está cargado en el editor, pero hacerlo una dependencia presumiblemente asegura que se cargue antes que nuestro script.

function wpse_298225_enqueue_block_assets() {
    wp_enqueue_script(
        'wpse-298225-gallery-block',
        get_theme_file_uri( 'block.js' ),
        ['wp-blocks']
    );
}
add_action( 'enqueue_block_editor_assets', 'wpse_298225_enqueue_block_assets' );

El HTML para la salida de un bloque es manejado por el método save() del bloque. Puedes ver el del bloque Galería en este archivo.

En esta etapa (Marzo 2018) Gutenberg soporta un filtro en el método save de los bloques, blocks.getSaveElement. Podemos agregar un hook a esto en JavaScript así:

wp.hooks.addFilter(
    'blocks.getSaveElement',
    'wpse-298225',
    wpse298225GallerySaveElement
)

El primer argumento es el nombre del hook, el segundo argumento es - creo - un namespace, y el último argumento es la función de callback.

Como estamos reemplazando el método save() del bloque, necesitamos devolver un nuevo elemento. Sin embargo, esto no es un elemento HTML normal lo que necesitamos devolver. Necesitamos devolver un elemento React.

Cuando miras el método save() original del bloque, lo que ves es JSX. React, que Gutenberg usa internamente, lo soporta para renderizar elementos. Mira este artículo para más sobre eso.

JSX normalmente requiere un paso de construcción, pero como no estoy introduciendo un paso de construcción para este ejemplo, necesitamos una manera de crear un elemento sin JSX. React proporciona esto con createElement(). WordPress proporciona un wrapper para esto y otra funcionalidad de React en forma de wp.element. Así que para usar createElement() usamos wp.element.createElement().

En la función de callback para blocks.getSaveElement obtenemos:

  • element El Elemento original creado por el bloque.
  • blockType Un objeto representando el bloque siendo usado.
  • attributes Las propiedades de la instancia del bloque. En nuestro ejemplo esto incluye las imágenes en la galería y configuraciones como el número de columnas.

Así que nuestra función de callback necesita:

  • Devolver el elemento original para galerías que no son del bloque.
  • Tomar los atributos, particularmente las imágenes, y crear un nuevo elemento React con ellos representando la galería.

Aquí hay un ejemplo completo que simplemente devuelve un ul con una clase, my-gallery, y lis para cada imagen con la clase my-gallery-item y un img en cada uno con el src establecido a la URL de la imagen.

function wpse298225GallerySaveElement( element, blockType, attributes ) {
    if ( blockType.name !== 'core/gallery' ) {
        return element;
    }

    var newElement = wp.element.createElement(
        'ul',
        {
            'className': 'wp-block-gallery my-gallery',
        },
        attributes.images.map(
            function( image ) {
                return wp.element.createElement(
                    'li',
                    {
                        'className': 'blocks-gallery-item my-gallery-item',
                    },
                    wp.element.createElement(
                        'img',
                        {
                            'src': image.url,
                        }
                    )
                )
            }
        )
    )

    return newElement
}

Algunas cosas a tener en cuenta:

  • El bloque de galería original encuentra imágenes buscando ul.wp-block-gallery .blocks-gallery-item, así que este marcado y esas clases son requeridas para que sea posible editar el bloque. Este marcado también se usa para el estilo por defecto.
  • attributes.images.map está iterando sobre cada imagen y devolviendo un array de elementos hijos como contenido para el elemento principal. Dentro de estos elementos hay otro elemento hijo para la imagen misma.
21 mar 2018 11:57:19
Comentarios

Todos los archivos vinculados devuelven error 404.

TCB13 TCB13
16 jun 2020 14:29:14
2

Aquí para proporcionar una respuesta actualizada. Encontré esta publicación extremadamente útil para responder la pregunta sobre cómo extender el Bloque de Galería.

En resumen, es recomendable crear un nuevo bloque en lugar de extender uno existente. De la publicación en mi enlace anterior:

si modificas el HTML de un bloque [al extenderlo], no será reconocido como el bloque original. En lugar de intentar manipular un bloque del núcleo, parece que anular el bloque principal y registrar un nuevo bloque de reemplazo en su lugar sería un enfoque más seguro, de esa manera te aseguras que los usuarios del sitio utilicen tu galería personalizada, que validará porque define su propia estructura HTML.

El enlace anterior también hace referencia a el plugin Create-Guten-Block que es una herramienta de línea de comandos que generará todo lo que necesitas para comenzar con la creación de Bloques. La herramienta es muy fácil de usar y de configurar.

Con estos recursos, pude descubrir cómo desarrollar un bloque de galería personalizado en poco tiempo

14 feb 2019 01:50:44
Comentarios

¿Tienes más consejos sobre cómo crear un bloque de galería? Me parece que hay una cantidad significativa de trabajo en el lado del editor para soportar todas las funciones CRUD necesarias. La solución nativa de WP maneja todo, desde subir imágenes hasta ordenarlas, agregar nuevas, eliminar las existentes, etc. La forma en que lo veo es que es mucho trabajo recrear la misma funcionalidad que viene incluida solo para personalizar el frontend.

phip phip
5 feb 2020 04:06:47

@phip han pasado unos 6 meses desde que estuve profundizando en bloques de Gutenberg, y sé que muchas cosas han cambiado al respecto. Estoy de acuerdo con lo que dices, si te entiendo correctamente. Parecía abrumador construir interfaces personalizadas para manejar operaciones CRUD.

La versión Pro de Advanced Custom Fields te permite crear esquemas de datos personalizados para bloques. Para más información, https://www.advancedcustomfields.com/resources/blocks/. Aunque disfruté aprendiendo a usar React para construir bloques, usar ACF fue un gran ahorro de tiempo.

Jeff Wilkerson Jeff Wilkerson
7 feb 2020 23:29:45