web-dev-qa-db-fra.com

Menu de navigation - Ajouter une classe basée sur les clés méta

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

1
INT

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:

  • le type de message si le lien fait référence à un message
  • la taxonomie si le lien renvoie à une page taxonomie-terme
  • 'custom' s'il s'agit d'un lien personnalisé

Il stocke également le object_id

  • le post id si le lien fait référence à un post
  • le terme id si le lien fait référence à une page taxonomie-terme
  • l'identifiant du lien personnalisé

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);
2
Stephen Harris

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