web-dev-qa-db-ger.com

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

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?

13
supertrue

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

Die erste der folgenden Funktionen, get_term_top_most_parent, akzeptiert einen Begriff und eine Taxonomie und gibt den übergeordneten Begriff der obersten Ebene zurück (oder den Begriff selbst, falls 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 wp_get_object_terms zurückgegebenen Ergebnisse durchlaufen und die obersten übergeordneten Begriffe 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;
}
21
supertrue

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

19
markd

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 von wp_get_object_terms zurückgegebenen Ergebnisse durchlaufen:

$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;
    }
}
8
Bainternet
/**
 * 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 );
}
5
Kiet

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

$taxonomy definieren. 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 $parentObj verwenden, um Slug, Name, ID usw. abzurufen. Verwenden Sie einfach $parentObj->slug oder $parentObj->name als Beispiel.

4
user3328615

Einfachster Weg:

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

Vielleicht hilft das: get_ancestors( $object_id, $object_type );

codex.wordpress.org

0