Как добавить подменю в меню, сгенерированное wp_nav_menu, используя плагин
У меня есть меню, сгенерированное с помощью wp_nav_menu
, которое выглядит так:
<ul class="nav-menu" id="menu-top-nav">
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Пункт 1</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Пункт 2</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Пункт 3</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Пункт 4</a></li>
</ul>
Я хочу модифицировать меню выше, добавив подменю к "Пункту 3" используя мой плагин. Вот желаемый результат:
<ul class="nav-menu" id="menu-top-nav"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Пункт 1</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Пункт 2</a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Пункт 3</a>
<ul class="sub-menu">
<li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">дочерний 1</a></li>
<li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">дочерний 2</a></li>
<li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">дочерний 3</a></li>
</ul>
</li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Пункт 4</a></li>
</ul>
Я пробовал следующие фильтры, но они не помогли мне достичь желаемого результата:
wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items
Вариант решения 1:
add_filter('wp_nav_menu_items', 'my_custom_menu_item', 10, 2);
function my_custom_menu_item($items, $args)
{
$parent_item_number = 3; // номер родительского элемента
$pos = nth_strpos($items, '</a>', $parent_item_number) + 4;
$cat_id = 9; // ID категории
$args = array('numberposts' => 5, 'category' => $cat_id);
$myposts = get_posts($args);
if (!empty($myposts))
{
$str_to_insert = '<ul class="sub-menu">';
global $post;
foreach ($myposts as $post) :
setup_postdata($post);
$str_to_insert .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
endforeach;
$str_to_insert .= '</ul>';
$items = substr($items, 0, $pos) . $str_to_insert . substr($items, $pos);
}
return $items;
}
function nth_strpos($str, $substr, $n, $stri = false)
{
if ($stri)
{
$str = strtolower($str);
$substr = strtolower($substr);
}
$ct = 0;
$pos = 0;
while (($pos = strpos($str, $substr, $pos)) !== false)
{
if (++$ct == $n)
{
return $pos;
}
$pos++;
}
return false;
}
Вышеприведенное решение работает, но я думаю, что это не самый правильный способ достижения желаемого результата. Буду рад получить от вас более элегантное решение.

Вы можете изменить своё меню, используя walker.
include('subMenu.php');
$menu = wp_nav_menu( array('menu' => 'ВАШЕ-НАЗВАНИЕ-МЕНЮ','menu_class' => 'megamenu','walker' => new subMenu));
Создайте файл subMenu.php в папке темы и добавьте следующий код:
<?php
class subMenu extends Walker_Nav_Menu {
function end_el(&$output, $item, $depth=0, $args=array()) {
if( 'Пункт 3' == $item->title ){
$output .= '<ul class="sub-menu">
<li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">Дочерний 1</a></li>
<li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">Дочерний 2</a></li>
<li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">Дочерний 3</a></li>
</ul>';
}
$output .= "</li>\n";
}
}

Хук wp_nav_menu_items
подходит, если вы хотите добавить элементы в структуру меню WordPress.
Ниже приведен пример добавления статической ссылки "Главная". Ссылка статична, она создается через функцию home_url()
, а её параметры встраиваются в аргументы меню WordPress (значения before и after). Элемент li
остается статичным и изменяется только при использовании Walker для этого элемента. Хук wp_nav_menu_items
находится внутри списка ul
. После определения переменной с новым элементом меню, я добавляю её к стандартному списку в переменной $items
, которая формируется перед выводом меню. В конце просто возвращаю весь контент.
add_filter( 'wp_nav_menu_items', 'fb_add_home_link', 10, 2 );
function fb_add_home_link( $items, $args ) {
$home_item =
'<li>' .
$args->before .
'<a href="' . home_url( '/' ) . '" title="Главная">' .
$args->link_before . __( 'Главная' ) . $args->link_after .
'</a>' .
$args->after .
'</li>';
$items = $home_item . $items;
return $items;
}

Похоже, вы не прочитали мое описание проблемы, поэтому ваше решение не соответствует тому, что мне нужно. Мне не требуется добавлять элемент в начало или конец меню, а нужно создать подменю под определенным родительским элементом. Пожалуйста, прочтите вопрос внимательно — все объяснено очень четко.
