Как правильно вывести acf?

Ссылка скопирована
PHP
1 ответ

В общем делаю табы
создал повторитель
в нем категория - 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' =&gt; 'product', 'post_status' =&gt; 'publish', 'meta_query' =&gt; [ 	'book_color' =&gt; [ 		'key'     =&gt; 'color', 		'value'   =&gt; 'blue', 		'compare' =&gt; 'NOT LIKE', 	], ], ];

$args = [ 'post_type' =&gt; 'product', 'post_status' =&gt; 'publish', 'meta_query' =&gt; [ 'book_color' =&gt; [ 'key' =&gt; 'color', 'value' =&gt; 'blue', 'compare' =&gt; '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

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Павел Админов Ответ

Для табов с ACF Repeater главное — один раз собрать список вкладок, второй раз собрать содержимое, и связать их одинаковым индексом. В Вашем примере идея правильная, но код выглядит как смесь HTML и PHP без нормальной проверки значений. Лучше сделать вывод аккуратно: сначала have_rows(), внутри get_sub_field(), все значения экранировать.

Пример базового вывода:

&lt;div class="tab_container"&gt;
    &lt;ul class="tabs"&gt;
        &lt;?php if (have_rows('cat_list')) : ?&gt;
            &lt;?php while (have_rows('cat_list')) : the_row(); ?&gt;
                &lt;li data-tab="tab-&lt;?php echo esc_attr(get_row_index()); ?&gt;"&gt;
                    &lt;?php echo esc_html(get_sub_field('mcat')); ?&gt;
                &lt;/li&gt;
            &lt;?php endwhile; ?&gt;
        &lt;?php endif; ?&gt;
    &lt;/ul&gt;
 
    &lt;?php if (have_rows('cat_list')) : ?&gt;
        &lt;?php while (have_rows('cat_list')) : the_row(); ?&gt;
            &lt;div id="tab-&lt;?php echo esc_attr(get_row_index()); ?&gt;" class="tab_content"&gt;
                &lt;h3&gt;&lt;?php echo esc_html(get_sub_field('cat_title')); ?&gt;&lt;/h3&gt;
                &lt;div&gt;&lt;?php echo wp_kses_post(get_sub_field('cat_text')); ?&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;?php endwhile; ?&gt;
    &lt;?php endif; ?&gt;
&lt;/div&gt;

&lt;div class="tab_container"&gt; &lt;ul class="tabs"&gt; &lt;?php if (have_rows('cat_list')) : ?&gt; &lt;?php while (have_rows('cat_list')) : the_row(); ?&gt; &lt;li data-tab="tab-&lt;?php echo esc_attr(get_row_index()); ?&gt;"&gt; &lt;?php echo esc_html(get_sub_field('mcat')); ?&gt; &lt;/li&gt; &lt;?php endwhile; ?&gt; &lt;?php endif; ?&gt; &lt;/ul&gt; &lt;?php if (have_rows('cat_list')) : ?&gt; &lt;?php while (have_rows('cat_list')) : the_row(); ?&gt; &lt;div id="tab-&lt;?php echo esc_attr(get_row_index()); ?&gt;" class="tab_content"&gt; &lt;h3&gt;&lt;?php echo esc_html(get_sub_field('cat_title')); ?&gt;&lt;/h3&gt; &lt;div&gt;&lt;?php echo wp_kses_post(get_sub_field('cat_text')); ?&gt;&lt;/div&gt; &lt;/div&gt; &lt;?php endwhile; ?&gt; &lt;?php endif; ?&gt; &lt;/div&gt;

Если поле изображения возвращает массив, выводите его через 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' =&gt; 'tab-logo']);
}

$image_id = get_sub_field('cat_logo'); if ($image_id) { echo wp_get_attachment_image($image_id, 'medium', false, ['class' =&gt; 'tab-logo']); }

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

Ещё один момент: не выводите повторитель дважды, если внутри первого цикла Вы уже исчерпали указатель ACF и потом забыли снова вызвать have_rows(). ACF обычно сам начинает новый цикл при повторном вызове, но в сложных шаблонах с вложенными repeaters лучше не смешивать вывод меню и контента с побочными переменными. Если табы перестают совпадать, соберите массив строк через get_field('cat_list') и затем пройдитесь по нему двумя обычными foreach. Так проще контролировать индексы, активный первый элемент и пустые значения.

Также проверьте настройки поля select: если оно возвращает массив, а не строку, the_sub_field('mcat') может вывести не то, что ожидаете. В этом случае берите label/value явно и экранируйте вывод.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно