Вывод меню с помощью функции wp_nav_menu
В позапрошлой статье блога я писал про интересное нововведения последней версии wordpress — специальный механизм создания и управления меню в wordpress 3.0. Теперь стало намного удобнее и проще обычным пользователям создавать различные по сложности меню, которые могут состоять не только страницы или категории блога, но и иметь ссылки на любые URL. Для отображения меню в шаблоне используется специальная функция wp_nav_menu — про нее сегодня и расскажу.
Если в админке wordpress нету раздела меню, то его можно активировать добавлением специального кода в файл functions.php
<?php if (function_exists('add_theme_support')) { add_theme_support('menus'); } ?> |
Далее создаете меню в соответствующему пункте раздела «Внешний вид» (Appearence). После этого в шаблоне блога в нужном нам месте выводим само меню через код:
<?php wp_nav_menu('menu=first'); ?> |
Здесь first — название созданного нами меню. Это использование функции в общем случае без виджетов, с ними там нужно будет немного по другому работать. Тем не менее функция wp_nav_menu может выводиться и без аргументов, в результате чего будут «просматриваться» разные ситуация — сначала совпадение по названию меню, если для него указан хотя бы один пункт меню, в противном случае будет просто отображено непустое меню ну и т.п. Но опять же советую просто использовать приведенный выше код и не разбираться потом что должна выводить функция без аргументов. Ее синтаксис выглядит следующим образом:
<?php wp_nav_menu($args); ?> |
Здесь используются следующие параметры:
$menu — выбранный идентификатор для меню — ID, slug или название меню.
$container — меню UL по умолчанию «оборачивается» в контейнер DIV с помощью данной настройки.
$container_class — указывает класс контейнера, по умолчанию его значение menu-{menu slug}-container, то есть в нашем случае, например, будет класс menu-first-container.
$container_id — можно добавить контейнеру ID, по умолчанию не указано.
$menu_class — класс для элемента меню UL, его значение — menu.
$menu_id — ID для элемента ul, по умолчанию равно значению menu-{slug}
$echo — если вы не хотите отображать меню, а возвращать значение функции используйте для этой настройки значение 0.
$fallback_cb — если меню не существует, вызывается функция wp_page_menu.
$before — задает текст, который выводится перед ссылкой А.
$after — текст после ссылки А, по умолчанию он, как и предыдущий, пустые.
$link_before — выводит фразу перед текстом ссылки, не задано.
$link_after — выводится после текста ссылки, тоже пустое.
$depth — задает количество уровней иерархии для вывода меню, значение по умолчанию 0 выводит все меню целиком.
$walker — какой-то непонятный пользовательский «walker object», наверное больше понадобится продвинутым разработчикам.
$theme_location — локация темы, где будет использовано меню, должна быть активирована через register_nav_menu() для того чтобы пользователь смог ее выбирать. Тоже какая-то не совсем понятная настройка, судя по всему, при работе с виджетами.
Примеры использования функции wp_nav_menu
Самый простой код, приведенный в кодексе:
<div class="access"> <?php wp_nav_menu(); ?> </div> |
Хотя, как я говорил выше, лучше всего сразу указывать название меню дабы не возникало разногласий.
Меняем класс для элемента меню UL
<?php wp_nav_menu('menu=first&menu_class=my-main-menu'); ?> |
Убираем контейнер DIV из меню
<?php wp_nav_menu('menu=first&container='); ?> |
либо как сказано в кодексе
<?php wp_nav_menu( array( 'container' => '' ) ); ?> |
В принципе, ничего сложного в создании и управлении меню wordpress 3.0 нет. Разработчики значительно упростили процедуру работы и расширили возможности данного элемента навигации. Решение часто используется во множестве задач по шаблону, например, при создании разного меню в WordPress для мобильной и десктопной версией. Чуть позже добавлю еще парочку сниппетов по теме.
P.S. Постовой. Интересный и полезный вебмастерам Блог по SEO, где вы найдете ответы на интересующие вас вопросы по seo.
Компания Aweb уже давно и очень хорошо зарекомендовала себя в области услуг раскрутка сайта, оптимизация и поисковое продвижение в интернете.
комментариев 48 к статье “Вывод меню с помощью функции wp_nav_menu”
Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!
Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:
- Як сховати відсутні товари в Woocommerce шорткодах та схожих товарах
- Сервіс AdMaven + плагін для монетизації трафіка на WordPress сайтах
- Плагіни для створення стрічки новин з біжучим рядком в WordPress
- Як змінити розміщення кнопки оформлення замовлення в WooCommerce
- Плагін WHWS Display In Stock Products First – відображення товарів в наявності першими
- Підписка MonsterONE: чи варто використовувати цей сервіс у 2023 році? (+5 продуктів, які треба скачати в першу чергу)
- Онлайн генератор ссылок на мессенджеры для WordPress и не только
- WooCommerce (46)
- Безопасность (12)
- Видео (6)
- Виджеты (28)
- Возможности (141)
- Вопрос-ответ (6)
- Начинающим (52)
- Новости (46)
- Оптимизация (23)
- Плагины (246)
- Сервисы (87)
- Хаки и секреты (87)
- Шаблоны (45)
- Записи и посты wordpress, оформление записи (5,91 из 7, голосов - 47)
- Проблема с адаптивными изображениями в Gutenberg редакторе WordPress (3,93 из 7, голосов - 46)
- Умный копирайт в footer.php для wordpress (5,63 из 7, голосов - 30)
- Обновление плагинов и тем в WordPress: автоматическое, через FTP, скрытие уведомлений (5,19 из 7, голосов - 31)
- Polylang — плагин для мультиязычных сайтов на нескольких языках в WordPress (4,42 из 7, голосов - 31)
- Плагин TinyMCE Advanced – wordpress текстовый редактор (6,35 из 7, голосов - 20)
- Рубрики и категории wordpress, функция wp_list_categories (6,05 из 7, голосов - 20)
- Дизайн Мания - о веб-дизайне и не только.
- Tod's Blog - все про заработок онлайн.
- Вебдванольные заметки - обзоры веб-сервисов.
- Советы по выбору холодильника LG с технологией No Frost
- Зачем нужны Wi-Fi ретрансляторы и как выбрать подходящую модель
- Введение в онлайн-казино Slotor777: многообразие игр и привлекательные бонусы
- Необходимость использования облачного хранилища в наше время, что важно и как выгодно?
- Спрощення процесу звітності за допомогою програми BAS Бухгалтерія
- Технологія підключення інтернету GPON та її переваги
- За що гравці найбільше цінують Lineage 2
- Для каких проектов нужна аренда виртуального сервера и что такое VPS
Выводится именно через wp_nav_menu (через wp_page_menu — да, сортировку можно изменить аргументами функции). Проблема собственно в том, что эта wp_nav_menu видимо не поддерживает такие аргументы.
И разве можно через админку менять очередность созданных страниц? Я их создавал в том порядке, в котором хотел чтобы они выводились. Ан нет, сортируются по алфавиту..
ADv, ну, насколько я вижу в функции нет параметра для сортировки. Порядок задается именно в админке и по идее должен соблюдаться, так что глюк где-то в этой области.
Большое спасибо, долго искал способ как добавить второе меню в шапку. Рабочий и понятный способ нашел только у Вас. Удачи и процветания Вашему сайту!!!
Вы помогли мне решить проблему, которая мне досаждала больше года. Респект Вам!
Здравствуйте.
Помогите, пожалуйста.
Вывожу меню.
Код:
theme_get_option(‘theme_menu_source’),
‘depth’ => theme_get_option(‘theme_menu_depth’),
‘menu’ => ‘primary-menu’,
‘class’ => ‘art-hmenu’
)
);
?>
Код ссылки в пункте меню:
АНКОР
ВОПРОС.
Как сделать, чтобы атрибут titile не выводился для этих ссылок. Он очень мешает, так как закрывает пункты меню.
Заранее спасибо!
Сергей, на ум приходит вариант с вызовом функции с параметром echo=0 и последующей обработкой (удалением атрибута title) — по аналогии с этим постом.
Клиент требует убирать из меню те страницы сайта (меню основано на страницах), для которых стоит статус «Черновик» или «На утверждении».
Можно ли каким нибудь способом, либо:
a) не формировать это меню в момент сборки, или же
б) присваивать такому пункту какой либо, скажем, класс, например class=»hiddenitem»
В данный момент меню формируется следующим образом:
$args = array(
‘theme_location’=>’equipment-menu’,
‘container’=>’div’,
‘container_class’=>’children_menu_top’,
‘container_id’=>’menu’,
‘menu_class’=>’sf-menu’,
‘menu_id’=>’children_menu’,
‘before’=>»,
‘after’=>»,
‘fallback_cb’=>false
);
wp_nav_menu($args);
adward, вы уверены, что эти пункты меню вообще показываются? мне казалось функция их не отображает. Можно, конечно, не выводить меню (параметр $echo) а для начала его обработать, проверив статус каждого элемента (пункта меню), но я не замечал там данных о том черновик ли это или опубликованная статья.
Мне подсказали.
Если вписать в functions.php следующий хук:
add_filter(‘nav_menu_css_class’ , ‘nav_menu_add_post_status_class’ , 10 , 2);
function nav_menu_add_post_status_class($classes, $item)
{
$post_status = get_post_status($item->object_id);
$classes[] = $post_status;
return $classes;
}
то к пунктам меню дш будут присваиваться классы publish,draft, и так далее в зависимости от статуса.
adward, спасибо за подсказку) полезный хак.
а как к меню, выведенному через функции wp_nav_menu, к заданным пунктам вывести сбоку от текста картинку?
SOVA, это можно сделать с помощью шрифта Font Awesome.
Здравствуйте. При помощи этой функции
‘primary’, ‘before’=> »,’after’ => »,) ); ?>
происходит вывод меню. Но когда я добавляю цикл вывода постов в главной области шаблона, при переходе по элементам меню (по страницам, которые были ранее созданы в админке и добавлены в меню) я наблюдаю следующее: на каждой созданной странице из меню публикуется пост с содержанием названия страницы (именно страницы) и дата его создания. При этом записей (постов) вообще нет. Вывод постов делаю самым простым циклом. Вопрос: какого …. WP видит страницы как записи (посты) и их публикует?
Дмитрий, понимаю, что фраза «где-то вы ошиблись» не прояснит ситуацию, но мне сложно так сориентироваться сходу в проблеме.
Я бы еще раз все хорошенько проверил, но если все равно ничего не работает (бывает пропустил какую-то мелочь и в упор ее не видно), то я бы взял обычный простой шаблон скопировал бы оттуда файл page.php, который отвечает за шаблон страницы и добавил бы себе в блог. Если глюк остается, то искать ошибку надо в других файлах, в частности в header.php. Файл страницы вообще не имеет никакого отношения к шаблону вывода постов и к меню, ошибка где-то в другом месте. Попробуйте вывести меню с помощью функции wp_nav_menu вообще без дополнительных параметров, только с названием меню.
Tod, Вы попали прям в яблочко… дважды. Первое: это была невнимательность; второе: не создан файл page.php (хотя я радостно верил что он есть). Спасибо за быстрый ответ. Если бы сегодня днем не заметил, то, после прочтения, точно бы исправил. =)
Привет. Парни! Вы такие молодцы….
А у меня после плагина очередного пропал из меню WP раздел Тheme Options.
Помогите престарелому ламеру — напишите плиз что и куда, Прасти Оспади, вставить.
Мерси!
Андрей, плагины есть разные, некоторые не сопоставимы с той или иной версией системы или же просто не особо хорошие. Если после установки модуля что-то ломается, то лучше его отключить. Если можно отключить из админки, если нет удалить с ФТП. Как правило, для нужных задач есть 2-3 аналогичных плагина.
Отличный урок, спасибо!