Задача. Необходимо вывести знаения пользовательских полей главной категории на страницах самой категории и ее подкатегориях. Если подробнее — то есть главные категории (без дочерних), к ним добавлены поля ACF, в которые прикрепляем выборочно нужные подкатегории. После чего эти прикрепленные подкатегории должны выводиться на странице самой категории и во всех ее подкатегориях. Получаются такие себе «плитки тегов» (Изображение 1 и 2).
Решение. Настраиваем ACF поля для категорий (или нужных таксономий). Присваиваем в категориях нужные нам значения. В файл 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
44
45
|
## Вывод 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’);
|