Holen Sie sich das übergeordnete Element der obersten Ebene eines benutzerdefinierten Taxonomiebegriffs

14

Wie würde ich das übergeordnete Element einer bestimmten Amtszeit erhalten?

Ich verwende wp_get_object_terms, um Taxonomiebegriffe für Posts abzurufen, aber anstatt alle markierten Begriffe anzuzeigen, möchte ich nur die übergeordneten Begriffe der markierten Begriffe anzeigen.

Wenn dies also meine ausgewählten Begriffe sind, möchte ich nur Frühstück, Mittag- und Abendessen anzeigen.

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

Wie kann ich das machen?

supertrue
quelle

Antworten:

22

Vielen Dank an Ivaylo für diesen Code, der auf Bainternets Antwort basierte.

Die erste unten stehende Funktion get_term_top_most_parentakzeptiert einen Begriff und eine Taxonomie und gibt den übergeordneten Begriff der obersten Ebene zurück (oder den Begriff selbst, wenn er nicht übergeordnet ist). Die zweite Funktion ( get_top_parents) arbeitet in der Schleife und gibt bei gegebener Taxonomie eine HTML-Liste der übergeordneten Elemente eines Posts zurück.

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

Sobald Sie die obige Funktion haben, können Sie die von zurückgegebenen Ergebnisse durchlaufen wp_get_object_termsund das oberste übergeordnete Element jedes Begriffs anzeigen:

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
quelle
Ich würde gerne eine Änderung sehen, die nicht nur die übergeordneten Begriffe, sondern alle Begriffe unter dem obersten übergeordneten hierarchisch ausgibt.
Robert Andrews
@RobertAndrews Wenn Sie nur die Kinder eines einzelnen Begriffs benötigen, können Sie die integrierte get_term_children( $term, $taxonomy )( Dokumentation ) von WordPress verwenden . Wenn Sie alle Kinder eines bestimmten Begriff Top-Level - Eltern erhalten möchten, können Sie das obige Ergebnis hineingeben, wie folgt aus : get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
supertrue
Was ist in diesem Fall $ term, dh. das Objekt, der Name des Begriffs, das Präfix taxonomyname_number? In allen Fällen ist das Laden dieser Methode extrem lang. Ich habe jetzt einige Minuten darauf gewartet, dass die Seite geladen wird.
Robert Andrews
1
Wie ursprünglich geschrieben, erwartete es eine ID, aber ich habe die Antwort bearbeitet, um eine Term-ID oder ein WP_Term-Objekt zuzulassen. Sie sind nicht der einzige , der ein Problem mit diesem Code meldet. Idealerweise sollte es umgeschrieben werden, um die integrierte get_ancestorsFunktion von WP zu verwenden. Diese war neu und zum Zeitpunkt des Erstellens der Antwort nicht gut dokumentiert. Ich werde eine neue Antwort posten, wenn ich Zeit zum Testen hatte.
SuperRu
21

Seit 3.1.0 get_ancestors()ist verfügbar. Es gibt ein Array von Vorfahren vom niedrigsten zum höchsten Wert in der Hierarchie zurück.

markd
quelle
1
Dies ist meiner Meinung nach die richtige Antwort.
Numediaweb
1
Das ist die beste Antwort.
Mark
8

Hier ist eine einfache Funktion, mit der Sie den obersten übergeordneten Begriff eines bestimmten Begriffs erhalten:

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

Sobald Sie diese Funktion haben, können Sie einfach die Ergebnisse durchlaufen, die zurückgegeben werden von 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
quelle
Vielen Dank! Ich versuche das jetzt. Zu Ihrer Information, ich denke, Sie vermissen einen engen Paren in Zeile 1 der Funktion.
Superwahr
Muss ich $ taxonomy als zweiten Parameter in $ top_parent hinzufügen?
Überraschen Sie den
Ich habe den $ taxonomy-Parameter hinzugefügt, erhalte
supertrue
ja tust du. Ich habe die Antwort aktualisiert.
Bainternet
1
Ihre Funktion scheint kaputt zu sein. Ihre foreach-Schleifen überlappen sich. Versuchen Sie
Folgendes
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
quelle
1
Bitte fügen Sie Ihrem Code eine Erklärung hinzu.
s_ha_dum
4

Ich hatte das gleiche Problem und ich habe es leicht gelöst. Überprüfen Sie dies heraus:

Definieren $taxonomy. Dies kann der Slug der Taxonomie sein, für die Sie die Daten abrufen möchten. Danach können Sie einfach Folgendes tun:

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

Jetzt hast du so etwas:

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

Und Sie können verwenden $parentObj, um Schnecke, Name, ID, was auch immer zu bekommen. Einfach mit $parentObj->slugoder $parentObj->nameals Beispiel.

user3328615
quelle
2

Einfachster Weg:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;
Vincent Wasteels
quelle