Отримайте найвищий батьківський рівень терміна користувальницької таксономії


14

Як я можу отримати батька вищого рівня заданого терміну?

Я використовую wp_get_object_termsдля отримання термінів таксономії на посадах, але замість того, щоб показувати всі позначені терміни, я хочу лише показувати теги термінів 'батьки вищого рівня.

Тож якщо це мої вибрані умови, я хочу лише показати сніданок, обід та вечерю.

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna

Як я можу це зробити?

Відповіді:


22

Дякую Івайло за цей код, який ґрунтувався на відповіді Бейнтерне.

Перша функція нижче, get_term_top_most_parentприймає термін і систематику і повертає батьківський термін найвищого рівня (або сам термін, якщо він є бездітним); друга функція ( get_top_parents) працює в циклі і, враховуючи систематику, повертає HTML-список батьків вищого рівня термінів повідомлення.

// Determine the top-most parent of a term
function get_term_top_most_parent( $term, $taxonomy ) {
    // Start from the current term
    $parent  = get_term( $term, $taxonomy );
    // Climb up the hierarchy until we reach a term with parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

Отримавши вищезгадану функцію, ви можете переглядати результати, повернуті wp_get_object_termsта відображати головний батько кожного терміна:

function get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        //check if you have it in your array to only add it once
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // build output (the HTML is up to you)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}

Я хотів би побачити модифікацію, яка б не просто роздруковувала терміни вищого рівня, а, скоріше, всі терміни під самим батьківським верхом, ієрархічно.
Роберт Ендрюс

@RobertAndrews Якщо вам просто потрібні діти одного терміну, ви можете використовувати вбудовану програму WordPress get_term_children( $term, $taxonomy )( документація ). Якщо ви хочете , щоб всі діти батька даного терміну топ-рівня, ви могли б пройти попередній результат в нього, як це: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
supertrue

Що таке термін $ у цьому випадку, тобто. об'єкт, назва терміна, префікс таксономії__кілька? У всіх випадках цей метод надзвичайно тривалий для завантаження. Я чекав завантаження сторінки вже кілька хвилин.
Роберт Ендрюс

1
Як було написано спочатку, він очікував ідентифікатор, але я відредагував відповідь, щоб дозволити термін ID або WP_Term об'єкт. Ви не єдиний, хто повідомляє про проблему з цим кодом - в ідеалі його слід переписати, щоб використовувати вбудовану get_ancestorsфункцію WP , яка була новою та недостатньо задокументованою під час написання відповіді. Я опублікую нову відповідь, коли встигну перевірити.
supertrue

21

З 3.1.0, get_ancestors()доступний. Він повертає масив предків від найнижчого до найвищого в ієрархії.


1
Це правильна відповідь на мій погляд.
numediaweb

1
Це найкраща відповідь.
Марк

8

Ось проста функція, яка допоможе отримати найкращий батьківський термін будь-якого даного терміна:

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $parent  = get_term_by( 'id', $term_id, $taxonomy );
    while ( $parent->parent != 0 ){
        $parent  = get_term_by( 'id', $parent->parent, $taxonomy );
    }
    return $parent;
}

Коли ви отримаєте цю функцію, ви можете просто переглядати результати, повернені wp_get_object_terms:

$terms =  wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {

    //Get top level parent
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Check if you have it in your array to only add it once
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}

Спасибі! Я зараз це намагаюся. FYI Я думаю, вам не вистачає близького батька в рядку 1 функції.
supertrue

мені потрібно додати $ таксономію як другий параметр у $ top_parent?
supertrue

Я додав параметр $ таксономія, але отримую помилку під час використання цього коду, ось тут: gist.github.com/1122631
supertrue

так, ти. я оновив відповідь.
Bainternet

1
ваша функція здається порушеною, петлі передбачення перекриваються, спробуйте це: pastebin.com/u48dxzap, і якщо ви все-таки отримаєте помилку, вставте весь код, і я перевірю
Bainternet

5
/**
 * Get top level term
 */
function get_top_level_term($term,$taxonomy){
    if($term->parent==0) return $term;
    $parent = get_term( $term->parent,$taxonomy);
    return get_top_level_term( $parent , $taxonomy );
}

1
Будь ласка, додайте пояснення разом із кодом.
s_ha_dum

4

У мене була така ж проблема, і я вирішив легко. Заціни:

Визначте $taxonomy. Це може бути випадок таксономії, за яким ви хочете отримати дані. Після цього ви можете просто зробити це:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // get post terms
    $parentId = $postterms[0]->parent;                      // get parent term ID
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // get parent object 
?>

Тепер у вас є щось подібне:

object(stdClass)#98 (11) {
  ["term_id"]=>
  int(3)
  ["name"]=>
  string(8) "Esportes"
  ["slug"]=>
  string(8) "esportes"
  ["term_group"]=>
  int(0)
  ["term_taxonomy_id"]=>
  int(3)
  ["taxonomy"]=>
  string(17) "noticiaseditorias"
  ["description"]=>
  string(0) ""
  ["parent"]=>
  int(0)
  ["count"]=>
  int(4)
  ["object_id"]=>
  int(123)
  ["filter"]=>
  string(3) "raw"
}

І ви можете використовувати, $parentObjщоб отримати slug, ім'я, ідентифікатор, що завгодно. Просто використовуючи $parentObj->slugабо $parentObj->nameяк зразок.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.