Come modificare un blocco immagine in Gutenberg WordPress 5?

18 gen 2019, 05:02:32
Visualizzazioni: 13.8K
Voti: 7

Aggiungere immagini a un post con l'editor a blocchi:

Aggiunta di un'immagine nell'editor Gutenberg

genera il codice figure:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="testo alternativo" class="wp-image-1391"/>
    <figcaption>Questo è un test dell'immagine.</figcaption>
</figure>

ma sto usando Bootstrap 4 e vorrei aggiungere Spaziature (come mt-2) e rimuovere la classe dell'immagine wp-image-1391, risultato:

<figure class="mt-2">
    <img src="http://localhost:8888/time.png" alt="testo alternativo" class="img-fluid"/>
    <figcaption>Questo è un test dell'immagine.</figcaption>
</figure>

o poterlo modificare in un div:

<div class="mt-2">
    <img src="http://localhost:8888/time.png" alt="testo alternativo" class="img-fluid"/>
    <figcaption>Questo è un test dell'immagine.</figcaption>
</div>

Ricercando ho trovato get_image_tag_class ma testando:

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

non funziona. Leggendo "Come posso evitare che WordPress aggiunga classi extra agli elementi nell'editor WYSIWYG" ho provato:

add_filter('get_image_tag_class','__return_empty_string');

ma non funziona. Posso modificare il <img> con un preg_replace usando il filtro the_content:

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

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

ma ho letto che puntare the_content con regex può dare risultati variabili. Potrei risolvere il problema con un semplice CSS:

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

ma vorrei capire meglio quali filtri posso usare per modificare WordPress. Come posso aggiungere e rimuovere classi e cambiare figure in un div?

2
Commenti

Anch'io vorrei saperlo, ho una soluzione alternativa ma in futuro mi piacerebbe sapere come personalizzare questi blocchi predefiniti.

RiddleMeThis RiddleMeThis
18 gen 2019 06:58:27

Ero pronto a smontare il codice php del mio tema pezzo per pezzo quando ho scoperto che tutte le immagini vengono allungate a causa della nuova funzionalità di lazy loading (credo) +1 per aver indicato una soluzione semplice!

Matt Rek Matt Rek
8 mag 2021 19:17:58
Tutte le risposte alla domanda 4
2

Dopo alcune ricerche e tentativi/errori, ho trovato un paio di soluzioni. Cercavo una soluzione "Gutenberg" per evitare di usare str_replace.

Innanzitutto, dobbiamo caricare il nostro JS e includere il pacchetto wp.blocks

// Aggiungi a functions.php

function gutenberg_enqueue() {
    wp_enqueue_script(
        'myguten-script',
        // get_template_directory_uri() . '/js/gutenberg.js', // Per temi genitore
        get_stylesheet_directory_uri() . '/js/gutenberg.js', // Per temi figlio
        array('wp-blocks') // Includi il pacchetto wp.blocks             
    );
}

add_action('enqueue_block_editor_assets', 'gutenberg_enqueue');

Successivamente, ho trovato un paio di soluzioni, la prima è probabilmente la migliore per il tuo caso d'uso specifico.

Metodo #1

Usa una funzione di filtro per sovrascrivere la classe predefinita. In questo caso manterremo la classe "wp-block-image" e aggiungeremo solo la classe bootstrap necessaria mt-2. Ma potresti facilmente aggiungere qualsiasi classe desiderata. Aggiungi il codice qui sotto e crea un nuovo blocco immagine, ispezionalo per vedere che il tag figure ora ha la nuova classe.

// Aggiungi al tuo file 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
);

Metodo #2

Aggiungi un'impostazione nelle impostazioni degli stili dei blocchi nella barra laterale per aggiungere una classe all'immagine.

// Aggiungi al tuo file JS

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

descrizione dell'immagine

Questo aggiungerà la tua classe ma sfortunatamente Gutenberg antepone is-style- prima della classe, quindi il risultato sarà is-style-test-image-class. Dovresti adattare il tuo CSS di conseguenza.


