Получение терминов таксономии для родительских и дочерних элементов
У меня есть функция, которая выводит название и 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');
Используя мой метод, он получает больше гибкости и контроля над тем, как отображаются таксономические термины. Но ваш ответ тоже допустим.
SLH
Если использовать собственный walker с этим методом, можно добиться такой же гибкости и контроля.
Milo
На основе принятого ответа я реализовал вывод таксономии с внуками, где все элементы являются чекбоксами. Если кому-то понадобится:
$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>";
}
}
}