AntonLitvinenko
@AntonLitvinenko
HTML coder

Как универсально использовать шаблон для блока ACF Blocks и блока для Flexible content?

На текущий момент я знаю два способа создавать содержимое для страниц, используя ACF Pro:
Гибкое содержимое (Flexible content)
Блоки для гутенберга (ACF Blocks)
Подходы похожие - и в том и в том случае для каждого блока создается отдельный шаблон, в нем мы выводим кастомные поля, необходимые для отображения, но для вывода полей во Flexible content используется функция get_sub_field(), а для вывода в блоке гутенберга - get_field().
Сейчас я просто копирую папку с блоками, и меняю в блоках функции, но уверен, есть какой-то способ один и тот же шаблон для блока использовать и для гутенберга и для гибкого содержимого.
Прошу подсказать, кто знает
  • Вопрос задан
  • 461 просмотр
Решения вопроса 2
AntonLitvinenko
@AntonLitvinenko Автор вопроса
HTML coder
Нашел более менее адекватное решение, оно позволяет не дублировать шаблоны, но все равно приходится дублировать получение переменных, хотя это уже намного легче
<?php
// для гутенберг блока
$quote = get_field('quote');

// для блока гибкого содержимого
if ( get_row_layout() == 'testimonial' ){
    $quote = get_sub_field('quote');
}
?>
<div class="acf-block-testimonial">
    <blockquote><?php echo $quote; ?></blockquote>
</div>
Ответ написан
Комментировать
solidcreature
@solidcreature
Развиваю сообщество WordPress в Москве
Антон, поделюсь своим решением, в котором не нужно дублировать переменные.

Допустим, у меня есть группа acf-полей Hero. Я хочу использовать эти поля и в Flexible Content и в Гутенберге.
Файл с версткой и вызовом полей, пусть находится в blocks/hero.php. Основная проблема тут в том, что Flexible Content использует get_sub_field(), а для работы Гутенберга по-умолчанию нужны get_field().

Чтобы "обмануть" Гутенберг — я создаю еще одну группу полей. Пусть будет Hero Block. Группа очень простая, это репитер (пусть будет имя block) с одним полем типа clone, в котором указаны все поля из группы Hero. В настройках репитера стоит мин и макс 1 строка.

При регистрации блока я указываю не render_template, а render_callback и создаю функцию в которой этот репитер будет вызываться. В итоге в functions.php следующая конструкция:

Регистрация блока: (хук и проверку наличия ацф опустил)
acf_register_block_type(array(
    'name'              => 'Hero',
    'title'             => __('Hero Block'),
    'description'       => __('A custom Hero block.'),
    'render_callback'   => 'block_hero',
    'category'          => 'formatting',
 ));

Колбэк-функция:
function block_hero() {
	while (have_rows('block')): the_row();
		get_template_part('blocks/hero');
	endwhile;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы