it-swarm.com.de

Wie liste ich nur die untergeordneten Begriffe einer Taxonomie und nicht deren Eltern auf?

Ich erstelle im Admin ein Altersauswahlmenü, das aus einer Taxonomie von age erstellt wird. Die Taxonomie ist wie folgt hierarchisch:

  • 18-25 (Elternteil, ID 183)
    • 18 (Kind)
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 26-30 (Elternteil, ID 184)
    • 26
    • 27
    • 28
    • 29
    • 30

Ich möchte nur die Kinder (18, 19 usw.) und nicht die Eltern (18-25, 26-30) usw. auflisten. Zur Zeit verwende ich get_terms mit dem Argument parent, aber es akzeptiert nicht mehr als 1 Eltern-ID . Hier ist, was ich bis jetzt habe, das die Kinder von 18-25 zeigt.

    $ages = get_terms( 'age', array(
        'hide_empty' => 0,
        'parent' => '183',
    ));

Folgendes möchte ich tun, wird aber nicht unterstützt. Ich habe es auch mit einem Array versucht, aber es funktioniert auch nicht.

    $ages = get_terms( 'age', array(
        'hide_empty' => 0,
        'parent' => '183,184',
    ));

Ich sehe, dass es eine get_term_children - Funktion gibt, aber ich bin mir nicht sicher, wie ich diese verwenden soll, da sie anscheinend nur einen Wert akzeptiert. Beispiel: In diesem Beispiel würde es eine ungeordnete Liste erstellen, aber ich könnte sie für ein ausgewähltes Menü ändern.

<?php
    $termID = 183;
    $taxonomyName = "age";
    $termchildren = get_term_children( $termID, $taxonomyName );

    echo '<ul>';
    foreach ($termchildren as $child) {
    $term = get_term_by( 'id', $child, $taxonomyName );
    echo '<li><a href="' . get_term_link( $term->name, $taxonomyName ) . '">' . $term->name . '</a></li>';
    }
    echo '</ul>';
?> 
8
Andrew

Das sollte für Sie funktionieren:

$taxonomyName = "age";
//This gets top layer terms only.  This is done by setting parent to 0.  
$parent_terms = get_terms( $taxonomyName, array( 'parent' => 0, 'orderby' => 'slug', 'hide_empty' => false ) );   
echo '<ul>';
foreach ( $parent_terms as $pterm ) {
    //Get the Child terms
    $terms = get_terms( $taxonomyName, array( 'parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false ) );
    foreach ( $terms as $term ) {
        echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';   
    }
}
echo '</ul>';
13
Manny Fleurmond

Sie könnten auch tun:

$terms = get_terms($taxonomyName);
foreach($terms as $term) {
    if ($term->parent != 0) { // avoid parent categories
        //your instructions here
    }
}

Ich habe festgestellt, dass Eltern "Eltern" -Feld gleich 0 haben und ein Kind seine Eltern-ID darin hat.

12
karimhossenbux

Wir können die übergeordneten Elemente der obersten Ebene ausschließen, indem Sie sie mithilfe des Filters terms_clauses herausfiltern, um die SQL-Abfrage vor ihrer Ausführung zu ändern. Auf diese Weise müssen wir keine Eltern in der letzten foreach-Schleife überspringen, da sie nicht im zurückgegebenen Array von Begriffen enthalten sind. Dies erspart uns unnötige Arbeit und Programmierarbeit

Sie können Folgendes versuchen:

add_filter( 'terms_clauses', function (  $pieces, $taxonomies, $args )
{
    // Check if our custom arguments is set and set to 1, if not bail
    if (    !isset( $args['wpse_exclude_top'] ) 
         || 1 !== $args['wpse_exclude_top']
    )
        return $pieces;

    // Everything checks out, lets remove parents
    $pieces['where'] .= ' AND tt.parent > 0';

    return $pieces;
}, 10, 3 );

Um Eltern auf oberster Ebene auszuschließen, können wir jetzt 'wpse_exclude_top' => 1 mit unserem Array von Argumenten übergeben. Der neue Parameter wpse_exclude_top wird vom obigen Filter unterstützt

$terms = get_terms( 'category', ['wpse_exclude_top' => 1] );
if (    $terms
     && !is_wp_error( $terms )
) {
    echo '<ul>';
        foreach ($terms as $term) {
            echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';  
        }
    echo '</ul>';
}

Nur eine Notiz, get_term_link() akzeptieren nicht den Termnamen, nur, Slug, ID oder das gesamte Termobjekt. Übergeben Sie für die Leistung immer das Termobjekt an get_term_link(), wenn das Termobjekt verfügbar ist ( wie in diesem Fall ).

3
Pieter Goosen

Warum können Sie das Argument childless nicht einfach auf true setzen?

$ages = get_terms( array(
    'taxonomy' => 'age',
    'childless' => true
    )
);
1
Yaron