Custom Walker: วิธีรับ ID ในฟังก์ชั่น start_lvl


15

ฉันกำลังทำวอล์คเกอร์ที่กำหนดเองเป็นครั้งแรกเพื่อสร้างเมนูหีบเพลง ในการเริ่มต้นด้วยฉันใช้ตัวอย่างนี้: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

มีสองฟังก์ชั่น ก่อน start_lvl แล้ว start_el

ใน start_el ID จะถูกใช้โดย $ item-> ID ไม่มีใครรู้ว่าฉันสามารถทำได้ใน start_lvl เช่นกัน? ฉันต้องให้ ID (โดยรอบการนำทางระดับล่าง) เพื่อให้ฉันสามารถทริกเกอร์ให้ยุบในเมนูหีบเพลง

สิ่งที่ฉันพยายามสร้างคืออะไรแบบนี้:

<a href="#collapse2">Titel 2</a>
<ul id="collapse2">Lower Level Menu 2</ul>
<a href="#collapse3">Titel 3</a>
<ul id="collapse3">Lower Level Menu  3</ul>

รหัสของฉันสำหรับฟังก์ชั่น start_lvl:

// add id's and classes to ul sub-menus
function start_lvl( &$output, $depth, $item ) {
    // depth dependent classes
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
    $display_depth = ( $depth + 1); // because it counts the first submenu as 0
    $pgid = ; // How to get ID in here??
    $classes = array(
        'sub-menu',
        ( $display_depth == 1  ? 'accordion-body collapse' : '' ),
        ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
        ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
        'menu-depth-' . $display_depth
        );
    $ids = array(
        'collapse' . $pgid
        );
    $class_names = implode( ' ', $classes );
    $id_name = implode( ' ', $ids );

    // build html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}

คำตอบ:


38

ฉันต้องทำสิ่งนี้ในหนึ่งในธีมของฉัน ... เนื่องจากคุณไม่สามารถเข้าถึงตัวแปร $ item ในขั้นตอนของ Walker คุณจะต้องการเก็บรายการปัจจุบันของคุณไว้ในขอบเขตทั่วโลกในขณะที่คุณ จะสามารถเข้าถึงได้ รหัสต่อไปนี้จะสมเหตุสมผลกว่า ... หมายเหตุ: ฉันถอดทุกอย่างยกเว้นรหัสที่เกี่ยวข้อง

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

  // retrieve the curItem
  function start_lvl(&$output, $depth = 0, $args = array()) {
    var_dump($this->curItem );
  }

  // store the curItem
  function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    $this->curItem = $item;
  }

 }

3
นี่คือทางออกที่หรูหราที่สุดที่นำเสนอในหัวข้อนี้ ขอบคุณเลน!
Kevin C.

1
แน่นอนวิธีการที่สะอาดมากที่ทำงานได้ดี ขอบคุณมาก.
Isaac Gregson

1
ฉันไม่แน่ใจ แต่ฉันต้องเพิ่มรหัสเริ่มต้นทั้งหมดเพื่อ start_el เพื่อให้ทำงานได้หรือไม่
GDY

4
ตกลงคุณสามารถใช้ parent :: start_el ($ output, $ item, $ depth, $ args, $ id); ใน start_el ...
GDY

ยอดเยี่ยมรับความหมายที่จะคิดออกมานานและทำงานได้ทันที ขอบคุณ.
cfx

3

ฉันมีปัญหาที่คล้ายกันและแก้ไขโดยใช้ตัวแปรคงที่ภายในชั้นเรียน:

static protected $menu_lvl; 

จากนั้นใน "display_element" ฉันเพิ่มค่าของตัวแปร:

self::$menu_lvl++;

ในรหัสของฉันฉันอ้างอิงในฟังก์ชัน start_lvl ดังนี้:

$output .= "<ul id='level". self::$menu_lvl ."'>";

สิ่งนี้ไม่ได้ใช้ ID หน้า แต่ใช้ ID เฉพาะสำหรับคำสั่ง UL ที่สามารถอ้างอิงได้โดยจาวาสคริปต์

BTW - นี่เป็นเพียงประโยชน์สำหรับหีบเพลงที่ซ้อนกันหรือดรอปดาวน์ซ้อนที่คลิกได้ในชุดรูปแบบ Roots โดยใช้ Bootstrap สำหรับแอปมือถือ


2

คุณสามารถใช้ตัวกรองต่อไปนี้ในstart_elฟังก์ชั่นของคุณและด้วงอาร์กิวเมนต์ของคุณในstart_lvlฟังก์ชั่น

apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );

โปรดแจ้งให้เราทราบหากใช้งานได้


ขอบคุณสำหรับการโพสต์! ฉันหวังว่าจะหาเวลามาทำงานในอีกไม่กี่วันข้างหน้า แต่ตอนนี้ฉันยุ่งมากกับการเรียนของฉัน ฉันจะกลับไปหาคุณพร้อมกับผล!
Robert Bouten

0

คุณสามารถเพิ่ม $ page เข้ากับอาร์กิวเมนต์ของ walker ที่กำหนดเองได้:

class My_Custom_Walker extends Walker_page {
    function start_el(&$output, $page, $depth, $args, $current_page) {
        if ( $depth )
            $indent = str_repeat("\t", $depth);
        else
            $indent = '';

        extract($args, EXTR_SKIP);

        $output .= $indent . 
            '<li>
            <a style="color:red" href="' . get_page_link($page->ID) . '" title="' . 
            esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . 
            $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

ลองข้างต้นก่อนที่คุณจะเรียก wp_list_pages () เพิ่มคลาสวอล์คเกอร์ที่กำหนดเอง:

$MyWalker = new My_Custom_Walker();

จากนั้นในอาร์กิวเมนต์สำหรับ wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

ตรวจสอบและดูว่าเอาต์พุตของวอล์คเกอร์เป็นสีแดงหรือไม่


นั่นคือในฟังก์ชัน start_el แต่เห็นได้ชัดว่าแตกต่างกันใน start_lvl เพราะฉันไม่สามารถใส่ตัวแปรเดียวกันในนั้นได้ หรืออย่างน้อยก็สั่งไม่เหมือนกัน
Robert Bouten

คุณพยายามทำอะไรกับ start_lvl
AlxVallejo

ฉันพยายามให้ <ul> an id = "coll102" กับ 102 ID เพจที่สร้างขึ้น วิธีนี้ฉันสามารถเรียกให้ยุบในเมนูหีบเพลงของฉัน
Robert Bouten

การเพิ่ม id = "ยุบ" ใช้งานได้ แต่ฉันไม่สามารถใช้เพื่อเพิ่ม pageID ได้เช่นกัน
Robert Bouten

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