Получение терминов таксономии для родительских и дочерних элементов

10 нояб. 2014 г., 18:14:25
Просмотры: 18.1K
Голосов: 1

У меня есть функция, которая выводит название и 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>';
            }
        }
    }
} ?>

Буду очень благодарен за любые предложения, как этого добиться!

0
Все ответы на вопрос 3
2

Вам понадобятся два цикла 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>';
  }

}
10 нояб. 2014 г. 18:24:46
Комментарии

Приводит к ошибке парсинга: Parse error: syntax error, unexpected '['?

user1374796 user1374796
10 нояб. 2014 г. 18:35:56

Это из-за вашей версии PHP. Для такого синтаксиса нужен PHP 5.4+, если я не ошибаюсь. Проверьте мой обновлённый ответ! [] — это сокращение для array(), кстати.

SLH SLH
10 нояб. 2014 г. 18:37:02
3

Вы можете просто использовать функцию wp_list_categories для отображения вашего списка. Она чрезвычайно универсальна и может быть легко модифицирована под ваши конкретные нужды. Хотя название предполагает, что она предназначена только для встроенной таксономии category, это не так. Её можно использовать для любой таксономии.

Вам нужно будет проработать примеры и модифицировать их по необходимости. Вот простой пример, который вы можете использовать для отображения вашего списка:

wp_list_categories('taxonomy=products-category');
10 нояб. 2014 г. 18:48:15
Комментарии

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

SLH SLH
10 нояб. 2014 г. 18:57:28

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

Milo Milo
10 нояб. 2014 г. 21:23:38

@Milo да, все зависит от того, что именно хочет достичь автор вопроса. Должен признать, хорошее замечание

Pieter Goosen Pieter Goosen
10 нояб. 2014 г. 21:30:00
0

На основе принятого ответа я реализовал вывод таксономии с внуками, где все элементы являются чекбоксами. Если кому-то понадобится:

$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>";
      }
   }
}
19 сент. 2024 г. 17:26:24