カスタムメニューの特定のリンクにクラスを追加


10

カスタムメニューオプションでクラスを追加できることは知っていますが、それはAの前のLIに追加されます。クラス全体をLI全体ではなく、この特定のAに直接適用したいと思います。

だから出力の代わりに

<li id="menu-item-51" class="NEWCLASS menu-item menu-item-type-custom menu-item-51"><a href="#">Link</a> </li>

こんな感じにして欲しい。

<li id="menu-item-51" class="menu-item menu-item-type-custom menu-item-51"><a href="#" class="NEWCLASS">Link</a></li>

何か案は?


明確にするために、クラスを追加するとはどういう意味ですか?管理パネルでどのオプションを正確にクリックしますか?
Wordpressor

2
その意味は何ですか?セレクタをから.classに変更してください.class a
wyrfel

1
ええ、それもわかりません。CSSを設定して、含まれている<li>要素に基づいてリンクをターゲットに設定してください。その特定の項目の下にサブメニューがある場合は問題ありませんが、CSSでそれに取り組むことができます(必要に応じて例を提供できます)。
t31os

コメントの+1 @wyrfel ... @ Picard102 CSSの詳細を確認してください。これは、CSSを介してHTML要素を適切にターゲティングする方法も説明します。
カイザー

回答:


11

nav_menu_css_classフィルターを使用できます

add_filter('nav_menu_css_class' , 'my_nav_special_class' , 10 , 2);
function my_nav_special_class($classes, $item){
    if(your condition){ //example: you can check value of $item to decide something...
        $classes[] = 'my_class';
    }
    return $classes;
}

この$ itemを使用して、任意の条件を設定できます。これにより、特定のliにクラスが追加され、それに基づいてタグをスタイルできます。

.my_class a{
   background-color: #FFFFFF;
}

特定のページテンプレートを持つアイテムのクラスを追加しようとしていますがget_page_template_slug、機能しません。何か案は?
ビル・

4

このサイトでカスタムウォーカーを使用して解決策を見つけました。

2つのステップ:デフォルトのwp_nav_menuコードを編集済みのコードに置き換え、次にテーマのfunctions.phpにコードを追加します。

まず、デフォルトのwp_nav_codeを次のコードに置き換えます(コードは上記のサイトからコピーされます)。

    wp_nav_menu( array(
     'menu' => 'Main Menu',
     'container' => false,
     'menu_class' => 'nav',
     'echo' => true,
     'before' => '',
     'after' => '',
     'link_before' => '',
     'link_after' => '',
     'depth' => 0,
     'walker' => new description_walker())
     );

次に、次のコードをfunctions.phpに追加します。これを行うことにより、実際にメニューリンクにクラスを追加できます。

class description_walker extends Walker_Nav_Menu
{

  function start_el(&$output, $item, $depth, $args)
  {
       global $wp_query;
       $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

       $class_names = $value = '';

       $classes = empty( $item->classes ) ? array() : (array) $item->classes;

       $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
       $class_names = ' class="'. esc_attr( $class_names ) . '"';

       $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

       $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
       $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
       $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
       $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

       $prepend = '<strong>';
       $append = '</strong>';
       $description  = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';

       if($depth != 0)
       {
                 $description = $append = $prepend = "";
       }

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
        $item_output .= $description.$args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );

                    if ($item->menu_order == 1) {
            $classes[] = 'first';
        }

        }
}

コードの終わりに向かって、$ item_outputで始まるいくつかの行があります。特に、あなたはこの部分を見たいと思います:

$item_output .= '<a'. $attributes .'>';

この行は、リンクhtmlの先頭の出力を決定するためです。次のように変更すると、

$item_output .= '<a'. $attributes . 'class="abc"' .'>';

次に、メニュー内のすべてのリンクにclass = "abc"が追加されます。


とは言っても、リンクごとにカスタムクラスを使用することはできません(または、少なくともコードの記述方法がわかりません)。これは私にとって問題です。

なぜこれをしたいのかと尋ねる人のために?メニューリンクでライトボックス(より具体的にはカラーボックス)を開くようにしたいのですが、そのためにはリンクにクラスが必要です。例えば:

