Измените атрибут в обратном вызове рендеринга перед тем, как блок будет отрендерен на сервере.

Вопрос или проблема

Я создал пользовательский блок, который работает аналогично блоку абзаца. Однако, если переключатель ToggleControl включен, он обновляет краткое содержание. Хотя это правильно отображает текущее краткое содержание как в функции редактирования, так и в функции сохранения, если краткое содержание изменяется вне Гутенберга, например, через админку WordPress, этот блок не будет динамически обновляться.

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

<?php

// обратный вызов рендеринга блока

if($attributes['use_excerpt']){
   $attributes['content'] = get_the_excerpt();
}

echo $content;

Но содержимое не обновилось и явно нуждается в повторном парсинге на основе этого изменения. Я мог бы использовать preg_match между тегами, но это кажется очень неуклюжим. Как это должно быть сделано?

Ответ или решение

Для решения задачи обновления атрибутов перед рендерингом блока на стороне сервера в WordPress с использованием Gutenberg, необходимо учесть несколько важных аспектов. Ваша цель — динамически обновлять содержимое блока на основе текущей версии извлечения (excerpt) записи, даже если оно было изменено вне Gutenberg.

Общая структура решения

  1. Понимание контекста: Блок, о котором идет речь, использует ToggleControl для обновления извлечения. Однако, если извлечение изменяется вне редактора Gutenberg, блок не обновляется автоматически. Это нарушает одно из основных требований — синхронизацию данных.

  2. Использование коллбэка: Рендеринг блока на стороне сервера позволяет программно обновлять атрибуты перед выводом. Поэтому нам нужно правильно использовать рендер коллбэк.

Рекомендованное решение

Важным моментом является то, что echo $content; в вашем коде не обновляет содержимое для рендеринга. Вместо этого, необходимо использовать обновленное значение атрибута для формирования контента.

Пример кода для обновления атрибутов перед рендерингом:

// Ваша функция коллбэка для рендера блока
function my_custom_block_render( $attributes ) {
    // Проверка, установлен ли флаг использования извлечения
    if ( !empty($attributes['use_excerpt']) ) {
        // Получаем актуальное извлечение из записи
        $excerpt = get_the_excerpt();

        // Обновляем атрибуты
        $attributes['content'] = $excerpt;
    }

    // Важно: Формируем HTML-код блока
    ob_start(); // Начинаем буферизацию вывода
    ?>
    <div class="custom-block">
        <p><?php echo esc_html( $attributes['content'] ); ?></p>
    </div>
    <?php
    return ob_get_clean(); // Возвращаем буферизированный вывод как строку
}

// Регистрация вашего блока с указанием рендер коллбэка
register_block_type( 'my-plugin/my-custom-block', array(
    'render_callback' => 'my_custom_block_render',
) );

Пояснение кода

  1. Функция my_custom_block_render: Эта функция вызывается, когда блок рендерится на сервере. Здесь мы проверяем, установлен ли атрибут use_excerpt.

  2. Получение извлечения: Функция get_the_excerpt() извлекает актуальное значение извлечения из базы данных, что обеспечивает актуальность информации.

  3. Обновление атрибутов: Мы обновляем содержимое атрибута content с помощью полученного извлечения.

  4. Формирование HTML-кода: Используем буферизацию, чтобы вернуть отформатированный HTML код. Это позволяет избежать проблем с выводом и гарантирует, что атрибуты корректно рендерятся.

Заключение

Применяя описанный подход, можно обеспечить, чтобы ваш блок корректно отображал актуальное содержимое даже после изменений, сделанных вне редактора Gutenberg. Это позволит достичь необходимой синхронизации данных и повысить опыт пользователей. Не забывайте тестировать изменения в различных контекстах, чтобы убедиться в их работоспособности.

Оцените материал
Добавить комментарий

Капча загружается...