Як додати підменю до меню, згенерованого 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>

Я хочу змінити вищевказане меню, додавши підменю до "Пункт 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 для усунення цієї структури html. Обхід потрібно лише змінити підменю css назви класів. Краще перепишіть свої класи css для структури меню wordpress.
Foxsk8

Відповіді:


2

Ви можете змінити своє меню, використовуючи ходок.

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";  
    }
}

0

Гачок wp_nav_menu_itemsправильний, якщо ви додасте елементи до структури WP Nav Menu. Дивіться приклад нижче, щоб додати статичне посилання "Головна". Посилання є статичною, від функції, home_url()і я це застосував лише в аргументах з меню WP Nav Menu fpr значеннями до і після. Елемент li є статичним і підключається лише в WordPress, якщо для цього елемента використовується Walker. Гачок wp_nav_menu_itemsзнаходиться всередині списку ul. Після визначення var для цього вмісту нового елемента я додаю його до списку за замовчуванням у var $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="Home">' .
            $args->link_before . __( 'Home' ) . $args->link_after .
            '</a>' .
            $args->after .
            '</li>';

    $items = $home_item . $items;

    return $items;
}

Здається, ви не прочитали мою заяву проблеми, тому ваше рішення не є тим, що я хочу, мені не потрібно додавати елемент на початку або в кінці меню, але мені потрібне підменю під певним батьківським елементом. Прочитайте, будь ласка, питання, всі речі пояснюються дуже чітко.
Тахір Ясін

Вибачте, так, ви маєте право; але часто мова є проблемою. Але я буду шукати рішення.
Бульдж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.