WordPressテーマにメニューの説明を追加する方法

WordPressのメニューシステムには、メニュー項目に説明を追加できる組み込み機能があります。ただし、この機能はデフォルトでは非表示になっています。有効にしても、コードを追加しないと表示はサポートされません。ほとんどのテーマは、メニュー項目の説明を考慮して設計されていません。この記事では、WordPressでメニューの説明を有効にする方法と、WordPressテーマにメニューの説明を追加する方法を説明します。

WordPressテーマにメニューの説明を追加する方法

注意:このチュートリアルでは、HTML、CSS、およびWordPressテーマ開発に関する十分な理解が必要です。

メニューの説明を追加したいのはいつ、なぜですか?

一部のユーザーは、メニューの説明を追加するとSEOに役立つと考えています。しかし、それらを使用したい主な理由は、サイトでのユーザーエクスペリエンスを向上させるためだと考えています。

説明文は、訪問者にメニュー項目をクリックした場合に見つかるものを伝えるために使用できます。魅力的な説明は、より多くのユーザーをメニュークリックに引き付けます。

メニューの説明

ステップ1:メニューの説明をオンにする

外観 » メニューに移動します。ページの右上にあるスクリーンオプションボタンをクリックします。説明ボックスをチェックします。

WordPress でメニューの説明を有効にする

これにより、メニュー項目に説明フィールドが有効になります。次のようになります。

メニュー項目に追加された説明フィールド

これで、WordPress メニューの項目にメニューの説明を追加できるようになりました。ただし、これらの説明はまだテーマには表示されません。メニューの説明を表示するには、コードを追加する必要があります。

ステップ 2: ウォーカークラスを追加する:

Walkerクラスは、WordPressの既存のクラスを拡張します。基本的に、メニュー項目の説明を表示するためのコード行を追加するだけです。このコードをテーマのfunctions.phpファイルに追加してください。

class Menu_With_Description 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 ) .'"' : '';

		$item_output = $args->before;
		$item_output .= '<a'. $attributes .'>';
		$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
		$item_output .= '<br /><span class="sub">' . $item->description . '</span>';
		$item_output .= '</a>';
		$item_output .= $args->after;

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

ステップ3.wp_nav_menuでWalkerを有効にする

WordPressのテーマでは、メニューを表示するためにwp_nav_menu()関数を使用します。また、WordPressテーマにカスタムナビゲーションメニューを追加する方法についての初心者向けチュートリアルも公開しています。ほとんどのWordPressテーマでは、メニューはheader.phpテンプレートに追加されます。ただし、テーマによってはメニューを表示するために別のテンプレートファイルを使用している可能性もあります。

ここで、テーマ内の wp_nav_menu() 関数(おそらく header.php にあります)を見つけて、次のように変更する必要があります。

<?php $walker = new Menu_With_Description; ?>

<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu', 'walker' => $walker ) ); ?>

最初の行では、functions.php で以前に定義したウォーカークラスを使用するように $walker を設定します。コードの2行目では、既存の wp_nav_menu 引数に追加する必要がある唯一の追加引数は 'walker' => $walker です。

ステップ4.説明のスタイル設定

先ほど追加したwalkerクラスは、このコード行でアイテムの説明を表示します。

$item_output .= '<br /><span class="sub">' . $item->description . '</span>';

上記のコードは、
タグを追加してメニュー項目に改行を挿入し、次に説明をクラスsubのspanで囲みます。このようになります:

<li id="menu-item-99" class="menu-item menu-item-type-post_type menu-item-object-page"><a href="http://www.example.com/about/">About<br /><span class="sub">Who are we?</span></a></li>

サイトでの説明文の表示方法を変更するには、テーマのスタイルシートにCSSを追加できます。Twenty Twelveでこれをテストし、このCSSを使用しました。

.menu-item {
border-left: 1px solid #ccc;
}

span.sub { 
font-style:italic;
font-size:small;
}

この記事がお役に立ち、テーマでメニューの説明を使用してクールなメニューを作成するのに役立つことを願っています。質問がありますか?下のコメントに書き込んでください。

追加リソース

WordPressナビゲーションメニューのスタイリング方法

