Вопрос или проблема
У меня есть пользовательский тип записи с пользовательской таксономией (чтобы показать некоторые примеры “лучших практик” на моем сайте). На странице отдельной записи (single-bestpractice.php) я хотел показать все термины (категории) следующим образом:
Родитель: Ребёнок, Ребёнок, Ребёнок
Я попробовал этот код:
$customPostTaxonomies = get_object_taxonomies('bestpractice');
if (count($customPostTaxonomies) > 0) {
foreach ($customPostTaxonomies as $tax) {
$args = array(
'orderby' => 'name',
'show_count' => 0,
'pad_counts' => 0,
'hierarchical' => 1,
'taxonomy' => $tax,
'title_li' => ''
);
wp_list_categories( $args );
}
}
который выводит:
Ребёнок, Ребёнок, Родитель, Ребёнок,
…так что, есть ли способ отсортировать это по родителю/ребёнку и сделать так, чтобы родительский элемент начинался с “:” и убрать “,” у последнего ребёнка?
спасибо,
Йохен
Вы могли бы также обратить внимание на этот пост, так как он, по сути, такой же…
Отобразить термины из пользовательской таксономии, назначенной записи (внутри цикла) в иерархическом порядке
.
Ответ или решение
Чтобы отобразить термины кастомной таксономии, отсортированные по иерархии родительских и дочерних элементов, необходимо немного изменить подход к реализации данной функциональности. Ваша текущая реализация с использованием wp_list_categories()
не позволяет вам полностью контролировать форматирование, особенно в отношении порядка отображения и обработки последней запятой.
Вот подробное пошаговое руководство по достижению желаемого результата:
-
Получение всех терминов таксономии:
Мы будем использовать функциюget_terms()
для получения всех терминов определенной таксономии и их иерархической структуры. -
Организация данных в иерархическом формате:
Мы отсортируем термины по родительской и дочерней структуре, чтобы иметь возможность их корректно отображать. -
Отображение в требуемом формате:
Мы выведем данные в формате "Родитель: Дочерний1, Дочерний2, Дочерний3", при этом уберем запятую после последнего дочернего термина.
Вот пример кода, который решает вашу задачу:
$taxonomy = 'ваша_кастомная_таксономия'; // Замените на вашу таксономию
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'orderby' => 'name',
'hide_empty' => false,
));
if (!empty($terms) && !is_wp_error($terms)) {
// Сортируем термины по родителям
$term_hierarchy = array();
foreach ($terms as $term) {
if ($term->parent == 0) {
// Если это родительский термин
$term_hierarchy[$term->term_id] = array(
'term' => $term,
'children' => array()
);
} else {
// Если это дочерний термин
$term_hierarchy[$term->parent]['children'][] = $term;
}
}
// Выводим термины в нужном формате
foreach ($term_hierarchy as $parent_term_data) {
$parent_term = $parent_term_data['term'];
echo '<strong>' . esc_html($parent_term->name) . ':</strong> ';
$children = $parent_term_data['children'];
$child_names = array();
foreach ($children as $child) {
$child_names[] = esc_html($child->name);
}
// Объединяем дочерние термины в строку
echo implode(', ', $child_names) . '<br>';
}
}
Объяснение кода:
-
Получение терминов: Мы получаем все термины для указанной таксономии с помощью
get_terms()
, при этом указываем аргументы для сортировки и исключаем пустые термины. -
Сортировка по родительским и дочерним терминам: Мы используем массив для хранения иерархической структуры терминов. Родительские термины добавляются в основной массив, а дочерние – в соответствующий элемент массива.
-
Форматирование вывода: Используя
implode()
, мы собираем имена дочерних терминов в строку, разделенную запятыми, и выводим всю информацию в требуемом формате. Если у родителя нет дочерних терминов, он просто не будет выводиться.
Этот способ позволяет вам гибко управлять отображением кастомных таксономий, а также обеспечивает чистоту и читаемость выходных данных. С помощью данного кода вы сможете отобразить термины правильно организованными и в нужном формате на странице ваших записей.