Verifică dacă categoria curentă are subcategorii
Am găsit următorul fragment de cod în tema WP Knowledge Base pentru a afișa subcategoriile unei categorii părinte. Problema este că acesta funcționează doar pentru primul nivel ierarhic, așa că am vrut să modific condiția if pentru a verifica dacă categoria curentă are copii, dar nu știu cum să fac asta. Aveți vreo idee? Mulțumesc
global $term_meta, $cat, $cat_id, $wp_query;
// Verifică dacă categoria curentă nu este o categorie de primul nivel
// Acest lucru se va întâmpla dacă categoria curentă nu are niciun copil
// În acest caz, pur și simplu afișăm toate postările sale
// În loc de elementele frumoase de tip knowledge base
if ( $cat->parent != '0' ) {

Există deja o funcție încorporată pentru aceasta, nu este nevoie să creați o funcție personalizată. Funcția se numește get_term_children()
și va returna fie:
Un array cu termenii copil dacă termenul dat are copii
Un array gol dacă nu sunt găsiți termeni copil
Un obiect
WP_Error
dacă taxonomia nu există
Ținând cont de acestea, înfășurați get_term_children()
într-o funcție și returnați true sau false în funcție de valoarea returnată, dacă aveți nevoie doar de o valoare booleană (ca un tag condițional).
function has_term_have_children( $term_id = '', $taxonomy = 'category' )
{
// Verificăm dacă avem o valoare pentru termen, dacă nu, returnăm false
if ( !$term_id )
return false;
// Obținem copiii termenului
$term_children = get_term_children( filter_var( $term_id, FILTER_VALIDATE_INT ), filter_var( $taxonomy, FILTER_SANITIZE_STRING ) );
// Returnăm false dacă avem un array gol sau un obiect WP_Error
if ( empty( $term_children ) || is_wp_error( $term_children ) )
return false;
return true;
}
Acum puteți pur și simplu să transmiteți ID-ul termenului funcției și numele corect al taxonomiei, dacă taxonomia este altceva decât category
, și veți primi înapoi o valoare booleană la fel ca tag-urile condiționale încorporate, true în caz de succes dacă termenul are copii, false dacă nu are.
if ( has_term_have_children( 21 ) ) {
// Faceți ceva dacă termenul 21 are copii
}

De asemenea, ai putea folosi if ( has_term_have_children( get_cat_ID() ) )
pe pagina de categorie

@AndrewLazarus corect, utilizarea exactă depinde de configurația ta și de ceea ce ai nevoie exact. Din păcate, când răspund la întrebări, nu pot acoperi toate aspectele și uneori omit un lucru sau două. Comentarii precum cel pe care l-ai postat sunt întotdeauna apreciate și încurajate ;-). Distracție

Puteți utiliza acest simplu apel de funcție care returnează TRUE
sau FALSE
în funcție de faptul dacă $children
este un array gol sau nu.
/**
* Verifică dacă un termen dat are termeni copil
*
* @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 );
}
Deci, dacă utilizați doar categoriile implicite post
, puteți apela funcția astfel: category_has_children( 17 );
Dacă trebuie să testați o taxonomie personalizată, va funcționa aproape la fel, dar va trebui să transmiteți un parametru suplimentar 'taxonomy-slug': category_has_children( 7, 'my_taxonomy' );
'
Pentru a o apela în instrucțiunea IF:
if( $cat->parent != 0 && ! category_has_children( $cat->term_id ) )

get_term_children()
face deja ceea ce dorește OP. Este doar o chestiune de a crea o condiție booleană :-)

Doar o notă, parametrul type
nu este destinat pentru post_type
, ci mai degrabă pentru a indica dacă categoria provine din taxonomia încorporată category
sau din taxonomia încorporată link_category
. Acest parametru a fost folosit înainte de introducerea taxonomiilor personalizate în versiunea 3.0. Parametrul type
a fost înlocuit de noul parametru taxonomy care a fost introdus în versiunea 3.0. Codul sursă actual

Pentru a obține numele categoriilor copil. Am folosit funcția lui @Howdy_McGee pentru un proces mai rapid și iterativ.
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 este categoria părinte */
category_has_children($cId, 'post', 'category');
Aceasta va lista toate subcategoriile (copil) ale unei categorii părinte.

WordPress are deja o funcție încorporată care face asta: wp_list_categories()

Folosește această funcție cat_has_subcat('introdu id-ul categoriei')
pentru a verifica dacă o categorie are subcategorii sau nu
//adaugă acest cod în fișierul functions.php
//start
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;
}
}
//end
