web-dev-qa-db-ja.com

現在のブランチの兄弟や子供たちを見せるためのカスタムNav Walker?

私はこれと非常によく似た(正確ではないにしても)クエリをグーグル上で見たことがあるが、常に私が必要とするものよりも短いものを見つけるように思われる。私のテンプレートでwp_nav_menuを使用して私のフル垂直メニューを作成しようとしています。私だけが現在の枝、兄弟、そしてその子供たちだけを見せたいのです。アコーディオン風メニューの種類。 CSSやJQueryを使用せずに、PHPでこれを行うことを好みます。

フルメニューの例:

- Home
- Products
   - Cool Item 1
      - Item 1 Details
      - Item 1 Gallery
   - Cool Item 2
      - Item 2 Details
      - Item 2 Gallery
- Services
   - Svc 1
   - Svc 2

たとえば、現在のアイテム「クールアイテム1」を表示している場合、すべてのルートメニューアイテム、すべての製品、「クールアイテム1」の子のみ、「クールアイテム2」の子、またはサービスを表示しないでください。以下のように:

- Home
- Products
   - Cool Item 1 (-current page-)
      - Item 1 Details
      - Item 1 Gallery
   - Cool Item 2
- Services

私がサービスをクリックするならば、私は見たいです:

- Home
- Products
- Services (-current page-)
   - Svc 1
   - Svc 2

現在、私のカスタムウォーカーには、star_elメソッドがあります。(make_menu_itemは、ウォーカーを検索する際の典型的なメニュー表示です)

function start_el(&$output, $item, $depth, $args) {

    // am I on the current Item?
    if($item->current_item_ancestor or $item->current_item_parent or $item->current){
        $cur_branch = true;
    }
    // this works for all current branch items, but not siblings or children
    if( $cur_branch || $depth == 0 ) {
        $output .= $this->make_menu_item($item, $depth, $args);
    } else  {
        // need to know if my parents are in current branch, then OK to show children
        // not sure how to do that from this point?
        if($item->menu_item_parent && $depth > 0) {
            // this currently shows everything, not what I want
            // if this is removed, no children objects show, even under cur_branch
            $output .= $this->make_menu_item($item, $depth, $args);
        }
    }

}

私はこの論理がおそらく最善ではないことを知っていますが、それは始まりです。メニューの「現在のブランチ」にいるかどうかは簡単にわかります。また、display_elementsメソッドに$ item-> hasChildrenを設定していますが、hasChildrenは現在の子供には役に立ちません。この時点で私の親オブジェクトが現在のブランチにあるかどうかを知っていたのは、最も役に立ちます。メニュー項目を表示するかどうかを選択できるからです。

SQLクエリを実行することはできましたが、そうはしないでください。 walker配列と利用可能なオブジェクト($ itemまたは$ elements?)内の親情報を取得する方法はありますか?多分私はこれについてすべて間違っているのだろうか?親情報を取得するのは簡単なはずですが、ここでget_ancestors()を呼び出すと空の配列が返されます。

助けてくれてありがとう!グレッグ

2
gregthegeek

私自身のウォーカーを使ってナビゲーションを制御することを好むのと同じくらい、私が望むものを正確に実行するプラグインを見つけました。Advanced Menu Widget http://wordpress.org/extend/plugins/advanced-menu-widget /

ほんの少しだけテストしましたが、思ったとおりに動作します。メニューウィジェットの設定で「厳密に関連するサブメニューのみ」を選択する必要があります。私のような他の初心者向けテーマ開発者には、私は以前にこのプラグインを試してみたがそれをどのように設定するのかわからなかったことに注意すべきである。 (ウィジェットの設定が見つかりませんでした)さて、それは私のテーマがまだサイドバーを有効にしていなかったという事実のためだけでした。

とにかく、私は私のテーマナビゲーションのプラグインに頼るのは好きではありませんが、うまく機能しているので、ビルドする必要はありません。 :) 問題が解決しました。

1
gregthegeek