Вопрос или проблема
как создать это настраиваемое меню, используя функцию wp_nav_menu?
файл function.php
register_nav_menus( array(
'header-menu' => 'Меню верхнего колонтитула',
'footer-menu' => 'Меню нижнего колонтитула'
) );
файл header.php
<?php wp_nav_menu( array( 'theme_location' => 'header-menu', 'container' => '', ) ); ?>
Как назначить class
для <ul> и <li>
Пример HTML
<ul class="nav header-nav header-bottom-nav nav-center nav-uppercase">
<li class=""><a href="https://wordpress.stackexchange.com/questions/286053/index.php" class="nav-top-link">Главная</a></li>
<li class="has-dropdown"><a href="testing.php"
class="nav-top-link">Тестирование<i class="icon-angle-down" ></i></a>
<ul class="nav-dropdown nav-dropdown-default">
<li><a href="hello.php">Привет</a></li>
</ul>
</li>
</ul>
Результат должен выглядеть так в функции WordPress
Вот решение с помощью функции Walker_Nav_Menu
Функция Walker_Nav_Menu
Function.php
class Desktop_Walker_Nav_Menu extends Walker_Nav_Menu {
function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
if (array_search('menu-item-has-children', $item->classes)) {
$output .= sprintf("\n<li class="menu-item has-dropdown dropdown %s"><a href="https://wordpress.stackexchange.com/questions/286053/%s" class=\"nav-top-link\" >%s <i class="icon-angle-down" ></i></a>
\n", ( array_search('current-menu-item', $item->classes) || array_search('current-page-parent', $item->classes) ) ? 'active' : '', $item->url,
$item->title);
} else {
$output .= sprintf("\n<li %s><a href="https://wordpress.stackexchange.com/questions/286053/%s">%s</a>\n", ( array_search('current-menu-item', $item->classes) ) ? '' : '', $item->url, $item->title
);
}
}
function start_lvl(&$output, $depth) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"nav-dropdown nav-dropdown-default\" role=\"menu\">\n";
}
}
Код header.php
<?php
$defaults = array(
'theme_location' => 'header-menu',
'container' => 'ul',
'menu_class' => 'nav header-nav header-bottom-nav nav-center nav-uppercase',
'walker' => new Desktop_Walker_Nav_Menu()
);
wp_nav_menu( $defaults );
?>
Вы можете передать класс в аргументы функции:
‘menu_class’
(строка) CSS класс для элемента ul, который образует меню. По умолчанию
‘menu’.
Так что вы можете попробовать это:
<?php
$args = array(
'menu_class' => 'nav header-nav header-bottom-nav nav-center nav-uppercase',
'menu' => '(ваш_menu_id)'
);
wp_nav_menu( $args );
?>
Вы можете прочитать о меню WordPress. Я предлагаю следующее:
http://www.wpbeginner.com/wp-themes/how-to-add-custom-navigation-menus-in-wordpress-3-0-themes/
http://codex.wordpress.org/Navigation_Menus
На самом деле нет необходимости в walker или каких-либо дополнительных классах. Вы сталкиваетесь с этими стрелками? Просто сделайте это через CSS так:
.your_ul_selector > li.menu-item-has-children::after {
content: '';
width: 10px;
height: 10px;
background: #0f0;
}
Я думаю, что .icon-angle-down
имеет элемент псевдокласса ::after
или ::before
, так что вы можете просто использовать то же самое.
.your_ul_selector
должен быть ul
. Это может измениться в зависимости от того, есть ли контейнер меню и каков его слаг и т.д. … но я думаю, вы понимаете идею?
Если бы вы предоставили демонстрацию, я мог бы быть намного более конкретным.
Вам нужно работать с двумя файлами темы
№1 functions.php
№2 header.php
Сначала вам нужно добавить поддержку темы для меню, а затем зарегистрировать меню в вашем файле functions.php следующим образом
// Для поддержки темы в functions.php
add_theme_support('menus');
// теперь зарегистрируйте меню
function my_menu(){
register_nav_menu('header', 'Меню верхнего колонтитула');
}
add_action('init','my_menu');
Во-вторых, код в вашем header.php
<div class="header_menu" id="header_menu">
<?php
$defaults = array(
'theme_location' => 'header',
'menu' => '',
'container' => '',
'container_class' => '',
'container_id' => '',
'menu_class' => 'main_menu',
'menu_id' => '',
'echo' => true,
'fallback_cb' => 'wp_page_menu',
'before' => '',
'after' => '',
'link_before' => '',
'link_after' => '',
'items_wrap' => '<ul id="header_main_nav" class="nav header-nav header-bottom-nav nav-center nav-uppercase">%3$s</ul>',
'depth' => 0,
'walker' => ''
);
wp_nav_menu($defaults);
?>
</div>
А для подменю просто перейдите в свою панель администратора, внешнему виду, меню и просто перетащите ссылку в подменю, как показано на рисунке
Вот и всё.
Ответ или решение
Чтобы создать настраиваемое меню в WordPress с помощью функции wp_nav_menu
, необходимо выполнить несколько шагов. В этом ответе мы подробно рассмотрим необходимые действия, включая добавление новых меню, настройку классов для элементов и создания вложенных подменю.
1. Настройка меню в файле functions.php
Первым делом, нужно зарегистрировать меню в вашем файле functions.php
:
// Добавляем поддержку для меню в вашей теме
add_theme_support('menus');
// Регистрируем меню
function my_theme_menus() {
register_nav_menus(array(
'header-menu' => __('Header Menu'), // Заголовочное меню
'footer-menu' => __('Footer Menu') // Футерное меню
));
}
add_action('init', 'my_theme_menus');
Данный код активирует функциональность меню в вашей теме и регистрирует два меню: заголовочное и футерное.
2. Создание меню в админ-панели
После регистрации меню, перейдите в админ-панель WordPress:
- Перейдите в раздел Внешний вид > Меню.
- Создайте новое меню и добавьте ссылки, которые вы хотите видеть.
- Не забудьте назначить это меню на нужную область (например, на
Header Menu
).
3. Вызов меню в файле header.php
После того как меню создано, вы можете вывести его в файле header.php
. Пример кода:
<div class="header_menu" id="header_menu">
<?php
$defaults = array(
'theme_location' => 'header-menu', // Указываем, какое меню выводим
'container' => false, // Без контейнера
'menu_class' => 'nav header-nav header-bottom-nav nav-center nav-uppercase', // Классы для <ul>
'depth' => 0, // Глубина меню
'walker' => new Custom_Walker_Nav_Menu() // Класс для кастомизации меню
);
wp_nav_menu($defaults);
?>
</div>
4. Создание кастомногоwalker для меню
Чтобы задать классы для элементов <li>
и <ul>
вашего меню, воспользуемся классом Walker_Nav_Menu
.
class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {
function start_el(&$output, $item, $depth = 0, $args = array()) {
$classes = empty($item->classes) ? array() : (array) $item->classes;
$class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
$class_names = $class_names ? ' class="' . esc_attr($class_names) . '"' : '';
$output .= '<li' . $class_names . '>';
$output .= '<a href="' . esc_url($item->url) . '" class="nav-top-link">' . esc_html($item->title) . '</a>';
if (in_array('menu-item-has-children', $classes)) {
$output .= '<i class="icon-angle-down"></i>'; // Добавляем иконку для подменю
}
}
function start_lvl(&$output, $depth = 0, $args = array()) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"nav-dropdown nav-dropdown-default\" role=\"menu\">\n";
}
}
5. Итоговый код
Ниже представлен полный код для functions.php
и header.php
, который позволит вам создать кастомное меню с использованием wp_nav_menu
:
functions.php:
add_theme_support('menus');
function my_theme_menus() {
register_nav_menus(array(
'header-menu' => __('Header Menu'),
'footer-menu' => __('Footer Menu')
));
}
add_action('init', 'my_theme_menus');
class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {
// Реализация методов как выше
}
header.php:
<div class="header_menu" id="header_menu">
<?php
$defaults = array(
'theme_location' => 'header-menu',
'container' => false,
'menu_class' => 'nav header-nav header-bottom-nav nav-center nav-uppercase',
'depth' => 0,
'walker' => new Custom_Walker_Nav_Menu()
);
wp_nav_menu($defaults);
?>
</div>
Заключение
Теперь у вас есть настраиваемое меню, которое может применять стили и иконки к элементам меню. Вы можете легко управлять им через админ-панель WordPress и расширять функциональность по мере необходимости. Обычно лучше использовать кастомные классы в рамках метода Walker
, чтобы настраивать ваш HTML именно так, как вам нужно.
Если у вас остались вопросы или нужна дополнительная помощь, не стесняйтесь задавать их!