Comment obtenir le slug de catégorie parent du message actuel

12

Mon thème a un style par catégorie en utilisant le 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 idiot de les ajouter toutes en CSS alors que je devrais être en mesure de sélectionner la catégorie parente du message actuel et d'y appliquer des styles.

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

$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 parent.

Je sais que je manque probablement une étape simple quelque part, mais tout aperçu serait grandement apprécié.

DLR
la source

Réponses:

18

Vous devrez utiliser la valeur ID renvoyée par $category[0]->category_parentet la transmettre 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;
}
Rachel Baker
la source
5

Vous devrez rechercher les données de la catégorie parent. get_categoryest à peu près construit pour cela.

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

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

  • Dessin animé
    • Chien
      • Scooby

Le code ci-dessus renverra "Dog" si vous lui donnez l'ID pour "Scooby". Si vous voulez la catégorie parent la plus élevée - "Cartoon" - quelle que soit 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.

s_ha_dum
la source
Merci pour la réponse, et je vais probablement utiliser un extrait similaire à l'avenir, mais cela génère également des erreurs si le message dans une catégorie / catégorie parent sans sous-catégories.
DLR
@DLR: Oui, je sais. J'ai dû partir avant de pouvoir terminer la réponse. Je travaillais sur quelque chose de plus complexe et de plus robuste. Voir l'édition.
s_ha_dum
0

J'aime la réponse précédente de @s_ha_dum, mais pour obtenir la catégorie de haut niveau quelle que soit la profondeur, j'ai utilisé ce que je considère comme 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
scott8035
la source
0

Si cela peut aider quelqu'un ... à avoir un enfant chat ou parent, selon le 0ou 1vous mettez 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';
}
TikTakTikTak
la source
0

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;
Jafar Abazeed
la source
0

La fonction suivante est adaptée pour renvoyer la catégorie racine :

function get_root_category($category = null) {
  if (!$category) $category = get_the_category()[0];
  $ancestors = get_ancestors($category->term_id, 'category');
  if (empty($ancestors)) return $category;
  $root = get_category(array_pop($ancestors)); 
  return $root;
}

Usage: get_root_category()->slug

Zane Claes
la source