web-dev-qa-db-ja.com

ある特定のメニューのメニュー項目にクラスを追加する(nav_menu_css_class)

このコードは私のすべてのメニュー項目に追加のクラスを追加します。

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
  $classes[] = 'btn';
  return $classes;
}

このフィルタをメインメニュー(テーマの場所「プライマリメニュー」)に限定する方法

よろしく、

ダニエル

6
Daniel Baars

私はまた、この問題を解決しようとしていて、解決策を探しているときに、 nav_menu_css_classフィルタが実際には3番目のパラメータ を除いていることを発見しました。これはあなたのメニューに関連する変数を含むオブジェクトで、クラス名を特定のメニューに条件付きで適用するために使用できるtheme_location変数を含みます。テーマの中で wp_nav_menu を呼び出すときには、必ずtheme_locationを設定する必要があります。
これは例です。

add_filter( 'nav_menu_css_class', 'special_nav_class', 10, 3 );
function special_nav_class( $classes, $item, $args ) {
    if ( 'primary-menu' === $args->theme_location ) {
        $classes[] = 'btn';
    }

    return $classes;
}
13
Dylan

同じ問題を解決しようとしてこのスレッドに出会いました-これが私が思いついたことです。メニュー項目ごとに呼び出されるため、これがどれほどうまく機能するかはわかりませんが、メニューはWordPress内で分類法として設定されているようです。したがって、has_term()を使用して項目が特定のメニューで、get_nav_menu_locations()を使用して、どのメニューがどのテーマの場所にあるかのリストを取得します。

コードの変更:

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
    $menu_locations = get_nav_menu_locations();
    if ( has_term($menu_locations['primary-menu'], 'nav_menu', $item) ) {
        $classes[] = 'btn';
    }
    return $classes;
}
3
epowell

Functions.phpを修正する必要はありません。あなたのテンプレートファイルに入ってwp_nav_menuを見つけ、それに 'menu_class'を追加するだけです。

<?php wp_nav_menu( array( 'theme_location' => 'primary','menu_class' => 'newmenuclass' ) ); ?>
1
jianli

Function.phpで自分自身に追加すればすべてうまくいくでしょう

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);


function special_nav_class ($classes, $item) {

    $classes[] = 'nav__link';

    if (in_array('current-menu-item', $classes) ){

        $classes[] = 'nav__link-active';

    }

    return $classes;
}
0