web-dev-qa-db-fra.com

Comment obtenir la catégorie parent Slug of Current Post

Mon thème est stylisé par catégorie à l'aide du code suivant, qui insère le slug de la catégorie actuelle en tant que classe CSS.

<div class="CategorySpecificStyle 
    <?php $category = get_the_category(); echo $category[0]->slug; ?>">
        <?php echo $category[0]->cat_name; ?>
</div> 

Maintenant, je suis sur le point d'ajouter un grand nombre de nouvelles sous-catégories, et il semble ridicule de toutes les ajouter en CSS alors que je devrais être en mesure de sélectionner la catégorie parente de la publication en cours et d'appliquer des styles à cette catégorie.

J'ai pu obtenir le nom de la catégorie parente:

$parentcat = get_cat_name($category[0]->category_parent);

Mais les espaces (et la capitalisation) sont un problème ... Et je n'arrive pas à obtenir le slug de la catégorie parente.

Je sais qu'il me manque probablement une étape simple quelque part, mais toute idée serait grandement appréciée.

11
DLR

Vous devrez utiliser la valeur d'ID renvoyée par $category[0]->category_parent et la transmettre par get_term(). Exemple:

$category = get_the_category(); 
$category_parent_id = $category[0]->category_parent;
if ( $category_parent_id != 0 ) {
    $category_parent = get_term( $category_parent_id, 'category' );
    $css_slug = $category_parent->slug;
} else {
    $css_slug = $category[0]->slug;
}
15
Rachel Baker

Vous devrez interroger les données de la catégorie parent. get_category est assez bien conçu pour le faire.

$category = get_the_category(); 
$parent = get_category($category[0]->category_parent);
echo $parent->slug;

Cela retournera le parent immédiat de la catégorie. Cela est donné cet ensemble de catégories:

  • Dessin animé
    • Chien
      • Scooby

Le code ci-dessus retournera "Chien" si vous lui donnez l'ID de "Scooby". Si vous voulez que la catégorie parent la plus haute - "Cartoon" - peu importe la profondeur de l'imbrication, utilisez quelque chose comme ceci:

$category = get_the_category(); 
$parent = get_ancestors($category[0]->term_id,'category');
if (empty($parent)) {
  $parent[] = array($category[0]->term_id);
}
$parent = array_pop($parent);
$parent = get_category($parent); 
if (!is_wp_error($parent)) {
  var_dump($parent);
} else {
  echo $parent->get_error_message();
}

Cela présente également l’avantage d’une gestion des erreurs relativement soignée.

5
s_ha_dum

Si cela peut aider quelqu'un à avoir un enfant chat ou parent, selon le 0 ou le 1 que vous avez mis sur le $category

$category = get_the_category();
$parent = get_cat_name( $category[0]->category_parent );
if( ! function_exists('get_cat_slug') )
{
    function get_cat_slug($cat_id) {
        $cat_id = (int) $cat_id;
        $category = &get_category($cat_id);
        return $category->slug;
    }
}
if ( !empty($parent) ) {
    $output .= '<H2>' . esc_html( $category[1]->name ) . '</H2>';                               
} else {
    $output .= '<H2>' . esc_html( $category[0]->name ) . '</H2';
}
0
TikTakTikTak

J'aime la réponse précédente de @s_ha_dum, mais pour obtenir la catégorie de niveau supérieur quelle que soit la profondeur, j'ai utilisé ce que je considère être une solution plus simple:

$cats = get_the_category();
foreach ( $cats as $cat ) {
    if ( $cat->category_parent == 0 ) {
        return $cat->name; // ...or whatever other attribute/processing you want
    }
}
return ''; // This was from a shortcode; adjust the return value to taste
0
scott8035

Vous pouvez le simplifier comme ceci:

  $category   = get_the_category();
  $cat_parent = $category[0]->category_parent;
  $category   = $cat_parent != 0 ? get_term($cat_parent, 'category')->slug : $category[0]->slug;
0
Jafar Abazeed