Ich erstelle im Admin ein Altersauswahlmenü, das aus einer Taxonomie von age
erstellt wird. Die Taxonomie ist wie folgt hierarchisch:
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>';
?>
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>';
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.
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 ).
Warum können Sie das Argument childless
nicht einfach auf true setzen?
$ages = get_terms( array(
'taxonomy' => 'age',
'childless' => true
)
);