Controllare se la categoria corrente ha sottocategorie
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' ) {

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
}

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

@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

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 ) )

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

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

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.

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

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
