Intereting Posts
Я хочу знать о плагинах, которые помогают, когда я пишу код на своей странице? Как делиться сообщениями (и плагинами) между существующим сайтом и новой, отдельной установкой dev / test? Страницы с разбивкой по страницам отображают правильный контент, но ссылки на страницы не являются Показывать прикрепленное мультимедийное изображение, если не обнаружено уменьшенное изображение Выход из системы Как получить значение из поля ввода в шаблоне просмотра мультимедиа Отображение HTML, если сообщение находится в определенном термине таксономии Обновить параметр WP плагином Ошибка ресурса 404 при установке подкаталога multisite Миниатюра и Лучшее изображение с фиксированными размерами? Как я могу сделать окно поиска для поиска по настраиваемому полю Коррумпированная база данных WordPress WP Pagenavi показывает только первые две страницы без ошибок Хотите добавить корзину и строку поиска справа от линии логотипа Редактор настраиваемого типа сообщений с динамическими выделениями, один снижающийся вниз, забрасывающий вторую секунду, не работает

Добавление первого и последнего класса в меню только на верхнем уровне

Я использую WordPress Menu для создания навигации, структурированной следующим образом:

  • Главная
  • Около
  • контакт
    • Подстраница

Используя этот код из ответа kuroi здесь, я могу добавить классы элементов first-menu-item и last-menu-item в элементы списка выше:

 function add_first_and_last($output) { $output = preg_replace('/class="menu-item/', 'class="first-menu-item menu-item', $output, 1); $output = substr_replace($output, 'class="last-menu-item menu-item', strripos($output, 'class="menu-item'), strlen('class="menu-item')); return $output; } add_filter('wp_nav_menu', 'add_first_and_last'); 

Однако класс last-menu-item добавляется в элемент списка подстраниц (потому что он последний), а не в элемент списка контактов.

Вопрос. Как я могу сделать эту функцию применимой только к элементам верхнего уровня меню?

Благодаря!

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

 function add_position_classes_wpse_100781($classes, $item, $args) { static $fl; if (0 == $item->menu_item_parent) { $fl = (empty($fl)) ? 'first' : 'middle'; $classes[] = $fl.'-menu-item'; } return $classes; } add_filter('nav_menu_css_class','add_position_classes_wpse_100781',1,3); function replace_class_on_last_occurance_wpse_100781($output) { $output = substr_replace( $output, 'last-menu-item ', strripos($output, 'middle-menu-item'), strlen('middle-menu-item') ); return $output; } add_filter('wp_nav_menu', 'replace_class_on_last_occurance_wpse_100781'); 

То, что я сделал, это добавить first-menu-item middle-menu-item в верхний уровень только с первым фильтром на nav_menu_css_class . Затем со вторым фильтром я заменил последнее вхождение элемента middle-menu-item из middle-menu-item с last-menu-item .

Он работает для нескольких тестовых случаев, которые я пробовал.

У меня мало исправить код Bainternet, потому что этот код не работает, если последний элемент имеет подпункт

 function wpb_first_and_last_menu_class($items) { $items[1]->classes[] = 'first-menu-item'; // add first class $cnt = count($items); while($items[$cnt--]->post_parent != 0); // find last li item $items[$cnt+1]->classes[] = 'last-menu-item'; // last item class return $items; } add_filter('wp_nav_menu_objects', 'wpb_first_and_last_menu_class'); //filter to iterate each menu 

что-то вроде этого:

 function add_first_and_last_classes_wpa100781($items) { $items[1]->classes[] = 'first'; $items[count($items)]->classes[] = 'last'; return $items; } add_filter('wp_nav_menu_objects', 'add_first_and_last_classes_wpa100781'); 

Я бы посоветовал:

1) пропустить добавление первого класса элемента меню . Это дополнительный php, который вам не нужен. Использование ul > li:first-child позволит вам настроить таргетинг на первый пункт меню либо в CSS, либо в виде селектора jQuery. :first-child отличная поддержка браузера (более: last-child, поэтому я бы добавил класс для последнего пункта меню).

2) Найдите последний пункт меню верхнего уровня и добавьте к нему класс. Отбросьте этот код в файл functions.php вашей темы, и он добавит класс только к последнему элементу навигации верхнего уровня, а не к последнему пункту навигации, как и многие фрагменты кода в других ответах здесь.

 // Add a class to the last top-level menu item function fancy_last_menu_item_class($items) { // Create an empty array to hold the array ID's of top level menu items $topLevelMenuItemIDs = array(); // Loop through all of the menu $items for($i=0,$count=count($items);$i<$count;$i++){ // Check if the 'menu_item_parent' property is set to '0' if($items[$i]->menu_item_parent == 0){ // This item has no parent menu items, so it's top-level. // Add its array ID to the top level menu item IDs array. $topLevelMenuItemIDs[] = $i; } } // Count how many top level nav items were found, so you can target the last one $topLevelMenuItemCount = count($topLevelMenuItemIDs); // Add a class to the last top level navigation item. $lastMenuItemClass = 'last-menu-item'; $items[$topLevelMenuItemIDs[--$topLevelMenuItemCount]]->classes[] = $lastMenuItemClass; // Return the items with the altered last item return $items; } // Hook the last menu item class to the wp_nav_menu_objects filter add_filter('wp_nav_menu_objects', 'fancy_last_menu_item_class');