Come elencare solo i termini figli di una tassonomia e non i loro genitori?
Sto creando un menu di selezione dell'età nell'area di amministrazione, popolato da una tassonomia chiamata age
. La tassonomia è gerarchica nel seguente modo:
- 18-25 (genitore, ID 183)
- 18 (figlio)
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26-30 (genitore, ID 184)
- 26
- 27
- 28
- 29
- 30
Vorrei elencare solo i figli (18, 19 ecc.) e non i genitori (18-25, 26-30) ecc. Attualmente sto usando get_terms
con l'argomento parent
, ma non accetta più di un ID genitore. Ecco cosa ho finora, che mostra i figli di 18-25.
$ages = get_terms( 'age', array(
'hide_empty' => 0,
'parent' => '183',
));
Ecco quello che vorrei fare, ma non è supportato. Ho anche provato con un array ma non funziona comunque.
$ages = get_terms( 'age', array(
'hide_empty' => 0,
'parent' => '183,184',
));
Vedo che esiste una funzione get_term_children ma non sono sicuro di come usarla dato che sembra accettare solo un valore. Ad esempio: In questo esempio costruirebbe una lista non ordinata ma potrei modificarla per un menu di selezione.
<?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>';
?>

Questo dovrebbe funzionare per te:
$taxonomyName = "age";
//Questo ottiene solo i termini di livello superiore. Si fa impostando parent a 0.
$parent_terms = get_terms(
$taxonomyName,
array(
'parent' => 0,
'orderby' => 'slug',
'hide_empty' => false
)
);
echo '<ul>';
foreach ( $parent_terms as $pterm ) {
//Ottiene i termini figlio
$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>';

Grazie @Manny, ha funzionato alla perfezione. Ho preso quello che mi hai fornito e l'ho incorporato nel menu a selezione che cercavo. Ottimo lavoro.

Vedi la risposta di karimhossenbux qui sotto per una soluzione molto più efficiente.

Potresti anche fare:
$terms = get_terms($taxonomyName);
foreach($terms as $term) {
if ($term->parent != 0) { // evita le categorie genitore
//tue istruzioni qui
}
}
Ho notato che i genitori hanno il campo "parent" uguale a 0, mentre un figlio ha l'id del suo genitore in questo campo.

La risposta accettata esegue N chiamate get_terms() e funziona in tempo polinomiale. Questa risposta esegue una singola chiamata get_terms() e funziona in tempo lineare. Questa è una risposta molto migliore.

@dotancohen Puoi farlo senza dover escludere i termini di livello superiore in output, puoi rimuoverli con il parametro wpse_exclude_top
aggiunto agli argomenti della query ;-). Tuttavia concordo, questa soluzione è più veloce della risposta accettata

@PieterGoosen: Grazie Pieter. Ho appena cercato nel codice sorgente 4.4.2 le stringhe wpse_exclude_top
e exclude_top
ma non le ho trovate. Nemmeno google sembra conoscerle. Dove sono documentate?

Possiamo escludere i genitori di livello superiore filtrandoli utilizzando il filtro terms_clauses
per modificare la query SQL prima che venga eseguita. In questo modo non abbiamo bisogno di saltare i genitori nel ciclo foreach
finale poiché non sono presenti nell'array di termini restituiti, risparmiandoci lavoro e codice non necessari
Puoi provare il seguente codice:
add_filter( 'terms_clauses', function ( $pieces, $taxonomies, $args )
{
// Verifica se il nostro argomento personalizzato è impostato e uguale a 1, altrimenti esci
if ( !isset( $args['wpse_exclude_top'] )
|| 1 !== $args['wpse_exclude_top']
)
return $pieces;
// Tutto verificato, rimuoviamo i genitori
$pieces['where'] .= ' AND tt.parent > 0';
return $pieces;
}, 10, 3 );
Per escludere i genitori di livello superiore, possiamo ora passare 'wpse_exclude_top' => 1
con il nostro array di argomenti. Il nuovo parametro wpse_exclude_top
è supportato dal filtro sopra
$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>';
}
Nota importante: get_term_link()
non accetta il nome del termine, solo slug, ID o l'oggetto termine completo. Per prestazioni, passa sempre l'oggetto termine a get_term_link()
se disponibile (come in questo caso)

Ciao, qualche idea su come risolvere questo problema? stackoverflow.com/q/70327174/9036446

impostare l'argomento childless
su true significa che puoi andare solo 1 livello in profondità, quindi questo non funziona per tassonomie con 3 o più livelli.

Se vuoi visualizzare i figli di più genitori, puoi provare questo. Mostra i termini figlio degli ID dei termini menzionati.
$termIds = array(367, 366, 365, 364, 363, 362);
$taxonomyName = "age";
$args = array(
'orderby' => 'term_id',
'order' => 'DESC',
'hide_empty' => false,
'childless' => false,
);
$terms = get_terms( $taxonomyName, $args );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
$inc = 1;
foreach ( $terms as $term ) {
if (in_array($term->parent, $termIds)) {
echo '<option value="'.$term->term_id.'"><font><font>'.$term->name.'</font></font></option>';
}
}
}

Per favore spiega perché pensi che questo codice dovrebbe funzionare. Inoltre, sono abbastanza sicuro che una soluzione hard-coded non sia il modo migliore.