<a class="lightbox1" href="#">Photo</a>

最初のリンクの「lightbox1」、2番目のリンクの「lightbox2」など、クラスを動的に生成する方法はありますか?


@Rainmanあなたの答えは私を少し助けてくれました、そしてあなたは良い質問をしました。ここで見つける私はあなたがよりよい解決策を見つけたんだけど、持っていないもののために、私は解決策の修正版を使用:wpbeginner.com/wp-themes/...
NWテック

3

解決しました!!!! 私はこれを理解して、ファンシーボックス内のインラインHTMLへのメニュー項目リンクを作成する必要がありました。次のコードをテーマのfunction.phpに貼り付けます。

function add_menuclass($ulclass) {
    return preg_replace('/<a rel="fancybox"/', '<a class="fancybox"', $ulclass, -1);
}
add_filter('wp_nav_menu','add_menuclass');

次に... WPダッシュボードの[メニュー]タブで、カスタムリンクを作成し、メニューに追加します。の上部にある[画面オプション]で、[リンク関係(XFN)]がオンになっていることを確認します。そのフィールドがカスタムメニュー項目に追加されます。フィールドに「fancybox」と入力し(引用符は不要)、メニューを保存します。

関数はナビゲーションメニューの呼び出しを探し、次にaがある場所を見つけてにrel="fancybox"置き換えrel="fancybox" class="fancybox"ます。fancyboxは、メニュー項目に追加する必要があるクラスに置き換えることができます。完了しました。


グレートポスト!! 注意すべきことが1つだけあります。誰かがタイトルを追加した場合、コードは機能しません。同じ問題に遭遇しました...それで、両方の置換値の最初からAタグを削除しました。このようなものを私に残して... return preg_replace( '/ rel = "fancybox" /'、 'class = "fancybox"'、$ ulclass、-1); コードはうまく機能します!

1

現在の回答では、問題はa要素ではなく要素にクラスを追加する方法であることli、または複雑すぎることを認識していないようです。ここでは、nav_menu_link_attributesスラグに基づいて特定のメニューをターゲットにし、IDに基づいてそのメニュー内の特定のページリンクをターゲットにできるようにするフィルターを使用した簡単なアプローチを示します。$ argsと$ itemをvar_dumpして、条件を作成する方法を増やすことができます。

add_filter('nav_menu_link_attributes', 'custom_nav_menu_link_attributes', 10, 4);

function custom_nav_menu_link_attributes($atts, $item, $args, $depth){
    if ($args->menu->slug == 'your-menu-slug' && $item->ID == 1){

        $class = "button";

        // Make sure not to overwrite any existing classes
        $atts['class'] = (!empty($atts['class'])) ? $atts['class'].' '.$class : $class; 
    }

    return $atts;
}

おかげで、私はifそれをif ($args->theme_location == 'footer-menu' )その場所によってメニューを覗くように変更しました、そしてすべてがうまく
いきます

0

私はこれがずっと前に回答されたことを知っていますが、一般的な情報と同じように、カスタムメニューのWordPress管理ページの[画面]オプションを使用して、各メニュー項目にクラスを個別に追加する方法を見つけました。


0

私は最近同様のことをしなければならず、別の方法を見つけました。Nivoライトボックスプラグイン用に同様のクラスを追加する必要がありました。そこで、rel属性( "Link Relationship(XFN)")に "nivo"を追加し、次にnav_menu_link_attributesフィルターに以下を追加しました。

function add_nivo_menuclass($atts, $item, $args) {
    if( is_array($atts) && !empty($atts['rel']) && $atts['rel'] = 'nivo' ) {
        $atts['class'] = 'lightbox';
        $atts['data-lightbox-type'] = 'inline';
    }

    return $atts;

    }
add_filter('nav_menu_link_attributes','add_nivo_menuclass', 0,3);

0

Appearance -> Menusページの上部で、をクリックして展開しScreen Options、のチェックボックスをオンにしCSS Classesます。追加した各メニュー項目を展開すると、CSS Classes (optional)フィールドが表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.