「wp_nav_menu_items」フックを使用して特定のメニューのみをカスタマイズしますか?


36

ここのいくつかの助けのおかげで、メインメニューにカスタム検索ボックスを追加することができました...これをテーマのfunctions.phpに追加することで

add_filter('wp_nav_menu_items','search_box_function');
  function search_box_function ($nav){
  return $nav."<li class='menu-header-search'><form action='http://example.com/' id='searchform' method='get'><input type='text' name='s' id='s' placeholder='Search'></form></li>";
}

ただし、フッターに追加する別のメニューを追加しましたが、検索ボックスもこのメニューに追加されます。プライマリメニューのみに検索ボックスを追加するにはどうすればよいですか?

メニューを登録するための私のコードは次のとおりです。

register_nav_menus( array(
  'primary' => __( 'Primary Navigation', 'twentyten' ),
  'secondary'=>__('Secondary Menu', 'twentyten' ),

 ) );

..そして二次メニューを表示するコードは次のとおりです。

wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'secondary' ) ); 

回答:


41

カスタム検索ボックスをメインメニューにのみ追加するには、wp_nav_menu_itemsフィルターによって提供される2番目のパラメーターを渡し、theme_locationがプライマリロケーションであるかどうかを確認します。

add_filter('wp_nav_menu_items','search_box_function', 10, 2);
function search_box_function( $nav, $args ) {
    if( $args->theme_location == 'primary' )
        return $nav."<li class='menu-header-search'><form action='http://example.com/' id='searchform' method='get'><input type='text' name='s' id='s' placeholder='Search'></form></li>";

    return $nav;
}

3
おかげで、それは素晴らしいです...初心者の質問- 10, 2コードで何をしますか?
キャニーボーイ

4
10優先度(デフォルトは10)、2フィルターにフックする関数が受け入れる引数の数です。
ラースト

@ ampt、はい、私はそれを試しました。出来た。ほとんど。ログインすると、2番目のメニューリンクが消えますが、どうすれば解決できますか?

1
WP 3.8以降、変数は$ args-> theme_locationではなく$ args-> menuであることに注意してください。
アランジャコメットフォルテ

@AlainJacometForte実際には、$ args-> menuはメニューの数値IDを返しますが、$ args-> theme_locationは文字列を返します。したがって、この答えはそのままです。文字列を比較する場合、何も変更されていません。
マーカス

8

これを行う別の方法は、wp_nav_menu_itemsフィルターにメニューのスラッグを追加することです。

たとえば、Headerという名前のメニューがあり、このメニュー(テーマの場所にアタッチされているかどうか)に常に検索ボックスを表示するとします。これを行うには、メニューのスラッグ(この場合header)をフィルターに追加します。

新しいフィルターは次のようになります。

add_filter 'wp_nav_menu_header_items' 'search_box_function' );   

header新しいフィルターの部分に注目してください。これは、WordPressに機能を追加するメニューを指示します。

これは、現在の問題にアプローチする1つの異なる方法にすぎません。


このページの@oshiのアイテムを参照してください。
1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.