เพิ่มคลาส 'has_children' เป็น parent li เมื่อทำการแก้ไข Walker_Nav_Menu


22

ฉันกำลังเขียนคลาสวอล์คเกอร์ที่กำหนดเองสำหรับ wp_nav_menu และต้องการที่จะสามารถระบุได้ว่า li มีเมนูย่อยหรือไม่ ดังนั้นฉันต้องการมาร์กอัปของฉันเป็น:

<li class="has_children [other-wordpress-classes]">
    <a class="parent-link">Some item</a>
    <ul class="sub-menu">

ฉันรู้วิธีการเพิ่มและลบชั้นเรียนได้ดีฉันแค่ไม่พบสิ่งใดที่จะบอกฉันว่ารายการปัจจุบันมีรายการเด็ก

ความคิดใด ๆ

ขอบคุณล่วงหน้า.

คำตอบ:


23

start_el()ควรได้รับข้อมูลนี้ใน$argsพารามิเตอร์ของมันแต่มันจะปรากฏWordPress กรอกข้อมูลในนี้ถ้า$argsเป็นอาร์เรย์ในขณะที่เมนูนำทางที่กำหนดเองมันเป็นวัตถุ นี้มีรายงานในตั๋ว Trac แต่ไม่มีปัญหาคุณสามารถกรอกข้อมูลนี้ด้วยตัวคุณเองถ้าคุณแทนที่display_element()วิธีการในวอล์คเกอร์ที่คุณกำหนดเอง (เพราะนี่เป็นสถานที่ที่ง่ายที่สุดในการเข้าถึงอาร์เรย์องค์ประกอบลูก):

