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