フィルタの動作に問題があります。メニューの各<li>
要素にクラスを追加しようとしています。これは私のテーマのfunctions.php
ファイルにあります:
/**
* Adds custom classes to the items in the nav menu
*
* @param array $classes Classes for the body element.
* @return array
*/
function nav_menu_item_classes( $classes, $item, $args, $depth ) {
// This is what I used to check that it's not working
error_log("is nav_menu_item_classes working?");
if ( 'menu-1' === $args->theme_location ) {
// Add the Bootstrap nav-item class
$classes[] = 'nav-item';
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'nav_menu_item_classes', 10, 4 );
これがheader.php
ファイルのメニューを呼び出す方法です。
<?php
wp_nav_menu( array(
'theme_location' => 'menu-1',
'menu_id' => 'primary-menu',
'menu_class' => 'navbar-nav',
) );
?>
すべてが一致しているように見えますが、それでもフィルタは実行されません。何が間違っている可能性がありますか?
nav_menu_css_class
フィルタは、WPのwalkerクラスの start_el
関数にあります。ソースからわかるように、ここでは条件付き実行はありません。したがって、walkerが呼び出されると、フィルタを適用する必要があります。
これにより、 wp_nav_menu
に移動します。これは、$items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );
という行で(一部の中間呼び出しを通じて)walkerを呼び出します。そのため、フィルタが呼び出されるのを妨げるものがある場合は、この行の前に発生する必要があります。実際には3つの可能性があります。
まず、 wp_nav_menu_args
という名前のフィルタが表示されます。これが使用されている場合は、フィルタを呼び出さないカスタムウォーカーを追加している可能性があります。
次に、 pre_wp_nav_menu
filterがあります。これが使用されている場合、関数の残りの部分は短絡されており、歩行者に到達することはありません。
最後に、メニューにアイテムがなく、フォールバックが定義されていない場合は、ウォーカーもスキップされます。フォールバックがある場合(おそらくwp_nav_menu_args
で追加されます)、これはwalkerの代わりに出力を生成します。