วิธีเพิ่มเมนูย่อยในเมนูที่สร้างโดย 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 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;
}

ดูเหมือนว่าคุณไม่ได้อ่านคำชี้แจงปัญหาของฉันดังนั้นการแก้ปัญหาของคุณไม่ใช่สิ่งที่ฉันต้องการฉันไม่จำเป็นต้องแนบรายการเมื่อเริ่มต้นหรือสิ้นสุดเมนู แต่ฉันต้องการเมนูย่อยภายใต้รายการหลักเฉพาะ โปรดอ่านคำถามทุกสิ่งมีการอธิบายอย่างชัดเจน
Tahir Yasin

ขอโทษใช่คุณมีสิทธิ์ แต่บ่อยครั้งที่ปัญหาภาษาพื้นหลัง แต่ฉันจะเห็นทางออก
bueltge
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.