Как добавить подменю в меню, созданное wp_nav_menu с помощью плагина

11

У меня есть меню, 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">Item 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">Item 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">Item 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">Item 4</a></li>
</ul>

Я хочу изменить вышеупомянутое меню, добавив подменю к «Item 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">Item 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">Item 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">Item 3</a>
    <ul class="sub-menu">
      <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
      <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
      <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 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">Item 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;
    $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;
}

Вышеупомянутое решение работает, но я думаю, что это неправильный способ достижения желаемого результата. Я хотел бы получить хорошее решение от вас.

Тахир Ясин
источник
Вау, так нет другого ответа на этот вопрос? Я также ищу простой обходной путь здесь. То, что не связано с разбором строк. Должен быть более легкий путь, верно?
rgin
Поддержка WP на defoult это html структура. Обходной путь нужно только изменить подменю имен классов CSS. Лучше переписать ваши классы CSS для структуры меню WordPress.
Foxsk8

Ответы:

2

Вы можете изменить свое меню с помощью Walker.

include('subMenu.php');
$menu =  wp_nav_menu( array('menu' => 'YOUR-MENU-NAME','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( 'Item 3' == $item->title ){
        $output .= '<ul class="sub-menu">
        <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
        <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
        <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
        </ul>';
    }
    $output .= "</li>\n";  
    }
}
Addy
источник
0

Хук wp_nav_menu_itemsправ, если вы добавите элементы в структуру WP Nav Menu. См. Пример ниже для добавления статической ссылки «Домой». Ссылка статическая, от функции, home_url()и я использовал это только в аргументах WP Nav Menu для значений до и после. Элемент li является статическим, он изменяется только в WordPress, если вы используете Walker для этого элемента. Крючок wp_nav_menu_itemsнаходится внутри списка ul. После определения переменной var для этого нового элемента содержимого я добавляю ее в список по умолчанию в $itemsпеременной var , установленный перед выводом списка. Теперь только возврат всего контента.

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="Home">' .
            $args->link_before . __( 'Home' ) . $args->link_after .
            '</a>' .
            $args->after .
            '</li>';

    $items = $home_item . $items;

    return $items;
}
bueltge
источник
Кажется, вы не читали мою формулировку проблемы, поэтому ваше решение не то, что я хочу, мне не нужно прикреплять элемент в начале или в конце меню, но мне нужно подменю под определенным родительским элементом. Пожалуйста, прочитайте вопрос, все вещи объяснены очень четко.
Тахир Ясин
Извините, да, вы имеете право; но часто языковая проблема на заднем плане. Но я посмотрю на решение.
Bueltge