Как отобразить дочерние термины текущего родительского таксономии?
Я хочу отобразить список дочерних терминов в соответствии с текущей таксономией.
Имя таксономии ='course'
Photoshop(=дочерний термин)
- ps-thematic#1(= дочерний дочерний термин)
- ps-thematic#2
- ...
After Effects
ae-thematic#1
ae-thematic#2
...
Another course
- zz-thematic#1
- zz-thematic#1
Таким образом, в моем taxonomy-course-photoshop.php
, я хочу отобразить ps-thematic#1, ps-thematic#2 и т.д.
Я нашел много вопросов и ответов по этой теме.
Попробовал многие из них.
Без успеха...
Теперь я запутался между get_terms
, get_children_term
. Или $args= array('parent' => $this_term->term_id,...}
Моя последняя попытка была в этом топике, который казался идеальным, но я получаю сообщение об ошибке: Catchable fatal error: Object of class WP_Error could not be converted to string in
Спасибо за любую помощь.

Думаю, для этого можно просто использовать get_terms()
. Это минимальный код, предполагаю, что вы также хотите добавить постоянные ссылки, описание терминов или другие элементы.
Однако я протестировал этот код (сейчас тестировал с таксономией "course"), и он работает.
Я постарался максимально подробно прокомментировать код по ходу дела:
// текущий слаг таксономии
// Если нужно автоматически получить текущую таксономию, попробуйте использовать $wp_query->get_queried_object();
$taxonomy = 'course';
// получаем термины таксономии 'course', но только термины верхнего уровня (parent => 0)
$top_level_terms = get_terms( array(
'taxonomy' => $taxonomy,
'parent' => '0',
'hide_empty' => false,
) );
// продолжаем только если термины действительно существуют
if ($top_level_terms) {
echo '<ul class="top-level-terms">';
foreach ($top_level_terms as $top_level_term) {
// ID термина верхнего уровня, он понадобится далее
$top_term_id = $top_level_term->term_id;
// название термина верхнего уровня
$top_term_name = $top_level_term->name;
// используемая таксономия
$top_term_tax = $top_level_term->taxonomy;
// обратите внимание, что закрывающий </li> будет добавлен позже, чтобы можно было правильно добавить подсписок
echo '<li class="top-level-term"><strong>'.$top_term_name.'</strong>';
// здесь получаем дочерние термины
// для этого используем 'child_of' => $top_term_id
// также установлено 'parent' => $top_term_id, что покажет только этот уровень без дальнейших дочерних элементов
$second_level_terms = get_terms( array(
'taxonomy' => $top_term_tax, // можно также использовать $taxonomy, как определено в начале
'child_of' => $top_term_id,
'parent' => $top_term_id, // закомментируйте эту строку, чтобы увидеть больше дочерних элементов (термины третьего уровня и т.д.)
'hide_empty' => false,
) );
// начинаем второй список, если есть термины второго уровня
if ($second_level_terms) {
echo '<ul class="second-level-terms">';
foreach ($second_level_terms as $second_level_term) {
$second_term_name = $second_level_term->name;
echo '<li class="second-level-term">'.$second_term_name.'</li>';
}// END foreach
echo '</ul><!-- END .second-level-terms -->';
}// END if
echo '</li><!-- END .top-level-term -->';
}// END foreach
echo '</ul><!-- END .top-level-terms -->';
}// END if
Также попробуйте использовать print_r($top_level_term);
, например, в первом цикле foreach. Это позволит увидеть всю информацию, связанную с отдельным термином.
Я бы рекомендовал использовать этот код в стандартном шаблоне архива таксономии, а не в файле taxonomy-course-photoshop.php
. Потому что тогда вам понадобится отдельный шаблон для каждого термина, что не практично.
Примечание: Убедитесь, что у вас есть записи, привязанные к отдельным терминам и подтерминам. Иначе термины вообще не будут отображаться!
Обновление: Да, можно автоматически получить данные о текущей таксономии и термине.
Если вы работаете внутри taxonomy-course.php
, то можно попробовать так:
// получаем текущий объект
$current = $wp_query->get_queried_object();
// попробуйте var_dump($current); чтобы увидеть все доступные данные!
// возвращает ID текущего термина
// например, ID термина "Photoshop" - "26", так что мы получим "26", если просматриваем "Photoshop"
$current_term_id = $current->term_id;
// возвращает удобочитаемое имя текущего термина
// например, возвращает "Photoshop"
// или "ps-thematic#1" если мы на дочернем термине "Photoshop"
$current_name = $current->name;
// возвращает слаг текущей таксономии
// например, вернёт "course"
$current_taxonomy = $current->taxonomy;
// возвращает ID родителя, если он есть
// например, если просматриваем "ps-thematic#1", вернёт ID "Photoshop", то есть 26
// если просматриваем "Photoshop", вернёт 0, потому что "Photoshop" - термин верхнего уровня
$current_parent = $current->parent;
// отображаем имя текущего термина, например "Photoshop"
echo '<strong>'.$current_name.'</strong>';
$sub_terms = get_terms( array(
'taxonomy' => $current_taxonomy,
'child_of' => $current_term_id,
'hide_empty' => false,
) );
// начинаем только если есть подтермины
if ($sub_terms) {
// попробуйте var_dump($sub_terms); чтобы увидеть все доступные данные!
echo '<ul class="sub-terms">';
foreach ($sub_terms as $sub_term) {
// попробуйте var_dump($sub_term); чтобы увидеть все доступные данные!
// для примера показываем только имя, например "ps-thematic#1"
echo '<li>'.$sub_term->name.'</li>';
}// END foreach
echo '</ul><!-- END .sub-terms -->';
}// END if
Так, если мы просматриваем "Photoshop", вышеуказанная функция покажет ТОЛЬКО:
Photoshop
- ps-thematic#1
- ps-thematic#2
Она НЕ покажет "After Effects" или его дочерние элементы, ae-thematic#1 или ae-thematic#2.
Также посмотрите, используя var_dump($current);
.
Вы увидите всю доступную информацию. Как вы заметите выше, например, я оставил код в функции $current_parent = $current->parent;
.
Например, можно проверить:
// проверяем, что текущий родитель не равен 0
if ($current_parent != '0') {
// код, если родитель НЕ равен 0
// это всегда означает, что мы просматриваем дочерний термин
} else {
// код, если родитель равен 0
// если родитель равен 0, мы точно на термине верхнего уровня
}
Но в $current
есть и другая информация/данные, которые вы можете использовать.
Надеюсь, это поможет.

Спасибо, это действительно работает! Ещё больше спасибо за то, что ваш ответ так хорошо прокомментирован, терпелив и педагогичен! Осталась одна проблема: термины (родительские и дочерние) отображаются корректно. Но ВСЕ термины из моей таксономии. Я пытаюсь отображать только дочерние термины текущего родительского.

Я имею в виду:
$top_level_terms = текущий родительский термин (например: Photoshop) (Я нахожусь в taxonomy-course.php)
$second_level_terms = дочерние термины от моего родителя (например: thematic-photoshop01, thematic-photoshop02...)
Вы написали:
$top_level_terms = get_terms(array...) Возможно ли добавить что-то вроде получения текущего термина?
$top_level_terms = get_queried_object()->name;
Но ещё раз, огромное спасибо за время, которое вы уже потратили

@cha Я только что обновил свой ответ, посмотрите, поможет ли это. Я также воссоздал структуру вашей таксономии / терминов и теперь тоже использую шаблонный файл taxonomy-course.php
. Просто чтобы убедиться, что это работает в этом файле.
