Comprobar si la categoría actual tiene subcategorías

28 ene 2015, 16:50:43
Vistas: 33.4K
Votos: 5

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' ) {
0
Todas las respuestas a la pregunta 5
3

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
}
24 jun 2015 10:35:28
Comentarios

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

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

@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

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

@AndrewLazarus también puedes usar get_queried_object_id() en lugar de get_cat_ID() en una página de categoría ;-)

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

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 ) )
28 ene 2015 17:09:26
Comentarios

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

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

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

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

Nota: En Woocommerce el parámetro $taxonomy debe cambiarse a 'product_cat' en lugar de 'category'

luissimo luissimo
20 ago 2020 22:25:23
2

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.

28 ene 2015 18:35:46
Comentarios

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

Howdy_McGee Howdy_McGee
29 ene 2015 17:00:45

Sí, pero personalizar/estructurar es un poco rígido con eso. :)

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

Esto es lo que uso. La variable $cat es el ID de la categoría que estás verificando:

$categories = get_categories($cat);

if (!empty($categories)) {
    // Esta categoría tiene hijos
    }
else {
    // Esta categoría no tiene hijos
    }
24 jun 2015 09:40:45
1

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
9 nov 2017 08:53:34
Comentarios

Sería bueno incluir una explicación de por qué esto resolvería la pregunta del OP.

cjbj cjbj
9 nov 2017 09:54:53