Metodo #3

Aggiunta manuale della classe tramite l'opzione Blocco > Avanzato > Classe CSS aggiuntiva. Ovviamente, la classe dovrebbe essere aggiunta per ogni blocco immagine.

descrizione dell'immagine


Nota: Quando aggiungi o modifichi uno degli JS sopra, ho dovuto eliminare il blocco, aggiornare la pagina e poi riaggiungere il blocco per evitare un errore di validazione del blocco.

Riferimenti:

Variazioni di stile dei blocchi

blocks.getBlockDefaultClassName

18 gen 2019 20:04:58
Commenti

Bello, non potremmo anche aggiungere il 3° metodo utilizzando le impostazioni avanzate del blocco immagine per aggiungere manualmente una classe CSS all'immagine corrispondente :-)

birgire birgire
18 gen 2019 22:52:10

haha sì! Mi è sfuggito di aggiungerlo :) Aggiornerò la risposta

RiddleMeThis RiddleMeThis
18 gen 2019 22:54:01
0

Usa l'hook del 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;
}

Funziona su WP 5.5.

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

20 ago 2020 02:11:21
5

La seguente risposta è una soluzione per Bootstrap 4 e il centraggio delle immagini in un tag <figure>.

Default generato da WordPress:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="testo alternativo" class="wp-image-1391"/>
    <figcaption>Questo è un test di immagine.</figcaption>
</figure>

Utilizzando preg_replace() e 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');

produrrà:

<figure class="text-center my-3">
    <img class="figure-img img-fluid" src="http://localhost:8888/time.png" alt="testo alternativo" />
    <figcaption class="text-muted">Questo è un test di immagine.</figcaption>
</figure>

Il codice potrebbe essere abbreviato in:

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');

se si volesse aggiungere <small> si potrebbe fare così:

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');

il risultato nel backend è il blocco immagine senza selezione di allineamento:

descrizione immagine

post renderizzato:

descrizione immagine

18 gen 2019 17:08:26
Commenti

Buono a sapersi che questa è un'opzione, alla fine ho trovato quello che probabilmente è il metodo preferito, vedi la mia risposta.

RiddleMeThis RiddleMeThis
18 gen 2019 20:09:02

Si può anche usare il filtro render_block (PHP) per puntare a un blocco specifico.

birgire birgire
18 gen 2019 22:45:15

Non l'ho mai fatto, hai un esempio da mostrare?

user9447 user9447
18 gen 2019 23:42:10

Ne ho pubblicati due qui di recente https://wordpress.stackexchange.com/search?q=user%3A26350+render_block

birgire birgire
19 gen 2019 01:57:27

@DᴀʀᴛʜVᴀᴅᴇʀ Sembra buono ma funzionerà nelle versioni future al di fuori dell'area dei contenuti per la modifica completa del sito

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

Il modo migliore per gestire i problemi di frontend dei blocchi core è "sovrascrivere il rendering dei blocchi core".

esempio:

<?php
function foo_gallery_render( $attributes, $content ) {
    /**
     * Qui trovi un array con gli ID di tutte 
     * le immagini presenti nella tua galleria.
     * 
     * per esempio: 
     * $attributes = [
     *     "ids" => [ 12, 34, 56, 78 ]
     * ]
     *
     * Ora divertiti a richiamarle,
     * organizzarle e restituire il tuo markup personalizzato!
    */
    return '<h1>Galleria renderizzata personalmente</h1>';
}
function foo_register_gallery() {
    register_block_type( 'core/gallery', array(
        'render_callback' => 'foo_gallery_render',
    ) );
}
add_action( 'init', 'foo_register_gallery' );

Questo funziona per tutti i blocchi core di Gutenberg, il che significa che puoi sfruttare i fantastici blocchi già sviluppati e organizzare il loro output come preferisci.

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

4 dic 2019 09:19:11
Commenti

Grazie, secondo me questa è la soluzione migliore.

user3135691 user3135691
8 mag 2020 21:27:29