Cómo modificar un bloque de imagen en Gutenberg WordPress 5

18 ene 2019, 05:02:32
Vistas: 13.8K
Votos: 7

Agregar imágenes a una publicación con el editor de bloques:

ejemplo de imagen en editor Gutenberg

genera el siguiente código figure:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="texto alternativo" class="wp-image-1391"/>
    <figcaption>Esta es una prueba de imagen.</figcaption>
</figure>

pero estoy usando Bootstrap 4 y me gustaría agregar Espaciado (como mt-2) y eliminar la clase de imagen wp-image-1391, resultado:

<figure class="mt-2">
    <img src="http://localhost:8888/time.png" alt="texto alternativo" class="img-fluid"/>
    <figcaption>Esta es una prueba de imagen.</figcaption>
</figure>

o poder modificarlo a un div:

<div class="mt-2">
    <img src="http://localhost:8888/time.png" alt="texto alternativo" class="img-fluid"/>
    <figcaption>Esta es una prueba de imagen.</figcaption>
</div>

Investigando encontré get_image_tag_class pero probando:

function ejemplo_agregar_clase_img($class) {
    return $class . ' img-fluid';    
}
add_filter('get_image_tag_class','ejemplo_agregar_clase_img');

no funciona. Leyendo "Cómo evitar que WordPress agregue clases extra a elementos en el editor WYSIWYG" probé:

add_filter('get_image_tag_class','__return_empty_string');

pero tampoco funciona. Puedo modificar el <img> con un preg_replace usando el filtro the_content:

function agregar_clase_img_fluid($content) {
    global $post;
    $patron        = "/<img(.*?)class=\"(.*?)\"(.*?)>/i";
    $reemplazo    = '<img$1class="$2 img-fluid"$3>';
    $content        = preg_replace($patron,$reemplazo,$content);
    return $content;
 }
 add_filter('the_content','agregar_clase_img_fluid');

function img_responsive($content){
    return str_replace('<img class="','<img class="img-responsive ',$content);
}
add_filter('the_content','img_responsive');

pero he leído que usar regex en the_content puede dar resultados inconsistentes. Podría resolverlo con CSS simple:

figure img {
    width:100%;
    height:auto;
}
figure figcaption {
    text-align:center;
    font-size:80%;
}

pero me gustaría entender mejor qué filtros puedo usar para modificar WordPress. ¿Cómo puedo agregar y eliminar clases y cambiar figure a div?

2
Comentarios

Me gustaría saber esto también, tengo una solución alternativa pero a futuro me gustaría saber cómo personalizar estos bloques predeterminados.

RiddleMeThis RiddleMeThis
18 ene 2019 06:58:27

Estaba a punto de destrozar el código PHP de mi tema cuando descubrí que todas las imágenes se estiraban debido a la nueva funcionalidad de carga diferida (supongo) +1 por señalar una solución fácil!

Matt Rek Matt Rek
8 may 2021 19:17:58
Todas las respuestas a la pregunta 4
2

Después de investigar y probar varias opciones, he encontrado un par de soluciones. Estaba buscando una solución para "Gutenberg" para evitar usar str_replace.

Primero, necesitamos encolar nuestro JS e incluir el paquete wp.blocks

// Añadir a functions.php

function gutenberg_enqueue() {
    wp_enqueue_script(
        'myguten-script',
        // get_template_directory_uri() . '/js/gutenberg.js', // Para temas padres
        get_stylesheet_directory_uri() . '/js/gutenberg.js', // Para temas hijos
        array('wp-blocks') // Incluir el paquete wp.blocks             
    );
}

add_action('enqueue_block_editor_assets', 'gutenberg_enqueue');

A continuación, encontré un par de soluciones, la primera probablemente sea la mejor para tu caso específico.

Método #1

Usar una función de filtro para sobrescribir la clase predeterminada. En este caso, vamos a mantener la clase "wp-block-image" y simplemente añadir la clase de Bootstrap mt-2. Pero fácilmente podrías añadir cualquier clase que necesites. Añade el código siguiente y crea un nuevo bloque de imagen, inspecciónalo para ver que la etiqueta figure ahora tiene la nueva clase.

// Añadir a tu archivo JS

function setBlockCustomClassName(className, blockName) {
    return blockName === 'core/image' ?
        'wp-block-image mt-2' :
        className;
}

wp.hooks.addFilter(
    'blocks.getBlockDefaultClassName',
    'my-plugin/set-block-custom-class-name',
    setBlockCustomClassName
);

Método #2

Añadir un ajuste en la configuración de estilos del bloque en la barra lateral para añadir una clase a la imagen.

// Añadir a tu archivo JS

wp.blocks.registerBlockStyle('core/image', {
    name: 'test-image-class',
    label: 'Clase de prueba'
});

Clase de prueba añadida al bloque de imagen

Esto añadirá tu clase, pero desafortunadamente Gutenberg antepone is-style- antes de la clase, resultando en is-style-test-image-class. Tendrías que ajustar tu CSS en consecuencia.


Método #3

Añadir manualmente la clase mediante la opción Bloque > Avanzado > Clase CSS adicional. Obviamente, la clase tendría que añadirse para cada bloque de imagen.

Añadir clase CSS manualmente en Gutenberg


Nota: Al añadir o editar cualquiera de los JS anteriores, necesité eliminar el bloque, actualizar la página y volver a añadir el bloque para evitar un error de validación del bloque.

Referencias:

Variaciones de Estilo de Bloques

blocks.getBlockDefaultClassName

18 ene 2019 20:04:58
Comentarios

