Хук walker_nav_menu_start_el
в WordPress позволяет разработчикам изменять начальный HTML-вывод элементов навигационного меню. Этот хук может быть использован для добавления дополнительного HTML-кода, обертывания ссылок в контейнеры и создания динамически генерируемых подменю.
apply_filters( 'walker_nav_menu_start_el', string $item_output, WP_Post $menu_item, int $depth, stdClass $args );
Данный хук позволяет вносить изменения в HTML-код, который генерируется для каждого элемента меню. Он охватывает только часть вывода, связанную с атрибутами, заголовками и окружением ссылки, но не включает открывающие и закрывающие теги <li>
.
Параметры
$item_output
(строка): HTML-код начального элемента пункта меню.$menu_item
(WP_Post): Объект данных элемента меню.$depth
(int): Уровень вложенности элемента меню, используемый для управления отступами.$args
(stdClass): Объект, содержащий аргументы, переданные вwp_nav_menu()
.
Пример 1: Обертывание ссылок в контейнер
В этом примере мы добавим обертку для каждой ссылки в меню, используя тег <div>
. Это может помочь в стилизации и управлении отображением.
add_filter( 'walker_nav_menu_start_el', 'wrap_links_in_div', 10, 4 );
function wrap_links_in_div( $item_output, $item, $depth, $args ) {
return '<div class="link-wrapper">' . $item_output . '</div>';
}
Пример 2: Добавление кастомного класса к элементам меню
Можно также добавить кастомный класс к каждому элементу меню на основе его ID или класса.
add_filter( 'walker_nav_menu_start_el', 'add_custom_class_to_menu_item', 10, 4 );
function add_custom_class_to_menu_item( $item_output, $item, $depth, $args ) {
if ( $item->ID === 123 ) { // Замените 123 на ваш ID элемента меню
$item_output = str_replace( '<a', '<a class="special-class"', $item_output );
}
return $item_output;
}
Пример 3: Создание кастомного подменю
В этом примере мы добавим кастомное подменю к элементу меню с классом menu-item-target
.
<?php
add_filter( 'walker_nav_menu_start_el', 'add_custom_submenu', 10, 4 );
function add_custom_submenu( $item_output, $item, $depth, $args ) {
$menu_item_classes = $item->classes;
if ( empty( $menu_item_classes ) || !in_array( 'menu-item-target', $menu_item_classes ) ) {
return $item_output;
}
ob_start();
?>
<ul class="custom-sub-menu">
<li class="custom-menu-item">
<a href="#custom-url"><?php _e( 'Custom Link', 'text-domain' ); ?></a>
</li>
</ul>
<?php
$custom_sub_menu_html = ob_get_clean();
// Добавляем подменю после основного элемента
$item_output .= $custom_sub_menu_html;
return $item_output;
}
Пример 4: Условное добавление HTML к элементам меню
Этот пример показывает, как можно добавлять HTML-код к элементам меню в зависимости от состояния пользователя (например, авторизован он или нет).
add_filter( 'walker_nav_menu_start_el', 'conditional_html_based_on_user', 10, 4 );
function conditional_html_based_on_user( $item_output, $item, $depth, $args ) {
if ( !is_user_logged_in() && $item->title === 'Private Section' ) {
$item_output .= '<span class="login-required"> (Login Required)</span>';
}
return $item_output;
}
Пример 5: Изменение атрибутов ссылок
Можно также изменить атрибуты ссылок, добавляя к ним, например, target="_blank"
для открытия в новой вкладке.
add_filter( 'walker_nav_menu_start_el', 'change_link_attributes', 10, 4 );
function change_link_attributes( $item_output, $item, $depth, $args ) {
if ( $item->ID === 456 ) { // Замените 456 на ваш ID элемента меню
$item_output = str_replace( '<a', '<a target="_blank"', $item_output );
}
return $item_output;
}
Заключение
Хук walker_nav_menu_start_el
является мощным инструментом для кастомизации вывода элементов навигационного меню в WordPress. С его помощью можно легко добавлять, изменять или удалять элементы и атрибуты, создавая уникальные и адаптированные под ваши нужды структуры меню. Надеюсь, приведенные примеры помогут вам эффективно использовать этот хук в своих проектах.