web-dev-qa-db-ja.com

Wordpressのnav_menu_css_classテーマフィルタは呼び出されていません

フィルタの動作に問題があります。メニューの各<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',
    ) );
?>

すべてが一致しているように見えますが、それでもフィルタは実行されません。何が間違っている可能性がありますか?

1
José María

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つの可能性があります。

  1. まず、 wp_nav_menu_args という名前のフィルタが表示されます。これが使用されている場合は、フィルタを呼び出さないカスタムウォーカーを追加している可能性があります。

  2. 次に、 pre_wp_nav_menu filterがあります。これが使用されている場合、関数の残りの部分は短絡されており、歩行者に到達することはありません。

  3. 最後に、メニューにアイテムがなく、フォールバックが定義されていない場合は、ウォーカーもスキップされます。フォールバックがある場合(おそらくwp_nav_menu_argsで追加されます)、これはwalkerの代わりに出力を生成します。

0
cjbj