J'essaie de trouver un moyen de changer les classes des différents éléments du menu de navigation, en fonction de la valeur d'une clé méta dans la page.
Le menu ressemble actuellement à ceci:
<li class="menu-item-1">Menu item 1</li>
<li class="menu-item-2">Menu item 2</li>
<li class="menu-item-3">Menu item 3</li>
<li class="menu-item-4">Menu item 4</li>
<li class="menu-item-5">Menu item 5</li>
À l'aide de clés personnalisées, je souhaite récupérer la clé individuelle de chaque page et la placer dans l'élément de menu correspondant, en tant que classe, comme suit:
<li class="menu-item-1 pink">Menu item 1</li>
<li class="menu-item-2 yellow">Menu item 2</li>
<li class="menu-item-3 green">Menu item 3</li>
<li class="menu-item-4 pink">Menu item 4</li>
<li class="menu-item-5 bordeaux">Menu item 5</li>
C'est ce que j'ai jusqu'ici:
add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
global $post;
$colorcode = get_post_meta($post->ID, 'color_dropdown', true);
if(is_page()) {
$classes[] = $colorcode;
}
return $classes;
}
Cela ajoute la clé méta aux classes, mais uniquement lors de la visite d'une page à laquelle une valeur de clé méta est attribuée, puis l'ajoute à tous les éléments de menu, ce qui n'est pas correct.
Je ne peux pas revenir à l'éditeur de menu manuellement à l'aide de la fonctionnalité de classe CSS. L'utilisateur n'aura pas accès à cette zone et il est essentiel que l'utilisateur puisse définir les différentes classes via un menu déroulant Metabox en mode d'édition de page.
Cela fait un moment que je me tire les cheveux et je n'arrive pas à les faire fonctionner, est-ce impossible?
EDIT: MISE À JOUR DE MA QUESTION
Votre code ne le fait pas car le $post
global fait référence à la publication/à la page affichée (le cas échéant). Ce qui est passé avec nav_menu_css_class
est un élément de menu - il s’agit d’un type de message particulier. object
qui stocke:
Il stocke également le object_id
Donc, dans ce que vous voulez faire, c’est vérifier si le terme fait réellement référence à un message (ou à un type de message personnalisé), puis passez le object_id
à la get_post_meta()
:
function wpse51076_special_nav_class($classes, $item){
if( 'post' == $item->object ){
$colorcode = get_post_meta($item->object_id, 'color_dropdown', true);
$classes[] = $colorcode;
}
return $classes;
}
add_filter('nav_menu_css_class' , 'wpse51076_special_nav_class' , 10 , 2);
Essayez ceci, pas testé.
J'ai remplacé $post->ID
par $item->ID
, devrait fonctionner.
add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
global $post;
$colorcode = get_post_meta($item->ID, 'color_dropdown', true);
if(is_page()) {
$classes[] = $colorcode;
}
return $classes;
}