カスタムウォーカー:関数start_lvlでIDを取得する方法


14

アコーディオンメニューを作成する最初のカスタムウォーカーを作成しています。まず、この例を使用しました:http : //bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

2つの機能があります。最初に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";
}

回答:


37

私は自分のテーマの1つでこれを行う必要がありました... Walkerのその段階で$ item変数にアクセスできないので、現在の項目をよりグローバルなスコープに保存したいでしょう。それにアクセスできます。次のコードの方が理にかなっています...注:関連するコード以外はすべて削除しました。

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
これは、このスレッドで提示された最もエレガントなソリューションです。ありがとうレーン!
ケビンC.

1
実際、うまく機能する非常にクリーンなアプローチ。どうもありがとう。
アイザックグレッグソン

1
よくわかりませんが、デフォルトコード全体をstart_elに追加して機能させる必要がありますか?
GDY

4
親:: 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を使用しませんが、javascriptで参照できるULステートメントに一意のIDを使用します。

ところで-これは、モバイルアプリ用のBootstrapを使用して、Rootsテーマでネストされたアコーディオン、またはクリック可能なネストされたドロップダウンに本当に便利です。


2

start_el関数で次のフィルターを使用し、関数で引数を取得できますstart_lvl

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

動作するかどうかを教えてください。


投稿していただきありがとうございます!次の数日間でそれを解決する時間を見つけたいと思っていますが、私はちょうど今勉強で忙しいです。結果をお知らせします!
ロバートBouten

0

カスタムウォーカーの引数に$ pageを追加するだけです。

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()を呼び出す前に、カスタムwalkerクラスを追加します。

$MyWalker = new My_Custom_Walker();

次に、wp_list_pagesの引数で:

wp_list_pages( 'walker' => $ MyWalker)

ウォーカーの出力が赤かどうかを確認します。


これは関数start_elにありますが、同じ変数をそこに入れることができないため、start_lvlでは明らかに明らかに異なります。または、少なくとも同じ順序ではありません。
ロバートブーテン

start_lvlで何をしようとしていますか?
-AlxVallejo

生成されたページIDを使用して、<ul>にid = "collapse102"を102で指定しようとしています。この方法で、アコーディオンメニューでそれを折りたたむことができます。
ロバートブーテン

id = "collapse"を追加しても機能しますが、pageIDを追加することもできません。
ロバートブーテン

特定のIDのみを折りたたみたいという意味ですか?wp_list_pagesのアコーディオンツリーがあり、start_lvlをまったく変更する必要はありません。
-AlxVallejo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.