Özel Walker: start_lvl işlevinde kimlik nasıl alınır


15

Bir akordeon menüsü oluşturmak için ilk özel walker'ımı yapıyorum. Başlamak için bu örneği kullandım: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

İki işlevi vardır. Önce start_lvl ve sonra start_el.

Start_el içinde ID get $ item-> ID ile uygulanır. Bunu nasıl start_lvl içinde yapabileceğimi bilen var mı? Akordeon menüsünde çökmesi için tetikleyebilmem için (daha düşük seviye navigasyonun etrafında) bir kimlik vermeliyim.

Ne üretmeye çalışıyorum böyle bir şeydir:

<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 işlevi için kodum:

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

Yanıtlar:


38

Bunu sadece temalarımdan birinde yapmak zorunda kaldım ... Walker'ın bu aşamasında $ item değişkenine erişiminiz olmadığından, şu anda mevcut öğenizi daha küresel bir kapsamda saklamak istersiniz. ona erişimi var. Aşağıdaki kod daha mantıklı olacaktır ... Not: İlgili kod dışında her şeyi çıkardım.

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
Bu, bu konuda sunulan en şık çözümdür. Teşekkürler Lane!
— Kevin C.

1
Gerçekten iyi çalışan çok temiz bir yaklaşım. Çok teşekkürler.
— Isaac Gregson

1
Emin değilim ama çalışmasını sağlamak için tüm varsayılan kodu start_el eklemek zorunda mıyım?
— GDY

4
Tamam sadece parent :: start_el ($ output, $ item, $ deep, $ args, $ id); start_el ...
— GDY

Parlak, bunu çağlar boyunca anlamanın anlamı oldu ve bu hemen işe yaradı. Teşekkür ederim.
— cfx

3

Benzer bir sorun vardı ve sınıf içinde statik bir değişken kullanarak çözüldü:

static protected $menu_lvl; 

Ve sonra "display_element" değişkenini artırdım:

self::$menu_lvl++;

Benim kodda sonra böyle bir şey start_lvl işlevinde başvurulan:

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

Bu sayfa kimliğini kullanmaz, ancak javascript tarafından başvurulabilecek UL ifadeleri için benzersiz bir kimlik kullanır.

BTW - Bu, yalnızca mobil uygulamalar için Bootstrap kullanan Kökler Teması'ndaki iç içe akordeonlar veya tıklanabilir iç içe açılan açılır pencereler için kullanışlıdır.


2

start_elİşlevinizde aşağıdaki filtreyi kullanabilir ve işlevdeki bağımsız değişkeninizi gruplandırabilirsiniz start_lvl.

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

Lütfen işe yarayıp yaramadığını bildirin.


Gönderdiğiniz için teşekkürler! Önümüzdeki birkaç gün içinde çalışmak için biraz zaman bulmayı umuyorum, ancak şu an çalışmamla gerçekten meşgulüm. Sonuç ile size geri döneceğim!
— Robert Bouten

0

Özel yürüteç argümanına $ sayfası ekleyebilirsiniz:

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>';

Yukarıdakini deneyin ve wp_list_pages () öğesini çağırmadan önce özel walker sınıfını ekleyin:

$MyWalker = new My_Custom_Walker();

Ardından, wp_list_pages argümanlarında:

wp_list_pages ('walker' => $ MyWalker)

Yürüteç çıkışının kırmızı olup olmadığını kontrol edin ve görün.


Bu, start_el işlevindedir, ancak başlangıçta aynı değişkenleri oraya yerleştiremediğim için start_lvl'de görünüşte farklıdır. Ya da en azından aynı siparişte değil.
— Robert Bouten

Start_lvl ile ne yapmaya çalışıyorsunuz?
— AlxVallejo

102 ile oluşturulan sayfa kimliği <ul> bir id = "collapse102" vermeye çalışıyorum. Bu şekilde akordeon menümde daraltmak için tetikleyebilirim.
— Robert Bouten

İd = "collapse" ekleme çalışır, ancak pageID de eklemek için işe alamıyorum.
— Robert Bouten

Sadece belirli kimliklerin daraltılmasını mı istiyorsunuz? Wp_list_pages için bir akordeon ağacı var ve ben hiç start_lvl değiştirmek gerekmez.
— AlxVallejo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.