Как изменить блок изображения в Gutenberg WordPress 5?

18 янв. 2019 г., 05:02:32
Просмотры: 13.8K
Голосов: 7

Добавление изображений в запись с помощью блочного редактора:

Добавление изображения в редакторе Gutenberg

генерирует следующий код figure:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="альтернативный текст" class="wp-image-1391"/>
    <figcaption>Это тестовое изображение.</figcaption>
</figure>

но я использую Bootstrap 4 и хочу добавить Отступы (например mt-2) и удалить класс изображения wp-image-1391, чтобы получить:

<figure class="mt-2">
    <img src="http://localhost:8888/time.png" alt="альтернативный текст" class="img-fluid"/>
    <figcaption>Это тестовое изображение.</figcaption>
</figure>

или иметь возможность изменить его на div:

<div class="mt-2">
    <img src="http://localhost:8888/time.png" alt="альтернативный текст" class="img-fluid"/>
    <figcaption>Это тестовое изображение.</figcaption>
</div>

В ходе исследований я нашел get_image_tag_class, но тестирование:

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

не работает. Прочитав "Как предотвратить добавление WordPress лишних классов к элементам в WYSIWYG редакторе", я протестировал:

add_filter('get_image_tag_class','__return_empty_string');

но это также не сработало. Я могу модифицировать <img> с помощью preg_replace, используя add_filter для 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');

но я читал, что использование регулярных выражений для the_content может давать нестабильные результаты. Я мог бы решить проблему простым CSS:

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

но я хочу лучше понять, какие фильтры можно использовать для изменения WordPress. Как я могу добавлять и удалять классы, а также изменять figure на div?

2
Комментарии

Мне тоже это интересно, у меня есть временное решение, но в будущем хотелось бы знать, как кастомизировать эти стандартные блоки.

RiddleMeThis RiddleMeThis
18 янв. 2019 г. 06:58:27

Я уже был готов разобрать PHP-код своей темы на части, когда обнаружил, что все изображения растянуты из-за новой фичи ленивой загрузки (как я предполагаю). +1 за простое решение!

Matt Rek Matt Rek
8 мая 2021 г. 19:17:58
Все ответы на вопрос 4
2

После некоторых исследований и проб/ошибок я нашел несколько решений. Я искал решение для "Gutenberg", чтобы избежать использования str_replace.

Сначала нам нужно подключить наш JS и включить пакет wp.blocks.

// Добавить в functions.php

function gutenberg_enqueue() {
    wp_enqueue_script(
        'myguten-script',
        // get_template_directory_uri() . '/js/gutenberg.js', // Для родительских тем
        get_stylesheet_directory_uri() . '/js/gutenberg.js', // Для дочерних тем
        array('wp-blocks') // Включаем пакет wp.blocks             
    );
}

add_action('enqueue_block_editor_assets', 'gutenberg_enqueue');

Далее я нашел несколько решений, первое, вероятно, лучше всего подходит для вашего конкретного случая.

Метод #1

Используем функцию фильтра, чтобы переопределить класс по умолчанию. В этом случае мы сохраним класс "wp-block-image" и просто добавим нужный класс Bootstrap mt-2. Но вы легко можете добавить любой другой класс. Добавьте код ниже и создайте новый блок изображения, проверьте тег figure — теперь он содержит новый класс.

// Добавить в ваш 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
);

Метод #2

Добавляем настройку в панели стилей блока в боковой панели, чтобы добавить класс к изображению.

// Добавить в ваш JS файл

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

Добавление класса через настройки стилей блока

Это добавит ваш класс, но, к сожалению, Gutenberg добавляет префикс is-style-, поэтому результат будет is-style-test-image-class. Вам придется соответствующим образом скорректировать CSS.


Метод #3

Ручное добавление класса через Блок > Дополнительно > Дополнительные CSS классы. Очевидно, класс нужно добавлять для каждого блока изображения вручную.

Добавление класса через дополнительные CSS классы