Genial, ¿no podríamos también añadir el 3er método usando los ajustes avanzados del bloque de imagen para añadir manualmente una clase CSS a la imagen correspondiente :-)

birgire birgire
18 ene 2019 22:52:10

¡jaja sí! Pasé por alto añadir eso :) Actualizaré la respuesta

RiddleMeThis RiddleMeThis
18 ene 2019 22:54:01
0

Usa el filtro render_block:

add_filter( 'render_block', 'wrap_my_gallery_block', 10, 2 );

function wrap_my_gallery_block( $block_content, $block ) {

    if ( 'core/gallery' !== $block['blockName'] ) {
        return $block_content;
    }

    $return  = 'my-gallery-block<div class="my-gallery-block">';
    $return .= $block_content;
    $return .= '</div>';

    return $return;
}

Funciona en WP 5.5.

Referencia: https://wordpress.org/support/topic/modify-gutenberg-core-block-render-result/#post-11716464

20 ago 2020 02:11:21
5

La siguiente respuesta es una solución para Bootstrap 4 y centrar imágenes en una etiqueta <figure>.

Generado por WordPress por defecto:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="texto alternativo" class="wp-image-1391"/>
    <figcaption>Esta es una prueba de imagen.</figcaption>
</figure>

Usando preg_replace() y the_content:

function add_image_fluid_class($content) {
    global $post;
    $pattern        = "/<figure class=\"[A-Za-z-]*\"><img (.*?)class=\".*?\"(.*?)><figcaption>(.*?)<\/figcaption><\/figure>/i";
    $replacement    = '<figure class="text-center my-3"><img class="figure-img img-fluid" $1$2><figcaption class="text-muted">$3</figcaption></figure>';
    $content        = preg_replace($pattern,$replacement,$content);
    return $content;
 }
 add_filter('the_content','add_image_fluid_class');

producirá:

<figure class="text-center my-3">
    <img class="figure-img img-fluid" src="http://localhost:8888/time.png" alt="texto alternativo" />
    <figcaption class="text-muted">Esta es una prueba de imagen.</figcaption>
</figure>

El código podría acortarse a:

function add_image_fluid_class($content) {
    global $post;
    $pattern        = "/<figure class=\"[A-Za-z-]*\"><img (.*?)class=\".*?\"(.*?)><figcaption>/i";
    $replacement    = '<figure class="text-center my-3"><img class="figure-img img-fluid" $1$2><figcaption class="text-muted">';
    $content        = preg_replace($pattern,$replacement,$content);
    return $content;
 }
 add_filter('the_content','add_image_fluid_class');

Si quisieras añadir <small> podrías hacerlo así:

function add_image_fluid_class($content) {
    global $post;
    $pattern       = "/<figure class=\"[A-Za-z-]*\"><img (.*?)class=\".*?\"(.*?)><figcaption>(.*?)<\/figcaption><\/figure>/i";
    $replacement   = '<figure class="text-center my-3"><img class="figure-img img-fluid" $1$2><figcaption class="text-muted"><small>$3</small></figcaption></figure>';
    $content       = preg_replace($pattern,$replacement,$content);
    return $content;
 }
 add_filter('the_content','add_image_fluid_class');

El resultado en el backend es el bloque de imagen sin selección de alineación:

captura de pantalla del bloque de imagen en el editor

Publicación renderizada:

imagen centrada con pie de foto en la publicación

18 ene 2019 17:08:26
Comentarios

Es bueno saber que esta es una opción, al final encontré lo que probablemente sea el método preferido, mira mi respuesta.

RiddleMeThis RiddleMeThis
18 ene 2019 20:09:02

También se puede usar el filtro render_block (PHP) para apuntar a un bloque específico.

birgire birgire
18 ene 2019 22:45:15

¿No lo has hecho? ¿Tienes algún ejemplo que puedas mostrar?

user9447 user9447
18 ene 2019 23:42:10

He publicado dos aquí recientemente https://wordpress.stackexchange.com/search?q=user%3A26350+render_block

birgire birgire
19 ene 2019 01:57:27

@DᴀʀᴛʜVᴀᴅᴇʀ Se ve bien pero ¿funcionará en versiones futuras fuera del área de contenido para la edición completa del sitio?

Brad Dalton Brad Dalton
11 nov 2021 10:32:29
1

La mejor manera de manejar problemas en el frontend de bloques principales es "sobrescribir el renderizado de bloques principales"

ejemplo:

<?php
function foo_gallery_render( $attributes, $content ) {
    /**
     * Aquí encontrarás un array con los IDs de todas 
     * las imágenes que están en tu galería.
     * 
     * por ejemplo: 
     * $attributes = [
     *     "ids" => [ 12, 34, 56, 78 ]
     * ]
     *
     * ¡Ahora diviértete consultándolas,
     * organizándolas y devolviendo tu marcado personalizado!
    */
    return '<h1>Galería renderizada personalizada</h1>';
}
function foo_register_gallery() {
    register_block_type( 'core/gallery', array(
        'render_callback' => 'foo_gallery_render',
    ) );
}
add_action( 'init', 'foo_register_gallery' );

Esto funciona para todos los bloques principales de Gutenberg, lo que significa que puedes aprovechar los excelentes bloques ya desarrollados y organizar su salida como desees.

Referencia: https://antistatique.net/en/we/blog/2019/01/29/gutenberg-override-core-blocks-rendering

4 dic 2019 09:19:11
Comentarios

Gracias, en mi opinión, esta es la mejor solución.

user3135691 user3135691
8 may 2020 21:27:29