Навигационное меню – Добавление класса на основе мета-ключей


Я пытаюсь найти способ изменить классы различных пунктов навигационного меню, основываясь на значении мета-ключа на странице.

Меню в настоящее время выглядит следующим образом:

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

Используя пользовательские ключи, я хочу извлечь отдельный ключ с каждой страницы и поместить их в соответствующий пункт меню в виде класса, например:

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

Вот что у меня пока есть:

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

Что он делает, так это добавляет мета-ключ к классам, но только тогда, когда посещение страницы, которой присвоено значение мета-ключа, а затем она добавляет его во все пункты меню, что неправильно.

Я не могу вернуться к редактору меню вручную, используя функцию класса CSS. У пользователя не будет доступа к этой области, и очень важно, чтобы пользователь мог устанавливать различные классы с помощью раскрывающегося меню метабокса в режиме реального редактирования страницы.

Я уже некоторое время дергаю себя за волосы и, кажется, не могу заставить их работать, это невозможно?

РЕДАКТИРОВАТЬ: ОБНОВИЛ СВОЙ ВОПРОС

Author: INT, 2012-05-03

2 answers

Ваш код этого не делает, потому что глобальный $post относится к просматриваемой записи/странице (если она есть...). То, что передается с помощью nav_menu_css_class, является пунктом меню - это определенный тип записи. Среди его свойств есть: object в котором хранится:

  • тип записи, если ссылка ссылается на запись
  • таксономия, если ссылка ссылается на страницу терминов таксономии
  • "пользовательский", если это пользовательская ссылка

Он также хранит object_id

  • идентификатор записи, если ссылка относится к сообщению
  • идентификатор термина, если ссылка ссылается на страницу термина таксономии
  • идентификатор записи пользовательской ссылки

Итак, в том, что вы хотите сделать, это проверить, действительно ли термин относится к сообщению (или пользовательскому типу сообщения), а затем передать object_id в 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
Author: Stephen Harris, 2012-05-05 13:25:03

Попробуйте это, не проверено.
Я заменил $post->ID на $item->ID, должно сработать.

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
Author: janw, 2012-05-05 11:01:22