Comprobar si la categoría actual tiene subcategorías
He encontrado el siguiente código en el tema WP Knowledge Base para mostrar subcategorías de una categoría padre. El problema es que esto solo funciona para el primer nivel de jerarquía, así que quería cambiar la condición if para verificar si la categoría actual tiene hijos pero no tengo idea de cómo hacerlo, ¿alguna sugerencia? Gracias
global $term_meta, $cat, $cat_id, $wp_query;
// Comprobar si la categoría actual no es una categoría de primer nivel
// Esto sucederá si la categoría actual no tiene hijos
// Si este es el caso, entonces simplemente mostramos todos sus posts
// En lugar de las cosas agradables tipo base de conocimientos
if ( $cat->parent != '0' ) {

Ya existe una función integrada para esto, no es necesario crear una función personalizada. La función se llama get_term_children()
y devolverá:
Un array de términos hijos si el término dado tiene hijos
Un array vacío si no se encuentran términos hijos
Un objeto
WP_Error
si la taxonomía no existe
Teniendo esto en cuenta, envuelve get_term_children()
en una función y devuelve verdadero o falso dependiendo del valor retornado si solo necesitas un valor booleano (como una etiqueta condicional)
function has_term_have_children( $term_id = '', $taxonomy = 'category' )
{
// Verifica si tenemos un valor de término, si no, retorna falso
if ( !$term_id )
return false;
// Obtiene los términos hijos
$term_children = get_term_children( filter_var( $term_id, FILTER_VALIDATE_INT ), filter_var( $taxonomy, FILTER_SANITIZE_STRING ) );
// Retorna falso si tenemos un array vacío o un objeto WP_Error
if ( empty( $term_children ) || is_wp_error( $term_children ) )
return false;
return true;
}
Ahora simplemente puedes pasar el ID del término a la función y el nombre correcto de la taxonomía si es diferente a category
, y obtendrás un valor booleano como en las etiquetas condicionales integradas, verdadero si el término tiene hijos, falso si no los tiene.
if ( has_term_have_children( 21 ) ) {
// Haz algo si el término 21 tiene hijos
}

También podrías hacer if ( has_term_have_children( get_cat_ID() ) )
en la página de categoría

@AndrewLazarus cierto, el caso de uso exacto depende de tu configuración y lo que necesites exactamente. Desafortunadamente, cuando respondo preguntas, no puedo cubrir todas las bases, y a veces me falta una o dos cosas. Comentarios como el que has publicado son siempre muy apreciados y alentados ;-). Disfruta

Podrías usar esta simple llamada a función que devuelve TRUE
o FALSE
dependiendo de si $children
es un array vacío o no.
/**
* Verificar si un término dado tiene términos hijos
*
* @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 );
}
Así que si solo estás usando las categorías incorporadas de post
puedes llamar a la función así: category_has_children( 17 );
Si necesitas probar una taxonomía personalizada funcionará casi igual, solo necesitarás pasar un parámetro extra 'taxonomy-slug': category_has_children( 7, 'my_taxonomy' );
'
Para llamarla en tu sentencia IF:
if( $cat->parent != 0 && ! category_has_children( $cat->term_id ) )

get_term_children()
ya hace lo que el OP quiere. Solo es cuestión de crear una etiqueta condicional booleana :-)

Solo una nota, el parámetro type
no está destinado para post_type
, sino para indicar si la categoría pertenece a la taxonomía incorporada category
o a la taxonomía incorporada link_category
. Este parámetro se usaba antes de la introducción de taxonomías personalizadas en la versión 3.0. El parámetro type
ha quedado obsoleto por el nuevo parámetro taxonomy que se introdujo en la versión 3.0. Código fuente actual

Para obtener el nombre de las categorías hijas. He utilizado la función de @Howdy_McGee para un proceso más rápido 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 es la categoría padre */
category_has_children($cId, 'post', 'category');
Esto listará todas las subcategorías (hijas) de una categoría padre.

WordPress ya tiene una función incorporada que hace esto: wp_list_categories()

Utiliza esta función cat_has_subcat('pegar id de categoría')
para verificar si la categoría tiene subcategorías o no
//pégala en tu archivo function.php
//inicio
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;
}
}
//fin