特定のWordPressメニューにカスタム項目を追加する方法

Bill Erickson氏の説明付きメニュークラス

開示:当社のコンテンツは読者によってサポートされています。これは、当社のリンクの一部をクリックすると、当社が手数料を得る可能性があることを意味します。WPBeginnerがどのように資金提供されているか、それがなぜ重要か、そしてどのように私たちをサポートできるかについては、こちらをご覧ください。当社の編集プロセスはこちらです。

究極のWordPressツールキット

無料のツールキットにアクセスしましょう - すべてのプロフェッショナルが持つべきWordPress関連の製品とリソースのコレクションです!

読者とのインタラクション

51 CommentsLeave a Reply

  1. PHP 8.0 以降では、これは重大なエラーを引き起こします。

    この行を見つける必要があります:
    function start_el( $output, $item, $depth, $args ) {

    その行を次のように変更すると、エラーが解消されるはずです。
    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {

  2. WordPressテーマにメニューの説明を追加するために、このブログのステップ1と2を実行しましたが、ステップ3で進め方がわからず、全体の変更ができませんでした。

    • テーマに機能が見つからない場合は、特定のテーマのサポートに連絡することをお勧めします。彼らが支援できるはずです。

      管理者

  3. こんにちは、
    Max Mega Menuで製品カテゴリの説明を無効にする方法は?
    すでにMega Menu > General Settingsに移動し、Menu Item Descriptionsを無効に設定しましたが、問題は解決しません。

    • プラグインのサポートに連絡すれば、設定が正しく機能しないことについて支援を得られるでしょう。

      管理者

  4. こんにちは..助けてください..
    タイトルカテゴリの説明を使用せずに、タイトルカテゴリを追加するにはどうすればよいですか?

  5. 素晴らしいヒントですが、メニューの説明では HTML タグがサポートされていません。誰か知っていますか?

    ありがとう

  6. 皆さん、こんにちは。

    説明にHTMLタグを許可する方法についてのアイデアはありますか?
    remove_filter(‘nav_menu_description’, ‘strip_tags’);
    これは私には機能しません。

    • @Iryna様: コードをどこかに投稿していただけますか?例えば pastebin.com などです。
      remove_filter() を呼び出す場所によって、それが機能するかどうかが決まります。add_filter() の呼び出し後に呼び出す必要があります。
      wp_nav_menu() の呼び出しの直前に呼び出すとうまくいくかもしれません。

  7. すでにプラグインできる状態で用意されている可能性はありますか?このハックは「Twenty TwelveVersion: 1.5」というテーマでどのように機能しますか?
    そして、プラグインのwpmlの場合と同様ですか?

  8. ありがとうございます。これをコピー&ペーストするだけで、すぐに全体像を把握できるので非常に役立ちました。

  9. おい、functions.phpにwalkerクラスを追加したんだけど、genesisテーマでwp_nav_menuが見つからないんだ。何が足りないんだろう?次に何をすればいいのか全く分からないよ!?!?

  10. とてもよく説明してくれます – 詳細で明確です。1分とメニュー項目の説明は大丈夫です。ありがとうございます!

  11. このチュートリアルを本当にありがとうございます。私に勧められ、変更したい変更を加えるのに完璧に機能しました。しかし、これらの変更を加える際に、ドロップダウンサブアイテムメニューを失いました。コードの変更で何が影響したか何かアイデアはありますか?

    お時間とチュートリアルをありがとうございます

  12. メニューの説明を実装しましたが、うまくいきました。今、クライアントが説明の中に改行を求めています。管理画面から説明フィールドに改行や <br> タグを挿入しようとしましたが、フロントエンドに表示されません。WP がこれらの編集を削除します。これを解決する方法はありますか?

  13. 素晴らしいチュートリアルです、カスタムメニューウィジェットで表示されるカスタムメニューにこれを実装する方法を知りたいだけです。

  14. ありがとうございます!WordPressを長年使っていますが、こんな機能があるとは知りませんでした。作業中のサイトで説明文が非常に冗長だったので、削除したいと思っていました。どこから来ているのか、あらゆる場所を探しました。

    なんて素晴らしい!

  15. 機能します!

    ただし、PHP 5.4の場合は、start_el関数のwp walker引数を一致させる必要があります。

    function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0 )

    そして、$itemを$objectに置換します。

  16. 完璧です。サイトの仕上げに必要なものでした。CSS でいくつか問題がありましたが、最終的に解決して動作させることができました。素晴らしい記事をありがとうございます。

  17. 同じものを作成する必要があり、完全に途方に暮れていました。

    この問題を解決するために、いくつか馬鹿げたことをしようと考えていました。

    この投稿を見つけて、時間とストレスを節約できて本当に良かったです!

    このサイトが大好きです。たくさんのことを知ることができました。

    ここで最も簡単なことを示してくれて、本当にありがとうございます。

    • サブメニューにもspanタグが表示されます。

      そこには表示されていませんが、かなりのスペースを占めているため、非常に奇妙に見えます。

      同じことに対する回避策はありますか?

  18. これは本当に素晴らしいチュートリアルです。Thesis 1.8.5 でも機能するかどうか疑問に思っています。もしそうでない場合は、提供していただけると幸いです。きっと皆さんに広めるお手伝いをします。いいね!

  19. チュートリアルに従ってメニューに説明を追加しました。ありがとうございます!しかし、モバイルモードではメニューがドロップダウンメニューに変換され、メニュータイトルと説明が接続されてしまいます。たとえば、メニュー項目が「about」で説明が「more about me」の場合、モバイルバージョンでは「aboutmore about me」と表示されます。これを修正する方法はありますか?

    • 同じ問題を抱えていました。私がやったことは次のとおりです。

      これを変更しました:
      $description = ! empty( $item->description ) ? ‘<span>’.esc_attr( $item->description ).'</span>’ : ”;

      これに:
      $description = ! empty( $item->description ) ? ‘<br /><span>’.esc_attr( $item->description ).'</span>’ : ”;

      最善の解決策かどうかはわかりませんが、私にはうまくいきました。

      • 皆さん、ありがとう。SVETとDAVIDがモバイルメニューで行ったことに遭遇しました。
        コードは私の変更を、ダッシュ区切り文字を持つspanを追加しただけで、デスクトップクエリでは不要だったので単純に抑制しました。

        $item_output .= ‘ – ‘;

        デスクトップのみのクエリ内で、spanをdisplay:noneに設定します。
        @media only screen and (min-width: 740px) {
        header #submenu li span.dash { display:none; }

        お役に立てば幸いです。私の問題をうまく解決しました。

  20. 素晴らしい投稿です – 非常に明確で、まさに必要としていたもので、完璧に機能しました。ありがとうございます!

  21. 素晴らしいチュートリアルをありがとうございます。主要なステップはうまく完了しました。ご覧の通り、
    http://ueab.ac.ke/demo/index

    メインメニューのラベルと説明の間のスペースを減らすにはどうすればよいですか?スタイリングに困っています。ご協力いただけると幸いです。

  22. 素晴らしい投稿です。以前にもこの件を調べようとしましたが、以前の指示はこれほどわかりやすくありませんでした。functions.phpコードをドロップし、ヘッダーファイルでウォーカークラスを変更する方法を理解し(使用しているテーマでは異なりますが、簡単です)、約15分で開始から終了まで完了できました。

    追加したい点として、:last-childプロパティを使用して最後のメニュー項目に右の境界線を含める方法があります。


    .menu-item:last-child { border-right: 1px solid #ccc; }

  23. Walker_Nav_Menu を拡張する代わりに、フィルターが提供されていれば(そしてより簡単に)良いでしょう。例えば、
    コアコードに以下のようなものがあれば:
    $item_output .= apply_filters( ‘walker_nav_menu_description’, $item->description);

    その場合、カスタムフィルター関数は次のようになります。
    return ” . $description . ”;

返信する

コメントを残していただきありがとうございます。すべてのコメントは、当社のコメントポリシーに従ってモデレーションされますので、ご了承ください。メールアドレスは公開されません。名前フィールドにキーワードを使用しないでください。個人的で有意義な会話をしましょう。