Как отобразить дочерние термины текущего родительского таксономии?

7 мар. 2017 г., 14:59:01
Просмотры: 14.6K
Голосов: 3

Я хочу отобразить список дочерних терминов в соответствии с текущей таксономией.

Имя таксономии ='course'

  • Photoshop(=дочерний термин)

    • ps-thematic#1(= дочерний дочерний термин)
    • ps-thematic#2
    • ...
  • After Effects

    • ae-thematic#1

    • ae-thematic#2

    • ...

  • Another course

    • 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

Спасибо за любую помощь.

0
Все ответы на вопрос 1
4

Думаю, для этого можно просто использовать 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 есть и другая информация/данные, которые вы можете использовать. Надеюсь, это поможет.

8 мар. 2017 г. 17:29:32
Комментарии

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

Cha Cha
9 мар. 2017 г. 11:16:04

Я имею в виду:

$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 Cha
9 мар. 2017 г. 11:27:29

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

LWS-Mo LWS-Mo
10 мар. 2017 г. 11:57:27

Блестяще!!! Это именно то, что мне было нужно!! И огромное спасибо (еще раз) за качество ваших объяснений.

Cha Cha
10 мар. 2017 г. 12:47:47