Примечание: При добавлении или изменении любого из JS-кода выше мне потребовалось удалить блок, обновить страницу и затем заново добавить блок, чтобы избежать ошибки валидации блока.

Ссылки:

Вариации стилей блоков

blocks.getBlockDefaultClassName

18 янв. 2019 г. 20:04:58
Комментарии

Отлично, разве мы не могли бы также добавить 3-й метод, используя расширенные настройки блока изображения, чтобы вручную добавить CSS-класс к соответствующему изображению :-)

birgire birgire
18 янв. 2019 г. 22:52:10

Ха-ха, точно! Я забыл упомянуть этот вариант :) Обновлю ответ

RiddleMeThis RiddleMeThis
18 янв. 2019 г. 22:54:01
0

Используйте хук фильтра 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;
}

Работает на WP 5.5.

Ссылка: https://wordpress.org/support/topic/modify-gutenberg-core-block-render-result/#post-11716464

20 авг. 2020 г. 02:11:21
5

Следующее решение предназначено для Bootstrap 4 и центрирования изображений внутри тега <figure>.

Стандартный вывод WordPress:

<figure class="wp-block-image">
    <img src="http://localhost:8888/time.png" alt="альтернативный текст" class="wp-image-1391"/>
    <figcaption>Это тестовое изображение.</figcaption>
</figure>

Использование preg_replace() и 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');

Результат:

<figure class="text-center my-3">
    <img class="figure-img img-fluid" src="http://localhost:8888/time.png" alt="альтернативный текст" />
    <figcaption class="text-muted">Это тестовое изображение.</figcaption>
</figure>

Код может быть сокращён до:

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

Если вы хотите добавить <small>, это можно сделать так:

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

Результат в админке — блок изображения без выравнивания:

скриншот блока изображения в админке

Отображение в записи:

скриншот отображения изображения на сайте

18 янв. 2019 г. 17:08:26
Комментарии

Хорошо знать, что такой вариант есть, но в итоге я нашел, вероятно, предпочтительный метод — см. мой ответ.

RiddleMeThis RiddleMeThis
18 янв. 2019 г. 20:09:02

Также можно использовать фильтр render_block (PHP) для работы с конкретным блоком.

birgire birgire
18 янв. 2019 г. 22:45:15

Не пробовал так делать. У вас есть пример, который можно продемонстрировать?

user9447 user9447
18 янв. 2019 г. 23:42:10

Недавно я опубликовал два вопроса здесь https://wordpress.stackexchange.com/search?q=user%3A26350+render_block

birgire birgire
19 янв. 2019 г. 01:57:27

@DᴀʀᴛʜVᴀᴅᴇʀ Выглядит хорошо, но будет ли это работать в будущих версиях вне области контента для полного редактирования сайта

Brad Dalton Brad Dalton
11 нояб. 2021 г. 10:32:29
1

Лучший способ решения проблем с отображением основных блоков — это "переопределение рендеринга основных блоков".

Пример:

<?php
function foo_gallery_render( $attributes, $content ) {
    /**
     * Здесь вы найдете массив с идентификаторами всех 
     * изображений, которые находятся в вашей галерее.
     * 
     * Например: 
     * $attributes = [
     *     "ids" => [ 12, 34, 56, 78 ]
     * ]
     *
     * Теперь можно запросить их,
     * организовать и вернуть свою собственную разметку!
     */
    return '<h1>Кастомный рендеринг галереи</h1>';
}
function foo_register_gallery() {
    register_block_type( 'core/gallery', array(
        'render_callback' => 'foo_gallery_render',
    ) );
}
add_action( 'init', 'foo_register_gallery' );

Это работает для всех основных блоков Гутенберга, что означает, что вы можете воспользоваться преимуществами уже разработанных блоков и настроить их вывод по своему усмотрению.

Ссылка: https://antistatique.net/en/we/blog/2019/01/29/gutenberg-override-core-blocks-rendering

4 дек. 2019 г. 09:19:11
Комментарии

Спасибо, на мой взгляд, это лучшее решение.

user3135691 user3135691
8 мая 2020 г. 21:27:29