कस्टम वॉकर: फ़ंक्शन start_lvl में आईडी कैसे प्राप्त करें


15

मैं अपनी पहली कस्टम वॉकर बनाने के लिए एक समझौते मेनू का निर्माण कर रहा हूँ। शुरुआत करने के लिए मैंने इस उदाहरण का उपयोग किया: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

दो कार्य हैं। पहले start_lvl और फिर start_el।

Start_el में ID को $ आइटम-> ID द्वारा कार्यान्वित किया जाता है। किसी को पता है कि मैं कैसे start_lvl में भी ऐसा कर सकता हूं? मुझे (आसपास के निचले स्तर के नेविगेशन) को एक आईडी देने की आवश्यकता है ताकि मैं इसे अकॉर्डियन मेनू में ध्वस्त कर सकूं।

जो मैं उत्पन्न करने की कोशिश कर रहा हूं वह कुछ इस तरह है:

<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

मुझे बस अपने एक विषय में ऐसा करना था ... चूंकि आपके पास वॉकर के उस चरण में $ आइटम चर तक पहुंच नहीं है, आप इस समय अपने वर्तमान आइटम को अधिक वैश्विक दायरे में संग्रहीत करना चाहते हैं उस तक पहुँच है। निम्नलिखित कोड अधिक समझ में आएगा ... नोट: मैंने सब कुछ लेकिन संबंधित कोड छीन लिया है।

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
यह इस धागे में प्रस्तुत सबसे सुरुचिपूर्ण समाधान है। धन्यवाद लेन!
केविन सी।

1
वास्तव में एक बहुत साफ दृष्टिकोण जो अच्छी तरह से काम करता है। बहुत धन्यवाद।
आइजैक ग्रेगसन

1
मुझे यकीन नहीं है, लेकिन क्या मुझे इसे काम करने के लिए start_el में पूरे डिफ़ॉल्ट कोड को जोड़ना होगा?
GDY

4
ठीक है आप बस माता-पिता का उपयोग कर सकते हैं :: start_el ($ आउटपुट, $ आइटम, $ गहराई, $ 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 ."'>";

यह पेज आईडी का उपयोग नहीं करता है, लेकिन यह यूएएल स्टेटमेंट के लिए एक अद्वितीय आईडी का उपयोग करता है जिसे जावास्क्रिप्ट द्वारा संदर्भित किया जा सकता है।

BTW - यह वास्तव में नेस्टेड अकॉउंटेशन के लिए उपयोगी है, या मोबाइल ऐप्स के लिए बूटस्ट्रैप का उपयोग करके रूट थीम में क्लिक करने योग्य नेस्टडाउन।


2

आप अपने start_elफ़ंक्शन में निम्न फ़िल्टर का उपयोग कर सकते हैं और start_lvlफ़ंक्शन में अपने तर्क को ग्रब कर सकते हैं ।

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

कृपया मुझे बताएं कि क्या यह काम करता है।


पोस्ट करने का शुक्रिया! मुझे अगले कुछ दिनों में इसे पूरा करने के लिए कुछ समय मिलने की उम्मीद है लेकिन मैं अभी अपने अध्ययन में व्यस्त हूं। मैं आपको परिणाम के साथ वापस मिल जाएगा!
रॉबर्ट बुउटेन सेप

0

आप केवल कस्टम वॉकर के तर्क में $ पृष्ठ जोड़ सकते हैं:

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 ('वॉकर' => $ MyWalker)

जांचें और देखें कि वॉकर का आउटपुट लाल है या नहीं।


यह फ़ंक्शन start_el में है, लेकिन यह start_lvl में स्पष्ट रूप से भिन्न है क्योंकि मैं वहां एक ही चर नहीं रख सकता। या कम से कम एक ही आदेश नहीं।
राबर्ट बोउटन

आप start_lvl के साथ क्या करने की कोशिश कर रहे हैं?
AlxVallejo

मैं 102 पेज पर जनरेट की गई आईडी के साथ <ul> a id = "पतन 102" देने की कोशिश कर रहा हूं। इस तरह से मैं इसे अपने अकॉर्डियन मेनू में संक्षिप्त कर सकता हूं।
राबर्ट बोटन

आईडी जोड़ना = "ढहना" काम करता है, लेकिन मैं इसे पेजआईडी को जोड़ने के लिए भी काम नहीं कर सकता।
रॉबर्ट बॉटेन

क्या आपका मतलब है कि आप केवल विशिष्ट आईडी को ध्वस्त करना चाहते हैं? मेरे पास wp_list_pages के लिए एक अकॉर्डियन ट्री है और मुझे start_lvl को बिल्कुल भी बदलने की आवश्यकता नहीं है।
AlxVallejo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.