Получение только родительских терминов с помощью wp_get_post_terms

23 мар. 2013 г., 22:01:00
Просмотры: 17.7K
Голосов: 2

У меня есть пользовательский тип записи с иерархическими таксономиями. Например, мой тип записи "project" имеет категории:

 A
   A.1
 B
 C

Я пытаюсь получить таксономии для отображения в качестве классов для элементов <li> каждой записи, но мне нужны только родительские категории верхнего уровня. Для записи, которую я рассматриваю, она относится к категориям A.1 и C, но я хочу получить A и C.

Я использую параметр 'parent' => 0 в аргументах, но он возвращает мне A.1 и C. Я также пробовал использовать 'hide_empty' => 0, но это не помогло.

Вот мой код:

 function project_get_item_classes($post_id = null) {
     if ($post_id === null)
         return;
     $_terms = wp_get_post_terms($post_id, 'construction_type', array( 'parent' => 0, 'hide_empty' => 0 ));
     foreach ($_terms as $_term) {
         echo " " . $_term->slug;
     }
 }
0
Все ответы на вопрос 3
1

Функция wp_get_post_terms не принимает параметры 'parent' или 'hide_empty' в массиве аргументов, только 'orderby', 'order' и 'fields', но вы на правильном пути. Просто добавьте условную проверку перед выводом slug:

function project_get_item_classes($post_id = null) {
     if ($post_id === null)
         return;
     $_terms = wp_get_post_terms($post_id, 'construction_type');
     foreach ($_terms as $_term) {
        if ($_term->parent == 0) //проверяем только родительские термины
            echo " " . $_term->slug;
     }
 }
24 мар. 2013 г. 13:36:44
Комментарии

Спасибо, я перепутал аргументы с другой функцией. Теперь единственная проблема в том, что родительская категория не применяется к дочерней. Например, категория A должна применяться к посту для категории A.1. До этого фрагмента кода категория A.1 применялась, но теперь она просто пустая.

javy javy
25 мар. 2013 г. 22:44:51
0

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

$terms = wp_get_post_terms(  $ID , $tax, array( 'orderby' => 'parent', 'order' => 'ASC' ) );

$myparent = $terms[0];
30 янв. 2016 г. 12:09:30
0

Спасибо помощи от @Bainternet (здесь, а также его вкладу, который привел к ответу на этот вопрос), мне удалось собрать код.

// определение самого верхнего родительского элемента термина
function get_term_top_most_parent($term_id, $taxonomy){
    // начинаем с текущего термина
    $parent  = get_term_by( 'id', $term_id, $taxonomy);
    // поднимаемся по иерархии, пока не достигнем термина с parent = '0'
    while ($parent->parent != '0'){
        $term_id = $parent->parent;

        $parent  = get_term_by( 'id', $term_id, $taxonomy);
    }
    return $parent;
}

// после того как у вас есть эта функция, можно просто перебирать результаты, возвращаемые wp_get_object_terms

function project_get_item_classes($taxonomy, $results = 1) {
    // получаем термины для текущей записи
    $terms = wp_get_object_terms( get_the_ID(), 'work_type' );
    // устанавливаем переменные
    $top_parent_terms = array();
    foreach ( $terms as $term ) {
        // получаем верхнего родителя
        $top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
        // проверяем, есть ли он уже в массиве, чтобы добавить только один раз
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }
    // формируем вывод (HTML на ваше усмотрение)

    foreach ( $top_parent_terms as $term ) {
        echo " " . $term->slug;
    }
}
4 мая 2013 г. 18:44:27