Comprobar si la Categoría Actual tiene Subcategorías

28 mar 2013, 18:47:32
Vistas: 50K
Votos: 12

Necesito determinar si la página de archivo de taxonomía personalizada que estoy viendo tiene categorías hijas. Tengo una situación donde hay muchas categorías personalizadas con subcategorías y el sitio solo debe mostrar publicaciones al final de la línea. De lo contrario, debería mostrar un enlace a la categoría que es el siguiente paso. He encontrado este fragmento, pero no parece funcionar para taxonomías personalizadas.

function category_has_children() {
global $wpdb;   
$term = get_queried_object();
$category_children_check = $wpdb->get_results(" SELECT * FROM wp_term_taxonomy WHERE parent = '$term->term_id' ");
    if ($category_children_check) {
        return true;
    } else {
       return false;
    }
}   

<?php
    if (!category_has_children()) {
        // usar cualquier bucle o parte de plantilla aquí para mostrar las publicaciones al final de la línea
   get_template_part('loop', 'index'); 
       }   

    else {
       // mostrar tu página de índice de categorías aquí
    }
?>
0
Todas las respuestas a la pregunta 4
5
16

Puede que exista o no una mejor manera de hacer esto, pero aquí te muestro cómo lo haría yo:

$term = get_queried_object();

$children = get_terms( $term->taxonomy, array(
'parent'    => $term->term_id,
'hide_empty' => false
) );
// print_r($children); // descomenta para examinar durante depuración
if($children) { // get_terms devolverá false si la taxonomía no existe o no se encontró el término.
    // el término tiene hijos
}

Si el término de taxonomía actual tiene hijos, la función get_terms devolverá un array, de lo contrario devolverá false.

Probado y funciona en mi instalación local básica con el plugin Custom Post Type UI utilizado para la generación de CPT.

28 mar 2013 19:34:29
Comentarios

Cuando descomenté el print_r($children)... mostró un array. ¿Cómo podría convertirse eso en un if/else? Lo siento, todavía soy muy nuevo en php

user29489 user29489
28 mar 2013 19:43:29

Olvídalo, usé esto: if ($children) { echo 'Hay hijos'; } else { echo 'No hay hijos'; }

user29489 user29489
28 mar 2013 19:52:25

@user29489 Tienes razón, no fui lo suficientemente claro en mi respuesta. Editado para referencia futura.

montrealist montrealist
28 mar 2013 20:02:15

Para aquellos que solo necesitan saber si hay hijos y no necesitan obtener los datos de los términos hijos, sugiero agregar 'field' => 'count' para simplemente contar el número de hijos.

J.D. J.D.
30 dic 2013 21:54:32

¿Esto también funciona con categorías normales de entradas?

Pete Pete
19 nov 2018 02:48:30
0
15

También existe una posibilidad genérica en WP para hacer esto mediante get_term_children.

<?php
$children = get_term_children($termId, $taxonomyName);

if( empty( $children ) ) {
    //hacer algo aquí
}
12 dic 2013 15:32:27
0

Suponiendo que estás intentando filtrar tus términos para mostrar solo aquellos que tienen hijos o no, en realidad puedes usar el parámetro childless en tu función get_terms().

$children = get_terms( 
    'taxonomy' => '$taxonomy_slug',
    'hide_empty' => false,
    'childless' => true
  ) 
);

Esto devolverá un array de términos que no tienen hijos.

20 may 2016 12:37:00
1
-2

Esta es, sin duda, la solución más limpia

$term = get_queried_object();
if($term->parent == 0 ){
  // hacer algo;
}
26 feb 2021 12:51:27
Comentarios

Esto es incorrecto. $term->parent == 0 te indicará si la categoría es una hija, pero no si tiene hijas. Como ejemplo, la categoría predeterminada Sin categorizar pasaría tu prueba, pero no tiene categorías hijas.

Mike Mike
11 sept 2021 23:59:57