Wie Taxonomiebegriffe wie hierarchisch angezeigt werden

Als ich Kaisers Anfrage und Scribus Antwort gelesen habe, bin ich in einem Ozean ohne Land. Ich habe eine benutzerdefinierte Taxonomie erstellt, in der ich die Begriffe gemäß ihrer Hierarchie wie folgt darstellen möchte:

Level 0 -- Level 1 --- Level 2 ---- Level 3 --- Level 2 ---- Level 3 ---- Level 3 -- Level 1 --- Level 2 

Aber ich benutze orderby => 'term_group' sowohl in get_categories() als auch in get_terms() . Mit term_group ich folgendes bekommen:

 Level 0 -- Level 1 -- Level 1 --- Level 2 --- Level 2 --- Level 2 ---- Level 3 ---- Level 3 ---- Level 3 

Ich habe die Daten überprüft, alle Hierarchien sind perfekt, aber sie arbeiten nicht sichtbar am Frontend in meinem Code. Aber der folgende Code funktioniert, wenn ich Begriffe nacheinander manuell eingeben muss:

 $all_terms = get_categories( array( 'taxonomy' => 'my_tax', 'show_count' => true, 'hide_empty' => false, 'orderby' => 'term_group', ) ); 

Aber wenn ich ein automatisiertes Skript benutzte, um Daten einzugeben / zu migrieren, so dass die Ebene 0 zuerst eintritt, dann die Ebene 1 und so weiter, funktioniert derselbe Code nicht. Also, ich denke, die Bestellung arbeitete tatsächlich an den IDs (und ja, eigentlich ist es).

Wie kann ich die Taxonomiebegriffe hierarchisch darstellen?

Solutions Collecting From Web of "Wie Taxonomiebegriffe wie hierarchisch angezeigt werden"

term_group scheint nie vollständig zusammen mit dem Parameter alias_of . Was genau der Verwendungszweck ist ( oder war ), kann ich nicht mit Sicherheit sagen. Ich würde eher die Verwendung dieser beiden Parameter vermeiden.

In Bezug auf das Problem, eine hierarchische wp_list_categories() erstellen, springt wp_list_categories() sofort in den Sinn ( wp_list_categories() dass dies auch für benutzerdefinierte Taxonomien funktioniert ). Sie können entweder wp_list_categories() und die Ausgabe über die verfügbaren Parameter manipulieren, oder Sie können sich walk_category_tree() wp_list_categories() die wp_list_categories() verwendet, um ihre wp_list_categories() zu erstellen. walk_category_tree() auch die Walker_Category class , damit Sie genau das Walker_Category können, was Sie brauchen

Es gibt auch die Möglichkeit, eine eigene rekursive function zu schreiben, um Ihren Baum zu erstellen

Ich triggerse es mit Hilfe von einfachem PHP und mit Hilfe meines Kollegen Herrn Afzal. Meine bestehende Anfrage war:

 $all_terms = get_categories( array( 'taxonomy' => 'my_tax', 'show_count' => true, 'hide_empty' => false, 'orderby' => 'term_group', //bogus :p ) ); 

Anstatt meiner bestehenden Abfrage habe ich eine $wpdb Abfrage für eine bessere Kontrolle erstellt:

 global $wpdb; $tax_query = $wpdb->get_results("SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('my_tax') ORDER BY tt.parent, t.name ASC ", ARRAY_A); 

Damit haben wir jetzt eine alphabetisch sortierte Matrix mit einigen wertvollen Informationen, die ich für das weitere Vorgehen brauche:

  • term_id
  • parent

Hierarchische Arrays

Ich habe meine Baum-generierende function mit diesem SO-Thread gemacht , es ist eine rekursive function:

 function create_tax_tree( &$list, $parent ) { $taxTree = array(); foreach( $parent as $ind => $val ) { if( isset($list[$val['term_id']]) ) { $val['children'] = create_tax_tree( $list, $list[$val['term_id']] ); } $taxTree[] = $val; } return $taxTree; } 

Und diese function macht mich zu einem Array mit exakter Eltern-Kind-Beziehung. Nach meiner db Query habe ich jetzt folgendes gemacht:

 if (count( $tax_query ) > 0) : //Making my tree array $taxs = array(); foreach( $tax_query as $tax ) { $taxs[ $tax['parent'] ][] = $tax; } //that's my tree in array or arrays $tax_tree = create_tax_tree( $taxs, $taxs[0] ); else : _e('No term found', 'textdomain'); endif; 

Jetzt ist mein Baum in $tax_tree variabel. Wenn ich var_dump($tax_tree) , ist es ein Array von Arrays, die voll von genauen Eltern-Kind-Beziehungen ist.

Endgültige Ergebnisse

Um das Endergebnis zu erhalten, benötigen wir eine weitere rekursive function, und hier bietet PHP5 eine schöne Menge von classn , die aus diesem SO-Thread gelernt wurden. Ich benutze zwei von ihnen auf folgende Weise:

 $tax_iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator( $tax_tree )); foreach( $tax_iterator as $key => $value ) { $depth = get_tax_depth( $term_id, true ); //custom-made function if( 'term_id' === $key ) $term_id = (int) $value; //having the term_id for further use if( 'name' === $key ) { echo '

'; $pad = str_repeat('---', $depth * 3); //for visual hierarchy echo $pad .' '. $value; //the name of the tax term echo '

'; } }

Und die Ausgabe ist:

 Level 0 -- Level 1 --- Level 2 ---- Level 3 --- Level 2 ---- Level 3 ---- Level 3 -- Level 1 --- Level 2 

🙂