WordPressのデフォルトメニューに構造化データを出力する方法【Walker_Nav_Menu】

構造化データをしっかり設定するのに凝りだしたのに、Wordpressのデフォルトのメニューは対応してへんやんけ
と、憤りを感じている方。
一晩考えたのちに諦めて、メニュー機能を切り捨てて直接コードを書いてしまっていませんか。

今回は、Wordpressのデフォルトメニューを制御しているclass_walker_nav_menu.phpの「Walker_Nav_Menu 」を継承しつつ、コピペで実装可能な方法をご紹介します。

functions.phpへの記載

まずは、functions.phpに以下をコピペしてください。
著者が参考にした複数サイトのコードはwordpressの仕様変更かなんかでエラーを吐いていましたが、以下は2022年7月現在エラー吐かずに動作確認済みです。

 class New_Walker_Nav_Menu extends Walker_Nav_Menu
 {
     function start_el(&$output, $item, $depth = 0, $args =  array(), $id = 0)
     {
         $output .= '<li itemprop="name" class="menu-item">';
         $item_output .= '<a itemprop="url" href="'
                         . esc_attr($item -> url) .'">'
                         . $item -> title . '</a>';
         $output .= apply_filters('walker_nav_menu_start_el',$item_output,$item,$depth,$args);
     }
 }

メニューを表示したいテンプレートファイルへの記載

次にメニューを表示したいテンプレートファイルの該当部分に下記を追記します。
グローバルナビなら「header.php」が一般的かと思います。

<?php if (has_nav_menu('gnav')) { ?>
        <nav id="gnav" role="navigation" itemscope="itemscope" itemtype="http://scheme.org/SiteNavigationElement">
          <div class="wrap">
            <?php
            wp_nav_menu(array(
              'theme_location' => 'gnav',
              'menu_class'      => 'clearfix',
              'menu_id'         => 'gnav-ul',
              'container'       => 'div',
              'container_id'    => 'gnav-container',
              'container_class' => 'gnav-container',
              'walker' => new New_Walker_Nav_Menu
            ));
            ?>
          </div>
        </nav>
      <?php } ?>

「menu_class」「menu_id」はそのまま、出力される「ul」にidとclassを付与したいときに記載します。必要なければ不要です。

「container_id」「container_class」は「container」で指定したタグが先述の「ul」の親要素として出力されるので、それのidとclassの制御です。こちらも同様に不要でしたら記載なしで大丈夫ですが、「container」のところは「false」にします。

最後に、「theme_location」はwordpress管理画面で選択するナビの表示させたい場所のスラッグです。
ちなみにメニューのスラッグは「functions.php」に以下を指定することで自由に変更可能です。

register_nav_menus( array(
        'gnav' => 'グローバル',
        'side' => 'サイド',
        'footer' => 'フッター'
) );

まとめ

最終的には以下のように、しっかり構造化できたhtmlにて出力されます。

<div id="gnav-container" class="gnav-container">
        <ul id="gnav-ul" class="clearfix">
                <li itemprop="name" class="menu-item"><a itemprop="url" href="http://example.com">サンプル</a></li>
        </ul>
</div>

コメントを残す

*