Получение терминов таксономии для родительских и дочерних элементов
У меня есть функция, которая выводит название и slug каждого термина таксономии products-category
. Она работает хорошо, но выводит термины просто в алфавитном порядке (независимо от того, являются ли они родительскими или дочерними терминами таксономии):
Родительская категория 2
Родительская категория 1
Дочерняя категория 3
Родительская категория 3
Дочерняя категория 2
Дочерняя категория 1
и т.д...
А мне нужна структура больше похожая на это:
—Родительская категория 1
Дочерняя категория 1
Дочерняя категория 2
Дочерняя категория 3
—Родительская категория 2
Дочерняя категория 1
Дочерняя категория 2
Дочерняя категория 3
—Родительская категория 3
Дочерняя категория 1
Дочерняя категория 2
Дочерняя категория 3
Чтобы дочерние термины каждой таксономии находились под родительскими, и было понятно, к какому родителю они относятся. Мой текущий код выглядит так:
<?php
$args = array(
'hide_empty' => false,
'parent' => 0 // Сначала получаем только родительские термины
);
$parent_terms = get_terms("products-category", $args);
if ( !empty( $parent_terms ) && !is_wp_error( $parent_terms ) ){
foreach ( $parent_terms as $parent_term ) {
// Выводим родительский термин
echo '<option value=".'.$parent_term->slug.'" data-hook="'.$parent_term->slug.'">—'.$parent_term->name.'</option>';
// Получаем дочерние термины для текущего родителя
$child_args = array(
'hide_empty' => false,
'parent' => $parent_term->term_id
);
$child_terms = get_terms("products-category", $child_args);
if ( !empty( $child_terms ) && !is_wp_error( $child_terms ) ){
foreach ( $child_terms as $child_term ) {
// Выводим дочерние термины
echo '<option value=".'.$child_term->slug.'" data-hook="'.$child_term->slug.'">'.$child_term->name.'</option>';
}
}
}
} ?>
Буду очень благодарен за любые предложения, как этого добиться!

Вам понадобятся два цикла foreach. Первый для получения родительских терминов таксономии, а второй для получения дочерних терминов таксономии.
Во втором цикле foreach необходимо указать ID родительского термина таксономии, который берется из первого цикла: $parent_term->term_id
.
foreach( get_terms( 'products-category', array( 'hide_empty' => false, 'parent' => 0 ) ) as $parent_term ) {
// отображаем название термина верхнего уровня
echo $parent_term->name . '<br>';
foreach( get_terms( 'products-category', array( 'hide_empty' => false, 'parent' => $parent_term->term_id ) ) as $child_term ) {
// отображаем названия всех дочерних элементов родительского термина
echo $child_term->name . '<br>';
}
}

Вы можете просто использовать функцию wp_list_categories
для отображения вашего списка. Она чрезвычайно универсальна и может быть легко модифицирована под ваши конкретные нужды. Хотя название предполагает, что она предназначена только для встроенной таксономии category
, это не так. Её можно использовать для любой таксономии.
Вам нужно будет проработать примеры и модифицировать их по необходимости. Вот простой пример, который вы можете использовать для отображения вашего списка:
wp_list_categories('taxonomy=products-category');

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

Если использовать собственный walker с этим методом, можно добиться такой же гибкости и контроля.

На основе принятого ответа я реализовал вывод таксономии с внуками, где все элементы являются чекбоксами. Если кому-то понадобится:
$taxonomy_name = 'your-taxonomy';
foreach (get_terms($taxonomy_name, array('hide_empty' => false, 'parent' => 0)) as $parent_term) {
// выводим название термина верхнего уровня
echo "<li class='depth-1'><label><input type='checkbox' name='{$taxonomy_name}' value='{$parent_term->slug}'>{$parent_term->name}</label></li>";
foreach (get_terms($taxonomy_name, array('hide_empty' => false, 'parent' => $parent_term->term_id)) as $child_term) {
// выводим название дочернего термина первого уровня
echo "<li class='depth-2'><label><input type='checkbox' name='{$taxonomy_name}' value='{$child_term->slug}'>{$child_term->name}</label></li>";
foreach (get_terms($taxonomy_name, array('hide_empty' => false, 'parent' => $child_term->term_id)) as $grandchild_term) {
// выводим название дочернего термина второго уровня (внука)
echo "<li class='depth-3'><label><input type='checkbox' name='{$taxonomy_name}' value='{$grandchild_term->slug}'>{$grandchild_term->name}</label></li>";
}
}
}
