テーマによって作成されたカスタムメニュー(この例ではprimary
という名前のメニュー)にWalkerを追加する方法はわかっていますが、デフォルトのwordpressカスタムメニューウィジェットを使用してウィジェットで作成されたメニューをターゲットにする方法はありますか。
if ( has_nav_menu( 'primary' ) ) {
$args = array(
'menu' => 'main-menu',
'menu_id' => 'main-menu',
'theme_location' => 'primary',
'depth' => 0,
'container' => false,
'menu_class' => 'nav',
'walker' => new Myprefix_Walker_Nav_Menu(),
'echo' => 0
);
$nav = wp_nav_menu( $args );
}
WP_Nav_Menu_Widget
クラスの実装を見ると、次のコードがわかります。
function widget($args, $instance) {
// Get menu
$nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;
if ( !$nav_menu )
return;
$instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
echo $args['before_widget'];
if ( !empty($instance['title']) )
echo $args['before_title'] . $instance['title'] . $args['after_title'];
wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ) );
echo $args['after_widget'];
}
つまり、メニューをフックする機会がまったくないということです。そのため、wp_nav_menu
関数の実装を見てみる必要があります。ここでは、次のコード行を見つけることができます。
$defaults = array(
'menu' => '',
'container' => 'div',
'container_class' => '',
'container_id' => '',
'menu_class' => 'menu',
'menu_id' => '',
'echo' => true,
'fallback_cb' => 'wp_page_menu',
'before' => '',
'after' => '',
'link_before' => '',
'link_after' => '',
'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
'depth' => 0,
'walker' => '',
'theme_location' => ''
);
$args = wp_parse_args( $args, $defaults );
$args = apply_filters( 'wp_nav_menu_args', $args );
$args = (object) $args;
ここで、wp_nav_menu
関数に渡されたすべての引数が置き換えられることがわかります。それであなたが必要とするものはあなたの歩行者をナビゲーションメニューに加えるあなた自身のフックハンドラを作成することです。それは次のように単純なことがあります:
function myplugin_custom_walker( $args ) {
return array_merge( $args, array(
'walker' => new My_Custom_Walker(),
// another setting go here ...
) );
}
add_filter( 'wp_nav_menu_args', 'myplugin_custom_walker' );
@ Eugeneの答えを拡張して、これを特定のメニューに限定したい場合は、単にメニューの用語IDを確認してください。
function custom_nav_args($args){
$menu = $args['menu'];
if($menu->term_id === 17) /* replace term_id with menu id, or use $menu->name to do it by menu name*/
{
$args['walker'] = new My_Custom_Walker();
}
return $args;
}
add_filter('wp_nav_menu_args', 'custom_nav_args');
Wordpressのwidget_nav_menu_args
で追加された4.2.0
フィルタを使用して、ウィジェットで作成されたナビゲーションメニューにカスタムウォーカーを追加できます。これは4つの引数を受け取ります(wp-includes/widgets/class-wp-nav-menu-widget.php
を参照)。しかし、カスタムウォーカーのみを追加するには、最初の引数を使用する必要があります。これはwp_nav_menu_args
フィルターを使用するのと同じ方法です。
add_filter('wp_nav_menu_args', 'my_args'); //for menus
add_filter('widget_nav_menu_args', 'my_args'); //for menus in widgets
function my_args($args) { //$args is only argument needed to add custom walker
return array_merge( $args, array(
'walker' => new My_Custom_Walker(),
) );
}
これはterm_id
でメニューをターゲットにすることの代替手段です、そして、私はそれが彼らのidを調べる必要なしにいくつかのメニューを修正する方法として誰かに役に立つかもしれないと思いました。
print_r($args)
をフィルタに追加することで、$args['menu']
は事前定義されたテーマの場所にあるメニューの文字列、サイドバーのカスタムメニューウィジェットにはWP_Term_Object
の文字列です。
私はこれを使ってslugでメニューをターゲットにし、それらのコンテナにクラスを追加しました。ナメクジに共通の文字列を含めることで、いくつかのメニューをターゲットにすることができます。注:メニュースラッグはregister_nav_menus()
の配列キーから来ています。
function my_menu_thingy( $args ) {
if( is_object($args['menu']) && strpos($args['menu']->{slug},'my-common-string') !== false ) {
$args['walker'] = new My_Custom_Walker();
}
return $args;
}
add_filter( 'wp_nav_menu_args', 'my_menu_thingy' );
単一のメニューの場合は、上記のstrpos()ビットの代わりに$args['menu']->{slug} == 'your-slug'
をチェックするだけです。