Modificarea unui bloc de imagine în Gutenberg WordPress 5

18 ian. 2019, 05:02:32
Vizualizări: 13.8K
Voturi: 7

Adăugarea imaginilor într-un articol cu editorul de blocuri:

exemplu de imagine în editorul Gutenberg

generează următorul cod figure:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="text alternativ" class="wp-image-1391"/>
    <figcaption>Acesta este un test cu imagine.</figcaption>
</figure>

dar eu folosesc Bootstrap 4 și aș dori să adaug Spațiere (cum ar fi mt-2) și să elimin clasa imaginii wp-image-1391, rezultat:

<figure class="mt-2">
    <img src="http://localhost:8888/time.png" alt="text alternativ" class="img-fluid"/>
    <figcaption>Acesta este un test cu imagine.</figcaption>
</figure>

sau să o pot modifica într-un div:

<div class="mt-2">
    <img src="http://localhost:8888/time.png" alt="text alternativ" class="img-fluid"/>
    <figcaption>Acesta este un test cu imagine.</figcaption>
</div>

Cercetând am găsit get_image_tag_class dar testând:

function example_add_img_class($class) {
    return $class . ' img-fluid';    // Adaugă clasa img-fluid
}
add_filter('get_image_tag_class','example_add_img_class');

nu funcționează. Citind "Cum pot preveni WordPress să adauge clase suplimentare elementelor în editorul WYSIWYG" am testat:

add_filter('get_image_tag_class','__return_empty_string');

dar nu funcționează. Pot modifica <img> cu un preg_replace folosind add_filter pe the_content:

function add_image_fluid_class($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','add_image_fluid_class');

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

dar am citit că folosirea regex pe the_content poate ave rezultate imprevizibile. Aș putea rezolva problema cu un simplu CSS:

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

dar aș dori să înțeleg mai multe despre ce filtre pot folosi pentru a modifica WordPress. Cum pot adăuga și elimina clase și schimba figure în div?

2
Comentarii

Aș dori să știu și eu acest lucru, am o soluție temporară, dar în viitor aș dori să știu cum să personalizez aceste blocuri implicite.

RiddleMeThis RiddleMeThis
18 ian. 2019 06:58:27

Eram gata să-mi dezmembrez codul PHP al temei mele când am descoperit că toate imaginile sunt întinse din cauza noii funcționalități de încărcare leneșă (presupun) +1 pentru soluția simplă sugerată!

Matt Rek Matt Rek
8 mai 2021 19:17:58
Toate răspunsurile la întrebare 4
2

După ce am cercetat și am încercat diverse soluții, am găsit câteva variante. Căutam o soluție pentru "Gutenberg" pentru a evita utilizarea str_replace.

Mai întâi, trebuie să încărcăm JS-ul nostru și să includem pachetul wp.blocks

// Adăugat în functions.php

function gutenberg_enqueue() {
    wp_enqueue_script(
        'myguten-script',
        // get_template_directory_uri() . '/js/gutenberg.js', // Pentru teme părinte
        get_stylesheet_directory_uri() . '/js/gutenberg.js', // Pentru teme copil
        array('wp-blocks') // Include pachetul wp.blocks             
    );
}

add_action('enqueue_block_editor_assets', 'gutenberg_enqueue');

Apoi, am găsit câteva soluții, prima fiind probabil cea mai bună pentru cazul tău specific.

Metoda #1

Folosește o funcție de filtru pentru a suprascrie clasa implicită. În acest caz, vom păstra clasa "wp-block-image" și vom adăuga clasa necesară din Bootstrap, mt-2. Dar poți adăuga orice clasă dorești. Adaugă codul de mai jos și creează un nou bloc de imagine, inspectează-l pentru a vedea că tag-ul figure are acum noua clasă.

// Adăugat în fișierul 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
);

Metoda #2

Adaugă o setare în panoul lateral pentru stilurile blocului, pentru a adăuga o clasă imaginii.

// Adăugat în fișierul JS

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

imagine demonstrativă

Aceasta va adăuga clasa ta, dar din păcate Gutenberg adaugă prefixul "is-style-" înaintea clasei, rezultând în "is-style-test-image-class". Va trebui să ajustezi CSS-ul în consecință.


