Вопрос или проблема
Я создал пользовательский блок, который работает аналогично блоку абзаца. Однако, если переключатель ToggleControl включен, он обновляет краткое содержание. Хотя это правильно отображает текущее краткое содержание как в функции редактирования, так и в функции сохранения, если краткое содержание изменяется вне Гутенберга, например, через админку WordPress, этот блок не будет динамически обновляться.
Я ищу способ использовать обратный вызов рендеринга, чтобы обновить атрибут перед тем, как содержимое блока будет отрисовано.
<?php
// обратный вызов рендеринга блока
if($attributes['use_excerpt']){
$attributes['content'] = get_the_excerpt();
}
echo $content;
Но содержимое не обновилось и явно нуждается в повторном парсинге на основе этого изменения. Я мог бы использовать preg_match между тегами, но это кажется очень неуклюжим. Как это должно быть сделано?
Ответ или решение
Для решения задачи обновления атрибутов перед рендерингом блока на стороне сервера в WordPress с использованием Gutenberg, необходимо учесть несколько важных аспектов. Ваша цель — динамически обновлять содержимое блока на основе текущей версии извлечения (excerpt) записи, даже если оно было изменено вне Gutenberg.
Общая структура решения
-
Понимание контекста: Блок, о котором идет речь, использует
ToggleControl
для обновления извлечения. Однако, если извлечение изменяется вне редактора Gutenberg, блок не обновляется автоматически. Это нарушает одно из основных требований — синхронизацию данных. -
Использование коллбэка: Рендеринг блока на стороне сервера позволяет программно обновлять атрибуты перед выводом. Поэтому нам нужно правильно использовать рендер коллбэк.
Рекомендованное решение
Важным моментом является то, что 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',
) );
Пояснение кода
-
Функция
my_custom_block_render
: Эта функция вызывается, когда блок рендерится на сервере. Здесь мы проверяем, установлен ли атрибутuse_excerpt
. -
Получение извлечения: Функция
get_the_excerpt()
извлекает актуальное значение извлечения из базы данных, что обеспечивает актуальность информации. -
Обновление атрибутов: Мы обновляем содержимое атрибута
content
с помощью полученного извлечения. -
Формирование HTML-кода: Используем буферизацию, чтобы вернуть отформатированный HTML код. Это позволяет избежать проблем с выводом и гарантирует, что атрибуты корректно рендерятся.
Заключение
Применяя описанный подход, можно обеспечить, чтобы ваш блок корректно отображал актуальное содержимое даже после изменений, сделанных вне редактора Gutenberg. Это позволит достичь необходимой синхронизации данных и повысить опыт пользователей. Не забывайте тестировать изменения в различных контекстах, чтобы убедиться в их работоспособности.