class WPSE16818_Walker extends Walker_Nav_Menu
{
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output )
    {
        $id_field = $this->db_fields['id'];
        if ( is_object( $args[0] ) ) {
            $args[0]->has_children = ! empty( $children_elements[$element->$id_field] );
        }
        return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

    function start_el( &$output, $item, $depth, $args ) {
        if ( $args->has_children ) {
            // ...
        }
    }

สวัสดี ม.ค. คุณช่วยฉันด้วยคำถามนี้ได้ไหม ฉันลองใช้รหัสของคุณแล้ว แต่ไม่สามารถใช้งานได้ คุณสามารถให้รหัสตัวอย่างเพิ่มเติมให้ฉันได้ไหม
Giri

อ้างถึงตัวอย่างการใช้งานที่สมบูรณ์ยิ่งขึ้นในหน้านี้
rjb

ขอบคุณมาก @Jab fabry .. ฉันได้รับการขึ้นกับวอล์คเกอร์ที่กำหนดเองของฉัน .. Atlast ตัวอย่างของคุณช่วยฉัน
Harish Chinju

7

อัปเดต:ตั้งแต่WordPress 3.7 (ตุลาคม 2013), CSS คลาสได้รับการเพิ่มเพื่อระบุรายการเมนูย่อยและหน้าในเมนูธีม - ไม่จำเป็นต้องใช้วอล์คเกอร์ที่กำหนดเองเพราะมันได้รับการดูแลใน WordPress core

เรียน CSS ที่มีชื่อและmenu-item-has-childrenpage_item_has_children


สำหรับการแก้ปัญหาที่สมบูรณ์แบบสำหรับทุกคนที่รีบร้อน (ให้เครดิตกับคำตอบก่อนหน้าของ Jan Fabry) โปรดดูการใช้งานเต็มรูปแบบด้านล่าง

แสดงการนำทางในเทมเพลตของธีมของคุณ:

wp_nav_menu( array(
    'theme_location' => 'navigation-primary',
    'container' => false,
    'container_class' => '',
    'container_id' => '',
    'menu_class' => '',
    'menu_id' => '',
    'walker' => new Selective_Walker(),
    'depth' => 2
    )
);

จากนั้นรวมสิ่งต่อไปนี้ในธีมของคุณfunctions.php:

class Selective_Walker extends Walker_Nav_Menu {
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
        $id_field = $this->db_fields['id'];

        if ( is_object( $args[0] ) ) {
            $args[0]->has_children = !empty( $children_elements[$element->$id_field] );
        }

        return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

    function start_el( &$output, $item, $depth, $args ) {
        if ( $args->has_children ) {
            $item->classes[] = 'has_children';
        }

        parent::start_el(&$output, $item, $depth, $args);
    }
}

ผลลัพธ์ HTML ที่ได้จะมีลักษณะดังต่อไปนี้:

<ul>
    <li><a href="#">Home</a></li>
    <li class="has_children"><a href="#">About</a>
        <ul class="sub-menu">
            <li><a href="#">Our Mission</a></li>
        </ul>
    </li>
    <li><a href="#">Services</a></li>
    <li class="has_children"><a href="#">Products</a>
        <ul class="sub-menu">
            <li><a href="#">Lorem Ipsum</a></li>
            <li><a href="#">Lorem Ipsum</a></li>                
        </ul>
    </li>
    <li><a href="#">Contact Us</a></li>
</ul>

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ WordPress' class วอล์คเกอร์ให้ดูที่การทำความเข้าใจชั้นวอล์คเกอร์

สนุก!


ข้อผิดพลาดร้ายแรง: การอ้างอิงการโทรตามเวลาโทรถูกนำออกใน D: \ www \ wordpress \ wp-content \ themes \ wpt_theme \ function.php ที่บรรทัดที่ 44
Tahir Yasin

บรรทัดที่ 44 คือ parent :: start_el (& $ output, $ item, $ depth, $ args);
Tahir Yasin

2

ฟังก์ชั่นนี้เป็นสิ่งที่คุณต้องการ นอกจากนี้ยังแสดงวิธีที่มีประสิทธิภาพในการปรับเปลี่ยนรายการเมนูนำทาง นอกจากนี้คุณสามารถเปิดฟังก์ชั่นขั้นสูง (เช่นธีมลูก) เพิ่มเติมผ่านตัวกรองรายการ:

/**
 * Classes for a navigation named "Topnav" in the nav location "top".
 * Shows examples on how to modify the current nav menu item
 * 
 * @param (object) $items
 * @param (object) $menu
 * @param (object) $args
 */
function wpse16818_nav_menu_items( $items, $menu, $args )
{
    # >>>> start editing

    // examples for possible targets
    $target['name'] = 'Topnav';
    // The targeted menu item/s
    $target['items'] = array( (int) 6 );

    # <<<< stop editing

    // filter for child themes: "config_nav_menu_topnav"
    $target = apply_filters( 'config_nav_menu_'.strtolower( $target['name'] ), $target );

    // Abort if we're not with the named menu
    if ( $menu->name !== $target['name'] ) 
        return;

    foreach ( $items as $item )
    {
        // Check what $item contains
        echo '<pre>'; print_r($item); echo '</pre>';

        // First real world example:
        $item->classes = 'span-4';

        // Second real world example:
        // Append this class if we are in one of the targeted items
        if ( in_array( (int) $item->menu_order, $target['items'] ) )
            $item->classes .= ' last';
    }

    return $items;
}
add_filter( 'wp_get_nav_menu_items', 'wpse16818_nav_menu_items', 10, 3 );

และใช่มีเกือบทุกกรณีไม่จำเป็นต้องใช้วอล์คเกอร์ที่กำหนดเอง


ขอบคุณฉันต้องการวอล์คเกอร์ในตอนนี้ แต่จะได้ดูในรอบต่อไป!
patnz

1

หากคุณต้องการเลื่อนลงคุณสามารถทำได้ด้วย css เท่านั้น สร้าง nav แบบกำหนดเองใน WP กับลูก ๆ WordPress จะกำหนด class. sub-menu ให้กับ ul ul โดยอัตโนมัติ ลอง CSS นี้

    nav li {position:relative;}
   .sub-menu {display:none; position:absolute; width:300px;}
    nav ul li:hover ul {display:block;}

คุณอาจต้องการเพิ่ม jQuery เพื่อเพิ่มรสชาติเล็กน้อย แต่สิ่งนี้ควรให้เมนูแบบเลื่อนลงที่ใช้งานได้


ขอบคุณมันเป็นเมนูทรีแบบพับได้หลายชั้นที่ฉันใส่องค์ประกอบควบคุมลงไปด้วย แต่ก็ดีที่จะทำ css ให้มากที่สุด!
patnz

-1
if ( $this->has_children ) {
    $item_output .= 'has_children';
}

3
กรุณาอธิบายว่ารหัสนี้ทำอะไรและตอบคำถามอย่างไร
cybmeta

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