Metoda #3

Adăugarea manuală a clasei prin opțiunea Bloc > Avansat > Clasă CSS suplimentară. Evident, clasa va trebui adăugată pentru fiecare bloc de imagine.

imagine demonstrativă


Notă: Când adaugi sau editezi oricare dintre codurile JS de mai sus, a fost necesar să șterg blocul, să reîncarci pagina și apoi să adaug blocul din nou pentru a evita eroarea de validare a blocului.

Referințe:

Variații de stil pentru blocuri

blocks.getBlockDefaultClassName

18 ian. 2019 20:04:58
Comentarii

Super, nu am putea adăuga și a 3-a metodă folosind setările Avansate ale blocului de imagine pentru a adăuga manual o clasă CSS imaginii corespondente :-)

birgire birgire
18 ian. 2019 22:52:10

haha da! Am omis să adaug asta :) Voi actualiza răspunsul

RiddleMeThis RiddleMeThis
18 ian. 2019 22:54:01
0

Folosește hook-ul de filtrare 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;
}

Funcționează pe WP 5.5.

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

20 aug. 2020 02:11:21
5

Următorul răspuns este o soluție pentru Bootstrap 4 și centrarea imaginilor într-un tag <figure>.

Generat implicit de WordPress:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="text alternativ" class="wp-image-1391"/>
    <figcaption>Acesta este un test de imagine.</figcaption>
</figure>

Folosind preg_replace() și 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');

va produce:

<figure class="text-center my-3">
    <img class="figure-img img-fluid" src="http://localhost:8888/time.png" alt="text alternativ" />
    <figcaption class="text-muted">Acesta este un test de imagine.</figcaption>
</figure>

Codul poate fi scurtat la:

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

dacă doriți să adăugați <small> puteți face asta astfel:

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

rezultatul în backend este blocul de imagine fără selecție de aliniere:

descriere imagine

postare randată:

descriere imagine

18 ian. 2019 17:08:26
Comentarii

Bine de știut că aceasta este o opțiune, dar am găsit în cele din urmă ceea ce probabil este metoda preferată, vezi răspunsul meu.

RiddleMeThis RiddleMeThis
18 ian. 2019 20:09:02

Se poate folosi și filtrul render_block (PHP) pentru a ținti un anumit bloc.

birgire birgire
18 ian. 2019 22:45:15

Nu am făcut asta, ai un exemplu pe care îl poți demonstra?

user9447 user9447
18 ian. 2019 23:42:10

Am postat două aici recent https://wordpress.stackexchange.com/search?q=user%3A26350+render_block

birgire birgire
19 ian. 2019 01:57:27

@DᴀʀᴛʜVᴀᴅᴇʛ Pare bine, dar va funcționa în versiunile viitoare în afara zonei de conținut pentru editarea completă a site-ului

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

Cea mai bună metodă de a rezolva problemele de frontend ale blocurilor de bază este "suprascrierea randării blocurilor de bază"

exemplu :

<?php
function foo_gallery_render( $attributes, $content ) {
    /**
     * Aici găsiți un array cu ID-urile tuturor 
     * imaginilor care se află în galeria dumneavoastră.
     * 
     * de exemplu: 
     * $attributes = [
     *     "ids" => [ 12, 34, 56, 78 ]
     * ]
     *
     * Acum vă puteți distra interogându-le,
     * aranjându-le și returnând markup-ul construit!
    */
    return '<h1>Galerie randată personalizat</h1>';
}
function foo_register_gallery() {
    register_block_type( 'core/gallery', array(
        'render_callback' => 'foo_gallery_render',
    ) );
}
add_action( 'init', 'foo_register_gallery' );

Această metodă funcționează pentru toate blocurile de bază Gutenberg, ceea ce înseamnă că puteți beneficia de blocurile deja dezvoltate și le puteți aranja output-ul după preferințele dumneavoastră.

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

4 dec. 2019 09:19:11
Comentarii

Mulțumesc, în opinia mea, aceasta este cea mai bună soluție.

user3135691 user3135691
8 mai 2020 21:27:29