Навигационное меню – Добавление класса на основе мета-ключей
Я пытаюсь найти способ изменить классы различных пунктов навигационного меню, основываясь на значении мета-ключа на странице.
Меню в настоящее время выглядит следующим образом:
<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. У пользователя не будет доступа к этой области, и очень важно, чтобы пользователь мог устанавливать различные классы с помощью раскрывающегося меню метабокса в режиме реального редактирования страницы.
Я уже некоторое время дергаю себя за волосы и, кажется, не могу заставить их работать, это невозможно?
РЕДАКТИРОВАТЬ: ОБНОВИЛ СВОЙ ВОПРОС
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);
Попробуйте это, не проверено.
Я заменил $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;
}