Come elencare solo i termini figli di una tassonomia e non i loro genitori?

24 lug 2011, 15:51:21
Visualizzazioni: 94.2K
Voti: 12

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>';
?> 
3
Commenti

Chiamare get_terms due volte e unire i due array di risultati?

t31os t31os
24 lug 2011 18:21:36

@Mark Grazie, avevo pensato di farlo in questo modo, ma anche se unisco gli ID in un array, non riesco a capire come potrebbe funzionare perché sarebbe lo stesso che elencarli manualmente - 183, 184, cosa che non funziona.

Andrew Andrew
25 lug 2011 02:43:27

Dopo aver letto la risposta accettata, ora mi rendo conto che la tua domanda non era del tutto chiara. A quanto pare, volevi tutti i termini, escludendo quelli di livello superiore (cosa che puoi fare con una singola chiamata a get_terms). La tua domanda sembrava indicare che volessi tutti i figli di 2 termini genitore specifici..

t31os t31os
26 lug 2011 19:03:00
Tutte le risposte alla domanda 6
4
19

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>';
25 lug 2011 06:46:05
Commenti

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.

Andrew Andrew
25 lug 2011 07:57:08

Nessun problema. Sono contento che abbia funzionato per te.

Manny Fleurmond Manny Fleurmond
25 lug 2011 08:21:17

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

dotancohen dotancohen
15 mar 2016 18:47:22

$term->name non è valido in get_term_link(), accetta solo l'ID del termine, lo slug o l'oggetto

Pieter Goosen Pieter Goosen
15 mar 2016 20:03:04
4
17

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.

15 mar 2016 18:32:03
Commenti

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 dotancohen
15 mar 2016 18:46:41

@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

Pieter Goosen Pieter Goosen
15 mar 2016 20:05:07

@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?

dotancohen dotancohen
16 mar 2016 10:23:06

@dotancohen nella mia risposta ;-)

Pieter Goosen Pieter Goosen
16 mar 2016 10:24:53
1

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)

15 mar 2016 20:01:59
Commenti

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

evavienna evavienna
17 dic 2021 07:22:10
3

Perché non puoi semplicemente impostare l'argomento childless su true?

$ages = get_terms( array(
    'taxonomy' => 'age',
    'childless' => true
    )
);
20 ott 2016 02:20:19
Commenti

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.

GeckoSEO GeckoSEO
23 apr 2018 18:58:19

Questo ha funzionato perfettamente per le mie esigenze! Grazie!

jsmod jsmod
11 ott 2020 19:54:13

Inoltre restituirà genitori senza figli invece di figli senza genitori.

certainlyakey certainlyakey
2 gen 2021 23:15:05
0
$taxonomy = 'age';
foreach( get_terms( [ 'taxonomy' => $taxonomy, 'parent' => 0 ] ) as $parent )
{
    foreach( get_terms[ 'taxonomy' => $taxonomy, 'parent' => $parent->term_id ] as $child )
    {
        // fai qualcosa
        print_r( $child );
    }
}
16 apr 2024 13:16:09
2
-1

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>';
    }
  }
}
29 dic 2015 15:16:42
Commenti

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

s_ha_dum s_ha_dum
29 dic 2015 16:23:58

La domanda menziona gli id, per questo motivo ho risposto in relazione a questo aspetto.

Jakir Hossain Jakir Hossain
30 dic 2015 17:23:33