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é.

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;
}

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.


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

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';
}

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;

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.