Как выбрать определенные категории?

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

Есть вывод категорий

<div class="list">     <div class="container">         <div class="list-wrap">             <div class="list-wrap__title ttl"><?php  the_field('title3')  ?></div>             <?php  if ($categories) :                 foreach ($categories as $item) :  ?>                     <div class="list-wrap__item">                         <div class="list-wrap__item--image">                             <img src="<?php  echo check_image(get_field('img', 'term_' . $item->term_id))  ?>" alt="img">                         </div>                         <div class="list-wrap__item--content">                             <div class="list-wrap__item--content-title"><?php  echo $item->name  ?></div>                             <div class="list-wrap__item--content-text"><?php  the_field('description', 'term_' . $item->term_id) ?></div>                             <a href="<?php  echo get_category_link($item->term_id)  ?>" class="btn btn-blue"><?php  the_field('btn_text3')  ?></a>                         </div>                     </div>             <?php  endforeach;             endif;  ?>         </div>     </div> </div>

<div class="list"> <div class="container"> <div class="list-wrap"> <div class="list-wrap__title ttl"><?php the_field('title3') ?></div> <?php if ($categories) : foreach ($categories as $item) : ?> <div class="list-wrap__item"> <div class="list-wrap__item--image"> <img src="<?php echo check_image(get_field('img', 'term_' . $item->term_id)) ?>" alt="img"> </div> <div class="list-wrap__item--content"> <div class="list-wrap__item--content-title"><?php echo $item->name ?></div> <div class="list-wrap__item--content-text"><?php the_field('description', 'term_' . $item->term_id) ?></div> <a href="<?php echo get_category_link($item->term_id) ?>" class="btn btn-blue"><?php the_field('btn_text3') ?></a> </div> </div> <?php endforeach; endif; ?> </div> </div> </div>

Как тут можно либо исключить определенные либо включить только нужные категории??

Дополнительно:

Смотрите что в массиве $categories и какой запрос в базу для его получения

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

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

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

Исключать или оставлять нужные категории лучше не внутри верстки, а на этапе получения массива $categories. Тогда в шаблон попадут только те термины, которые реально нужно вывести.

Если категории получаются через get_categories(), используйте параметры include или exclude:

$categories = get_categories([
    'taxonomy'   => 'category',
    'hide_empty' => false,
    'include'    => [3, 8, 15],
    'orderby'    => 'include',
]);

$categories = get_categories([ 'taxonomy' => 'category', 'hide_empty' => false, 'include' => [3, 8, 15], 'orderby' => 'include', ]);

Чтобы наоборот убрать несколько категорий:

$categories = get_categories([
    'taxonomy'   => 'category',
    'hide_empty' => false,
    'exclude'    => [5, 7, 11],
]);

$categories = get_categories([ 'taxonomy' => 'category', 'hide_empty' => false, 'exclude' => [5, 7, 11], ]);

Если массив уже готов и менять запрос неудобно, можно отфильтровать его перед циклом:

$allowed_ids = [3, 8, 15];
 
$categories = array_filter($categories, function ($term) use ($allowed_ids) {
    return in_array((int) $term->term_id, $allowed_ids, true);
});

$allowed_ids = [3, 8, 15]; $categories = array_filter($categories, function ($term) use ($allowed_ids) { return in_array((int) $term->term_id, $allowed_ids, true); });

В самом выводе также желательно экранировать данные: esc_html($item->name), esc_url(get_category_link($item->term_id)), esc_attr() для атрибутов. Но главный ответ: сначала посмотрите, откуда приходит $categories, и задайте include/exclude там.

Если список категорий должен быть не весь, а только выбранный набор, фильтровать нужно до вывода карточек. Иначе вы будете сначала получать лишние термины, а потом пытаться скрывать их в вёрстке. Это хуже и по читаемости, и по производительности.

Если категории получаете через get_categories(), задайте include:

$categories = get_categories([
    'taxonomy'   => 'category',
    'hide_empty' => false,
    'include'    => [12, 18, 25],
    'orderby'    => 'include',
]);

$categories = get_categories([ 'taxonomy' => 'category', 'hide_empty' => false, 'include' => [12, 18, 25], 'orderby' => 'include', ]);

Если надо исключить несколько категорий, используйте exclude:

$categories = get_categories([
    'taxonomy'   => 'category',
    'hide_empty' => false,
    'exclude'    => [3, 7],
]);

$categories = get_categories([ 'taxonomy' => 'category', 'hide_empty' => false, 'exclude' => [3, 7], ]);

В вашем шаблоне дополнительно проверьте вывод ACF-полей термина. Для стандартных рубрик ACF обычно принимает формат 'category_' . $item->term_id, а не 'term_' . $item->term_id. Универсально можно так:

$acf_id = $item->taxonomy . '_' . $item->term_id;
$image = get_field('img', $acf_id);

$acf_id = $item->taxonomy . '_' . $item->term_id; $image = get_field('img', $acf_id);

И обязательно экранируйте вывод: название через esc_html(), URL через esc_url(), alt через esc_attr(). Тогда список категорий будет управляемым и безопасным.

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

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

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

комментарий

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

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