Compruebe si la categoría actual tiene hijos

11

Necesito decir si la página de archivo de taxonomía personalizada actual que estoy viendo tiene categorías secundarias. Tengo una situación en la que hay muchas categorías personalizadas con niños y el sitio solo muestra publicaciones al final de la línea. De lo contrario, debería mostrar un enlace a la categoría que es el siguiente paso hacia abajo. Encontré 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()) {
        //use whatever loop or template part here to show the posts at the end of the line
   get_template_part('loop', 'index'); 
       }   

    else {
       // show your category index page here
    }
?>
usuario29489
fuente

Respuestas:

10

Puede haber o no una mejor manera de hacer esto, pero así es como lo haría:

$term = get_queried_object();

$children = get_terms( $term->taxonomy, array(
'parent'    => $term->term_id,
'hide_empty' => false
) );
// print_r($children); // uncomment to examine for debugging
if($children) { // get_terms will return false if tax does not exist or term wasn't found.
    // term has children
}

Si el término de taxonomía actual tiene hijos, la get_termsfunción devolverá una matriz, de lo contrario, devolverá false.

Probado y funciona en mi instalación de vainilla local con el complemento UI de tipo de publicación personalizada utilizado para la generación de CPT.

montrealist
fuente
Cuando eliminé el comentario de print_r ($ children) ... generó una matriz. ¿Cómo podría convertirse eso en un if / else? Lo siento, todavía soy muy nuevo en php
user29489
1
Desprecio Utilicé esto: if ($ children) {echo 'Children Here'; } else {echo 'Sin hijos'; }
user29489
@ user29489 Tienes razón, no fui lo suficientemente claro en mi respuesta. Editado para referencia futura.
montrealist
1
Para aquellos que solo necesitan saber si hay hijos y no necesitan obtener los datos para los términos secundarios, sugiero agregar 'field' => 'count'solo para contar el número de hijos.
JD
¿Funciona esto también con categorías de publicaciones normales?
Pete
9

También hay una posibilidad genérica de WP para hacer esto a través de get_term_children .

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

if( empty( $children ) ) {
    //do something here
}
simonthesorcerer
fuente
1

Suponiendo que está tratando de filtrar sus términos para mostrar solo términos que tienen hijos o no, en realidad puede usar el childlessparámetro en su get_terms()función.

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

Esto generará una serie de términos que no tienen hijos.

Fritas
fuente