Controllare se la categoria corrente ha sottocategorie

28 gen 2015, 16:50:43
Visualizzazioni: 33.4K
Voti: 5

Ho trovato il seguente codice nel tema WP Knowledge Base per mostrare le sottocategorie di una categoria padre. Il problema è che questo funziona solo per il primo livello della gerarchia, quindi vorrei modificare la clausola if per verificare se la categoria corrente ha figli ma non so come fare, qualche idea? Grazie

global $term_meta, $cat, $cat_id, $wp_query;

// Controlla se la categoria corrente non è una categoria di primo livello
// Questo accadrà se la categoria corrente non ha figli
// In questo caso, mostreremo semplicemente tutti i suoi post
// Invece delle belle cose in stile knowledge base
if ( $cat->parent != '0' ) {
0
Tutte le risposte alla domanda 5
3

Esiste già una funzione integrata per questo, non è necessario creare una funzione personalizzata. La funzione si chiama get_term_children() e restituirà:

  • Un array di termini figli se il termine specificato ha figli

  • Un array vuoto se non vengono trovati termini figli

  • Un oggetto WP_Error se la tassonomia non esiste

Tenendo questo in mente, puoi racchiudere get_term_children() in una funzione e restituire vero o falso in base al valore restituito, se hai bisogno solo di un valore booleano (come un tag condizionale)

function has_term_have_children( $term_id = '', $taxonomy = 'category' )
{
    // Verifica se abbiamo un valore del termine, altrimenti restituisce falso
    if ( !$term_id ) 
        return false;

    // Ottieni i termini figli
    $term_children = get_term_children( filter_var( $term_id, FILTER_VALIDATE_INT ), filter_var( $taxonomy, FILTER_SANITIZE_STRING ) );

    // Restituisce falso se abbiamo un array vuoto o un oggetto WP_Error
    if ( empty( $term_children ) || is_wp_error( $term_children ) )
    return false;

    return true;
}

Ora puoi semplicemente passare l'ID del termine alla funzione e il nome corretto della tassonomia se questa è diversa da category, e otterrai un valore booleano proprio come nei tag condizionali integrati: vero in caso di successo se il termine ha figli, falso se non ne ha.

if ( has_term_have_children( 21 ) ) {
    // Fai qualcosa se il termine 21 ha figli
}
24 giu 2015 10:35:28
Commenti

Potresti anche usare if ( has_term_have_children( get_cat_ID() ) ) nella pagina della categoria

Andrew Lazarus Andrew Lazarus
30 ott 2015 15:03:02

@AndrewLazarus vero, l'uso esatto dipende dalla tua configurazione e da ciò di cui hai esattamente bisogno. Sfortunatamente, quando rispondo alle domande, non posso coprire tutti gli aspetti e a volte ne salto uno o due. Commenti come quello che hai postato sono sempre molto apprezzati e incoraggiati ;-). Divertiti

Pieter Goosen Pieter Goosen
30 ott 2015 17:08:37

@AndrewLazarus puoi anche usare get_queried_object_id() invece di get_cat_ID() in una pagina di categoria ;-)

Pieter Goosen Pieter Goosen
30 ott 2015 17:09:39
3

Puoi utilizzare questa semplice chiamata di funzione che restituisce TRUE o FALSE a seconda che $children sia un array vuoto o meno.

/**
 * Verifica se un termine specificato ha termini figli
 *
 * @param Integer $term_id
 * @param String $taxonomy
 *
 * @return Boolean
 */
function category_has_children( $term_id = 0, $taxonomy = 'category' ) {
    $children = get_categories( array( 
        'child_of'      => $term_id,
        'taxonomy'      => $taxonomy,
        'hide_empty'    => false,
        'fields'        => 'ids',
    ) );
    return ( $children );
}

Quindi, se stai utilizzando solo le categorie predefinite di post, puoi chiamare la funzione in questo modo: category_has_children( 17 );

Se hai bisogno di testare una tassonomia personalizzata, funzionerà quasi allo stesso modo, dovrai solo passare un parametro aggiuntivo 'taxonomy-slug': category_has_children( 7, 'my_taxonomy' );

Per chiamarla nel tuo statement IF:

if( $cat->parent != 0 && ! category_has_children( $cat->term_id ) )
28 gen 2015 17:09:26
Commenti

get_term_children() fa già quello che l'OP vuole. È solo questione di creare un conditional tag booleano :-)

Pieter Goosen Pieter Goosen
24 giu 2015 10:39:59

Giusto una nota, il parametro type non è pensato per post_type, ma piuttosto per indicare se la categoria proviene dalla tassonomia predefinita category o dalla tassonomia predefinita link_category. Questo parametro veniva utilizzato prima dell'introduzione delle tassonomie personalizzate nella versione 3.0. Il parametro type è stato deprecato in favore del nuovo parametro taxonomy introdotto nella versione 3.0. Codice sorgente attuale

Pieter Goosen Pieter Goosen
24 giu 2015 11:21:16

Nota: Su Woocommerce il parametro $taxonomy deve essere cambiato in 'product_cat' invece di 'category'

luissimo luissimo
20 ago 2020 22:25:23
2

Per ottenere il nome delle categorie figlie. Ho utilizzato la funzione di @Howdy_McGee per un processo più rapido e iterativo.

function category_has_children( $term_id = 0, $post_type = 'post', $taxonomy = 'category' ) {

    $children = get_categories( array( 'child_of' => $term_id, 'type' => $post_type, 'taxonomy' => $taxonomy, 'order' => 'ASC', 'orderby' => 'name' ) );
    if($children){
    echo '<ul>';
    foreach ($children as $value) {
        echo '<li>';
            echo '<a href="'.get_bloginfo("siteurl").'/category/'.$value->slug.'" >'.$value->name.'</a>';
        echo '</li>';
        }
    echo '</ul>';
    }
}

$cId = get_cat_id('cms'); /* cms è la categoria genitore */
category_has_children($cId, 'post', 'category');

Questo elencherà tutte le sottocategorie (figlie) di una categoria genitore.

28 gen 2015 18:35:46
Commenti

WordPress ha già una funzione integrata che fa questo: wp_list_categories()

Howdy_McGee Howdy_McGee
29 gen 2015 17:00:45

Sì, ma la personalizzazione/strutturazione è un po' rigida con quella. :)

Shreyo Gi Shreyo Gi
30 gen 2015 04:45:04
0

Questo è ciò che utilizzo. La variabile $cat è l'ID della categoria che stai verificando:

$categories = get_categories($cat);

if (!empty($categories)) {
    // Questa categoria ha figli
    }
else {
    // Questa categoria non ha figli
    }
24 giu 2015 09:40:45
1

Utilizza questa funzione cat_has_subcat('incolla id categoria') per verificare se la categoria ha delle sottocategorie o meno

//incollalo nel tuo file function.php

//inizio


function cat_has_subcat($catId){
    $args = array(
        'taxonomy' => 'product_cat',
        'orderby' => 'name',
        'parent' => $catId,
        'show_count' => 0,
        'pad_counts' => 0,
        'hierarchical' => 1,
        'title_li' => '',
        'hide_empty' => false
    );

    $cats = get_categories($args);
    if(!empty($cats)){
        return $catId;
    }
}

//fine
9 nov 2017 08:53:34
Commenti

Sarebbe bello avere una spiegazione sul perché questa soluzione risponda alla domanda dell'OP.

cjbj cjbj
9 nov 2017 09:54:53