Uzyskaj najwyższego poziomu nadrzędnego niestandardowego terminu systematyki

14

Jak uzyskać najwyższego poziomu rodzica danego terminu?

Korzystam wp_get_object_termsz terminów taksonomii w postach, ale zamiast pokazywać wszystkie otagowane hasła, chcę tylko wyświetlać rodziców najwyższego poziomu z tagowanymi terminami.

Więc jeśli są to moje wybrane warunki, chcę tylko pokazać śniadanie, lunch i kolację.

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

W jaki sposób mogę to zrobić?

supertrue
źródło

Odpowiedzi:

22

Dzięki Ivaylo za ten kod, który był oparty na odpowiedzi Bainternet.

Pierwsza funkcja poniżej, get_term_top_most_parentakceptuje termin i systematykę i zwraca element nadrzędny najwyższego poziomu tego terminu (lub sam termin, jeśli nie ma elementu nadrzędnego); druga funkcja ( get_top_parents) działa w pętli i, biorąc pod uwagę systematykę, zwraca listę HTML najwyższych poziomów rodziców warunków w poście.

// 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;
}

Po uzyskaniu powyższej funkcji możesz zapętlić wyniki zwrócone przez wp_get_object_termsi wyświetlić najwyższego rodzica każdego terminu:

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;
}
supertrue
źródło
Chciałbym zobaczyć modyfikację, która nie tylko wydrukowałaby warunki najwyższego poziomu, ale raczej wszystkie warunki poniżej najwyższego rodzica, hierarchicznie.
Robert Andrews,
@RobertAndrews Jeśli potrzebujesz tylko dzieci jednego terminu, możesz skorzystać z wbudowanej get_term_children( $term, $taxonomy )( dokumentacji ) WordPress . Jeśli chcesz, aby wszystkie dzieci najwyższego poziomu rodzica danej kadencji jest, można przekazać powyższy rezultat do niego, tak: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
supertrue
Co to jest $ termin w tym przypadku, tj. obiekt, nazwa terminu, prefiks nazwa_ taksonomiczna_numer? We wszystkich przypadkach metoda ta jest wyjątkowo długa do załadowania. Czekałem na załadowanie strony już od kilku minut.
Robert Andrews,
1
Jak pierwotnie napisano, oczekiwał identyfikatora, ale zredagowałem odpowiedź, aby zezwolić na określenie identyfikatora lub obiektu WP_Term. Nie jesteś jedynym, który zgłasza problem z tym kodem - najlepiej byłoby napisać od nowa, aby użyć wbudowanej get_ancestorsfunkcji WP , która była nowa i nie była dobrze udokumentowana, kiedy napisano odpowiedź. Opublikuję nową odpowiedź, gdy będę miał czas na przetestowanie.
supertrue
21

Od wersji 3.1.0 get_ancestors()jest dostępna. Zwraca tablicę przodków od najniższej do najwyższej w hierarchii.

oznaczony
źródło
1
To jest poprawna odpowiedź moim zdaniem.
numediaweb
1
To najlepsza odpowiedź.
Mark
8

Oto prosta funkcja, która zapewni Ci najwyższy termin nadrzędny spośród wszystkich podanych terminów:

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;
}

Po uzyskaniu tej funkcji możesz po prostu przejrzeć wyniki zwrócone przez 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;
    }
}
Bainternet
źródło
Dzięki! Próbuję tego teraz. FYI Myślę, że brakuje ci bliskiego paren w pierwszym wierszu funkcji.
supertrue
czy muszę dodać $ taksonomię jako drugi parametr w $ top_parent?
supertrue
Dodałem parametr $ taksonomia, ale otrzymuję błąd, gdy używam tego kodu, tutaj: gist.github.com/1122631
supertrue
tak, robisz. zaktualizowałem odpowiedź.
Bainternet,
1
Twoja funkcja wydaje się zepsuta Twoje pętle Foreach nakładają się na siebie spróbuj tego: pastebin.com/u48dxzap, a jeśli nadal
pojawia
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 );
}
Kiet
źródło
1
Dodaj wyjaśnienie wraz ze swoim kodem.
s_ha_dum
4

Miałem ten sam problem i łatwo go rozwiązałem. Sprawdź to:

Zdefiniować $taxonomy. Może to być ślimak taksonomii, w której chcesz uzyskać dane. Po wykonaniu tej czynności możesz po prostu to zrobić:

<?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 
?>

Teraz masz coś takiego:

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"
}

I możesz użyć, $parentObjaby zdobyć ślimaka, imię, identyfikator, cokolwiek. Tylko za pomocą $parentObj->sluglub $parentObj->namejako przykład.

użytkownik3328615
źródło
2

Najprostszy sposób:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
Vincent Wasteels
źródło