Делаем нестандартное меню в WordPress
Для начала давайте определимся, что такое стандартное и нестандартное меню в WordPress. Лично для меня, да и, думаю, для многих стандартное меню WordPress ассоциируется с чем-то простым и незамысловатым, такое меню встречается в большинстве шаблонов, оно бывает горизонтальным, либо вертикальным. Например, на моем блоге горизонтальное меню, как вы видите, выглядит очень просто, в прочем, как и вертикальное. В WordPress меню, в основном, генерируется с помощью стандартных пользовательских функций, таких как wp_list_categories(), wp_list_pages(), wp_nav_menu(), которое может “регулироваться” какими-нибудь дополнительными свойствами(порядок отображения, сортировка и т.д). Существуют также способы добавлять специфические иконки для пунктов меню и описание, примеры которых можно найти в сети. Сегодня я хочу предложить вам свой вариант нестандартного меню, которое, впрочем имеет свои плюсы и минусы по сравнению со стандартным.
Меню, пример которого я хочу вам продемонстрировать, будет выглядеть вот таким вот образом:
Как видите, пункты меню таким вот нестандартным способом вы вряд ли напишите в заголовках разделов или страниц в административной панели WordPress и уж вряд ли организуете его стандартным способом в функциях wp_list_categories(), wp_list_pages(), wp_nav_menu(). Давайте, не будем терять время и приступим к созданию меню.
Будем считать, что вы уже определились с иконками для разделов меню, создали соответствующие рубрики и страницы и выбрали место для расположения этого самого меню. В нашем случае рассмотрим пример горизонтального меню в “шапке” сайта. Для начала напишем HTML-код нашего меню в файле header.php шаблона, сделаем заголовки так, как мы хотим, чтобы они выглядели в меню:
<ul class="nav"> <li class="articles"> <a href="#"> <strong>.статьи</strong> {<br />Статьи по <br />JS и CSS<br />} </a> </li> <li class="tricks"> <a href="#"> <strong>.трюки</strong> {<br />Задачи, решения<br /> по JS и CSS <br />} </a> </li> <li class="profile"> <a href="#"> <strong>.видео</strong> {<br />Видеоматериалы,<br /> их уроки <br />} </a> </li> <li class="portfolio"> <a href="#"> <strong>.портфолио</strong> {<br />Мои работы<br /> и код <br />} </a> </li> <li class="contacts"> <a href="#"> <strong>.верстаю</strong> {<br />Вёрстка сайтов,<br />обо мне, контакты<br />} </a> </li> </ul>
Теперь зададим стили, учтите, что для нашего меню будем также использовать псевдокласс :hover и создадим для пунктов меню специальный класс active, который будет срабатывать при активном пункте меню.
.nav { background: url(images/navBg.jpg) left top repeat; border: 1px solid #fff; border-width: 1px 0 0; overflow: hidden; } .nav li { float: left; height: 4.833em; background: url(images/navLi_left1.gif) left no-repeat; padding: 0 3px;border-bottom: 5px solid #212121; } .nav li:hover,.nav li.active{ border-bottom: 5px solid #e26426; } .nav li a { color: #000; display: block; height: 100%; padding-left: 40px; padding-right: 5px; font: .833em Verdana, Geneva, sans-serif; background-image: url(images/sprite.png); background-repeat: no-repeat; } .nav li a strong { font-size: 1.2em;} .nav li.articles a{ background-position: 3px 14px; } .nav li.tricks a { background-position: 3px -169px; } .nav li.portfolio a { background-position: 3px -572px; } .nav li.profile a { background-position: 3px -370px; } .nav li.contacts a { background-position: 3px -756px; } .nav li.articles a:hover,.nav li.articles.active a { background-position: 3px -75px; } .nav li.tricks a:hover,.nav li.tricks.active a { background-position: 3px -269px; } .nav li.portfolio a:hover,.nav li.portfolio.active a { background-position: 3px -663px; } .nav li.profile a:hover,.nav li.profile.active a { background-position: 3px -482px; } .nav li.contacts a:hover,.nav li.contacts.active a { background-position: 3px -854px; }
Здесь я задаю иконки для пунктов меню изображением-спрайтом, которое позиционирую в зависимости от того или иного действия. Поскольку, пункты меню не могут генерироваться в таком виде, в каком мы их обозначили в нашем меню, нам придется вручную прописывать ссылки на нужные разделы или страницы в HTML-коде, которое мы создали выше.
<ul class="nav"> <li class="articles"> <a href="/articles"> <strong>.статьи</strong> {<br />Статьи по <br />JS и CSS<br />} </a> </li> <li class="tricks"> <a href="/tricks"> <strong>.трюки</strong> {<br />Задачи, решения<br /> по JS и CSS <br />} </a> </li> <li class="profile"> <a href="/video"> <strong>.видео</strong> {<br />Видеоматериалы,<br /> их уроки <br />} </a> </li> <li class="portfolio"> <a href="/portfolio"> <strong>.портфолио</strong> {<br />Мои работы<br /> и код <br />} </a> </li> <li class="contacts"> <a href="/about"> <strong>.верстаю</strong> {<br />Вёрстка сайтов,<br />обо мне, контакты<br />} </a> </li> </ul>
В данном случае я указал произвольный вариант постоянных ссылок, а не по умолчанию, который имеет вид ?p=123, например, для записей. Все уже практически сделанно, меню работает, осталось только указать пунктам меню состояние active при нажатом состоянии. Для этого вернемся к нашему HTML-коду и допишем условие, при котором активный пункт меню и будет принимать это состояние.
<ul class="nav"> <li class="articles<?php if (is_category(18)) echo ' active'; ?>"> <a href="/articles"> <strong>.статьи</strong> {<br />Статьи по <br />JS и CSS<br />} </a> </li> <li class="tricks<?php if (is_category(16)) echo ' active'; ?>"> <a href="/tricks"> <strong>.трюки</strong> {<br />Задачи, решения<br /> по JS и CSS <br />} </a> </li> <li class="profile<?php if (is_category(28)) echo ' active'; ?>"> <a href="/video"> <strong>.видео</strong> {<br />Видеоматериалы,<br /> их уроки <br />} </a> </li> <li class="portfolio<?php if (is_page(97)) echo ' active'; ?>"> <a href="/portfolio"> <strong>.портфолио</strong> {<br />Мои работы<br /> и код <br />} </a> </li> <li class="contacts<?php if (is_page(41)) echo ' active'; ?>"> <a href="/about"> <strong>.верстаю</strong> {<br />Вёрстка сайтов,<br />обо мне, контакты<br />} </a> </li> </ul>
Зная ID категорий и страниц, мы можем дописать условие, при котором ссылка, которая в нашем случае является пунктом меню, будет принимать актиное состояние. Проще говоря, условие <?php if (is_page(97)) echo ‘ active’; ?> можно перевести так: “Если выбрана ссылка на страницу с ID=97, то для нее выводится класс, соответствующий классу active в стиле CSS”.
Делаем нестандартное меню в WordPress: 8 комментариев
Помогите пожалуйста!! До профессионального веб-мастера мне ещё далеко, хотелось бы сделать слева меню со списком стран и флагами. В вашей статье “Делаем нестандартное меню в WordPress” очень подробно прописано, но мне необходимо вертикальное меню, а самостоятельно- боюсь напортачить. Не могли бы дать подсказку как прописать в стиле CSS расположение каждого пункта, с учетом разных картинок и текста. И как прописать фон меню Картинка с названием. Помогите, если есть такая возможность уже 3 недели ежедневно изучаю все тонкости, но пока самой не справиться
Все зависит от того, будут ли рубрики сайта постоянными или динамическими.
Добрый день,
В горизонтальном меню выводятся все страницы.
Подскажите как сделать, что бы в горизонтальном меню выводились только определенные страницы?
Я так понимаю определяется в файле bottom-menu.php
<a href="#content" rel="nofollow">
<a href="#secondary" rel="nofollow">
‘menu-header’, ‘theme_location’ => ‘primary’ ) );
else
wp_nav_menu( array( ‘container_class’ => ‘menu-header’, ‘theme_location’ => ‘primary’, ‘menu_class’ => ‘sf-menu’,'fallback_cb’ => ‘admired_page_menu’ ) );?>>
Не могу понять почему, бывает отступ с лева и с права, на глаз одинаковый, т.е. не во всю ширину, шаблона?
Добрый день! Как мне сделать, чтобы пункт меню, созданный в админке вордпресс гостю отображался с названием Вход (при нажатии на этот пункт меню у меня открывается модальное окно с формой входа), а зарегистрированному пользователю отображался этот же пункт меню, только со ссылкой
со ссылкой на выход с сайта… Или сделать просто 2 пункта меню, только для гостей будет первый пункт меню виден, а второй скрыт, а для остальных будет первый пункт меню скрыт а второй виден… (Извиняюсь за два комментария, лагнул инет…) Заранее спасибо за помощь!
Добрый день.
Хорошая статья про меню! Класс!
Но у меня не выделяется выбранное меню!
ID страниц прописаны и проверены..
Т.е. при наведении на определенное меню изображение меняется, а при выборе раздела потом не горит выбранный раздел (меню).
Можете подсказать где ошибка? (print-51_ru)