Ö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.