Как правильно вывести acf?
В общем делаю табы
создал повторитель
в нем категория - select, заполняю Категория1, категория 2 и т.д
далее титл, текст и т.д
вывожу
<div class="tab_container"> <ul class="tabs"> <?php if( have_rows('cat_list') ) : while ( have_rows('cat_list') ) : the_row(); ?> <li rel="tab<?php echo get_row_index(); ?>"><?php the_sub_field('mcat'); ?></li> <?php endwhile; endif; ?> </ul> <?php if( have_rows('cat_list') ) : while ( have_rows('cat_list') ) : the_row(); ?> <div id="tab<?php echo get_row_index(); ?>" class="tab_content"> <div class="item"> <div class="top"> <div class="left"><div class="sale"><?php the_sub_field("cat_skidka"); ?></div></div> <div class="right"><img src="<?php the_sub_field("cat_logo"); ?>" alt=""></div> </div> <div class="img"><img src="<?php the_sub_field("cat_img"); ?>" alt=""></div> <div class="title"><?php the_sub_field("cat_title"); ?></div> <div class="bottom"> <div class="left"> <div class="old"><?php the_sub_field("old_price"); ?></div> <div class="new"><?php the_sub_field("new_price"); ?></div> </div> <div class="right"><a href="#ex1" class="open-modal" rel="modal:open">Купить</a></div> </div> </div> </div> <?php endwhile; endif; ?> </div> |
<div class="tab_container"> <ul class="tabs"> <?php if( have_rows('cat_list') ) : while ( have_rows('cat_list') ) : the_row(); ?> <li rel="tab<?php echo get_row_index(); ?>"><?php the_sub_field('mcat'); ?></li> <?php endwhile; endif; ?> </ul> <?php if( have_rows('cat_list') ) : while ( have_rows('cat_list') ) : the_row(); ?> <div id="tab<?php echo get_row_index(); ?>" class="tab_content"> <div class="item"> <div class="top"> <div class="left"><div class="sale"><?php the_sub_field("cat_skidka"); ?></div></div> <div class="right"><img src="<?php the_sub_field("cat_logo"); ?>" alt=""></div> </div> <div class="img"><img src="<?php the_sub_field("cat_img"); ?>" alt=""></div> <div class="title"><?php the_sub_field("cat_title"); ?></div> <div class="bottom"> <div class="left"> <div class="old"><?php the_sub_field("old_price"); ?></div> <div class="new"><?php the_sub_field("new_price"); ?></div> </div> <div class="right"><a href="#ex1" class="open-modal" rel="modal:open">Купить</a></div> </div> </div> </div> <?php endwhile; endif; ?> </div>
Все бы ничего, но не то
сейчас если несколько товаров помещу в категорию 1, то соответственно в
<ul class="tabs">
выведет
Категория 1
Категория 2
Категория 3
Категория 4
Категория 5
Категория 1
Категория 1
Вообще не пойму как его сделать
что бы в Категория 1 помещались itemы толькоте, у которых выбрана Категория 1
Дополнительно:
Ответы:
для вывода товаров используйте цикл WP_Query. по сути все поля acf - это мета-поля поля или custom post fields.
https:// wp-kama.ru /function/wp_query#meta_query
$args = [ 'post_type' => 'product', 'post_status' => 'publish', 'meta_query' => [ 'book_color' => [ 'key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE', ], ], ]; |
$args = [ 'post_type' => 'product', 'post_status' => 'publish', 'meta_query' => [ 'book_color' => [ 'key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE', ], ], ];
передавайте в args индекс массива - meta query c нужными параметрами запроса и получайте на выходе WP_Query список постов.
the_sub_field("new_price") - выводит значения полей повторителя, заведенных Вами в админке
если поля acf вы записали в посте или странице, посмотрите в базе данных в таблице wp_postmeta по ключу ID - номер поста для значения meta_key - meta_value и Вам станет понятно, какая структура полей acf в базе данных. если Вы к опциям acf приделали, то посмотрите строки с полями acf в таблице wp_options
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для табов с ACF Repeater главное — один раз собрать список вкладок, второй раз собрать содержимое, и связать их одинаковым индексом. В Вашем примере идея правильная, но код выглядит как смесь HTML и PHP без нормальной проверки значений. Лучше сделать вывод аккуратно: сначала
have_rows(), внутриget_sub_field(), все значения экранировать.Пример базового вывода:
<div class="tab_container"> <ul class="tabs"> <?php if (have_rows('cat_list')) : ?> <?php while (have_rows('cat_list')) : the_row(); ?> <li data-tab="tab-<?php echo esc_attr(get_row_index()); ?>"> <?php echo esc_html(get_sub_field('mcat')); ?> </li> <?php endwhile; ?> <?php endif; ?> </ul> <?php if (have_rows('cat_list')) : ?> <?php while (have_rows('cat_list')) : the_row(); ?> <div id="tab-<?php echo esc_attr(get_row_index()); ?>" class="tab_content"> <h3><?php echo esc_html(get_sub_field('cat_title')); ?></h3> <div><?php echo wp_kses_post(get_sub_field('cat_text')); ?></div> </div> <?php endwhile; ?> <?php endif; ?> </div>
Если поле изображения возвращает массив, выводите его через ID или URL в зависимости от настроек ACF. Надёжнее поставить return format = ID и использовать
wp_get_attachment_image(), тогда WordPress сам добавит размеры и alt:$image_id = get_sub_field('cat_logo'); if ($image_id) { echo wp_get_attachment_image($image_id, 'medium', false, ['class' => 'tab-logo']); }
Для переключения табов достаточно простого JS: по клику добавлять активный класс кнопке и нужному блоку. Если табы должны быть доступны без JS, первый таб показывайте по умолчанию через CSS.
Ещё один момент: не выводите повторитель дважды, если внутри первого цикла Вы уже исчерпали указатель ACF и потом забыли снова вызвать
have_rows(). ACF обычно сам начинает новый цикл при повторном вызове, но в сложных шаблонах с вложенными repeaters лучше не смешивать вывод меню и контента с побочными переменными. Если табы перестают совпадать, соберите массив строк черезget_field('cat_list')и затем пройдитесь по нему двумя обычнымиforeach. Так проще контролировать индексы, активный первый элемент и пустые значения.Также проверьте настройки поля select: если оно возвращает массив, а не строку,
the_sub_field('mcat')может вывести не то, что ожидаете. В этом случае берите label/value явно и экранируйте вывод.