web-dev-qa-db-fra.com

Vérifier si la catégorie actuelle a des sous-catégories

J'ai trouvé le code suivant dans le thème WP Base de connaissances / afin d'afficher les sous-catégories d'une catégorie parente. Le problème est que cela ne fonctionne que pour le premier niveau de la hiérarchie, alors je voulais changer la clause if afin de vérifier si la catégorie actuelle avait des enfants, mais je ne sais pas comment faire cela, une idée? Merci

global $term_meta, $cat, $cat_id, $wp_query;

// Check if the current category is not a first level category
// This will happen if the current category does not have any child
// If this is the case, then we simply show all it's posts
// Instead of the Nice knowledgebase type things
if ( $cat->parent != '0' ) {
3
Joaquín L. Robles

Vous pouvez utiliser cet appel de fonction simple qui renvoie soit TRUE, soit FALSE, selon que $children est un tableau vide ou non.

/**
 * Check if given term has child terms
 *
 * @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 );
}

Donc, si vous utilisez uniquement les catégories post intégrées, vous pouvez appeler la fonction comme suit: category_has_children( 17 );

Si vous devez tester une taxonomie personnalisée, cela fonctionnera presque de la même manière, il vous suffira de passer un paramètre supplémentaire 'taxonomy-slug': category_has_children( 7, 'my_taxonomy' ); '

Pour l'appeler dans votre déclaration IF:

if( $cat->parent != 0 && ! category_has_children( $cat->term_id ) )
3
Howdy_McGee

Il existe déjà une fonction de génération pour cela, il n'est pas nécessaire de créer une fonction personnalisée pour cela. La fonction s'appelle get_term_children() et retournera soit

  • Un ensemble de termes enfant si le terme donné a des enfants

  • Un tableau vide si aucun terme enfant n'est trouvé

  • WP_Error object si la taxonomie n'existe pas

En gardant cela à l'esprit, encapsulez get_term_children() dans une fonction et renvoyez true ou false en fonction de la valeur renvoyée si vous avez simplement besoin d'une valeur booléenne (comme une balise conditionnelle).

function has_term_have_children( $term_id = '', $taxonomy = 'category' )
{
    // Check if we have a term value, if not, return false
    if ( !$term_id ) 
        return false;

    // Get term children
    $term_children = get_term_children( filter_var( $term_id, FILTER_VALIDATE_INT ), filter_var( $taxonomy, FILTER_SANITIZE_STRING ) );

    // Return false if we have an empty array or WP_Error object
    if ( empty( $term_children ) || is_wp_error( $term_children ) )
    return false;

    return true;
}

Vous pouvez simplement simplement maintenant passer le terme id à la fonction et le nom de taxonomie correct si la taxonomie est autre que category, et vous obtiendrez une valeur boolen comme les balises conditionnelles intégrées, true en cas de succès si le terme a des enfants , faux si ce n'est pas le cas.

if ( has_term_have_children( 21 ) ) {
    // Do something if term 21 have children
}
5
Pieter Goosen

Pour obtenir le nom des catégories d'enfants. J'ai utilisé la fonction de @ Howdy_McGee pour un processus plus rapide et itératif.

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 is the parent category */
category_has_children($cId, 'post', 'category');

Ceci listera toute la sous-catégorie (enfant) d'une catégorie parent.

0
Shreyo Gi

C'est ce que j'utilise. La variable $ cat est la catégorie SI vous vérifiez:

$categories = get_categories($cat);

if (!empty($categories)) {
    // This Category has children
    }
else {
    // This category has no children
    }
0
Randy Kilwag

Utilisez cette fonction cat_has_subcat('paste cat id') pour vérifier si la catégorie a des sous-catégories ou non

//paste it in your function.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
0
Sudip Debnath