Задача. Необходимо вывести знаения пользовательских полей главной категории на страницах самой категории и ее подкатегориях. Если подробнее — то есть главные категории (без дочерних), к ним добавлены поля ACF, в которые прикрепляем выборочно нужные подкатегории. После чего эти прикрепленные подкатегории должны выводиться на странице самой категории и во всех ее подкатегориях. Получаются такие себе «плитки тегов» (Изображение 1 и 2).
Решение. Первое. Настраиваем ACF поля для категорий (или нужных таксономий):
- Тип поля: Таксономия
- Этикетка поля: свое (например, Плитки тегов)
- Название поля: свое (например, tag_tiles)
- Таксономия: Категория
- Возвращаемое значение: Объект термина
- Внешний вид: Флажок
- Правила. Показать эту группу полей, если: Таксономия = Категория
Присваиваем в категориях нужные нам значения.
Второе: В файл functions.php
добавляем Код №1.
Недостаток Кода №1 — работает только для главных родительских категорий. Например, у нас структура категорий [Категория 1 — Категория 1.2 — Категория 1.3 — Категория 1.4 — Категория 1.4.1 — Категория 1.4.2]. Если мы присвоим некие значения в Категория 1, то они будут выводиться в ней и ее подкатегориях. А если присвоить значения ACF-полей Категории 1.4, то они выведутся только в Категории 1.4, но в Категории 1.4.1 или 1.4.2 — нет. Все из-за того что мы получаем функцией
get_ancestors()
массив родительских id и берем сразу последний элемент, т.к. он будет самой старшей родительской категорией. Можно попробовать еще перебрать и проверять массив родительских категорий на наличие ACF-поля.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
## Вывод ACF в Категориях плитки тегов /* Есть кастомное поле у категорий 'tag_tiles'. Выбранные значения в самой верхней категории должны выводиться и в дочерних подкатегориях */ # Функция выводит html и значения из ACF /* Параметром принимает массив из 'tag_tiles' и перебирает его */ function wpcrft_func_display_html_tag($terms_a){ echo '<div class="tag-tiles">'; foreach( $terms_a as $term ){ echo '<a href="' . get_term_link( $term ) . '">' . $term->name . '</a>'; } echo '</div>'; } # Функция определяет таксономию и выводит значения полей функцией wpcrft_func_display_html_tag function wpcrft_func_tag_tiles(){ $queried_object = get_queried_object(); // Получает текущий объект запроса $taxonomy = $queried_object->taxonomy; // тип таксономии $term_id = $queried_object->term_id; // ID таксономии $terms = get_field('tag_tiles', $taxonomy . '_' . $term_id); // Получает значение ACF-поля 'tag_tiles' из этой таксономии // Получает массив ID родительских элементов объекта (страницы, таксономии, категории) $ancestors = get_ancestors( $term_id, $taxonomy); // array_key_last() - возвращает последний КЛЮЧ массива $main_parent = $ancestors[array_key_last($ancestors)]; /* Если в текущей таксономии есть значения ACF - выводим, если нет, то проверяем есть ли оно в родительской категории */ if( $terms ){ wpcrft_func_display_html_tag($terms); } elseif ($main_parent){ $terms = get_field('tag_tiles', $taxonomy . '_' . $main_parent); wpcrft_func_display_html_tag($terms); } } // Вывод в шорткод [wpcrft_shortcode_tag_tiles] add_shortcode('wpcrft_shortcode_tag_tiles', 'wpcrft_func_tag_tiles'); // Или вывод под сетку товаров в каталоге add_action('woocommerce_after_shop_loop', 'wpcrft_func_tag_tiles'); |