wp_nav_menuでsingleページにもcurrentをつける(改良版)

はい!皆さんこんにちは。

前々前回くらいのブログで「wp_nav_menuでsingleページにもcurrentをつける」方法をご紹介しました。

ただ、ブログ内でも描いている通り単純にリプレイスするだけでしたので
今回は社内のプログラマーさんに相談してもう少しスタイリッシュな方法でご紹介します!

デザイナーじゃなかなかここまで掘れない…!自分でできるようになるといいんですけどね★
これも勉強だ!

早速ソースコード…。

function nav_menu_add_current_class($sorted_menu_items)
{
     // 詳細ページにカレントクラスを付与するフックではあるが、サイトの構成上、例外がある場合は下記に条件を追加する
     if (is_single() || is_post_type_archive('requirements') || is_parent_slug() === 'voice') {

          global $post;

          // get_post_type()は最低でも1つの記事が公開されていることが前提
          $post_type = get_post_type();

          if ('post' === $post_type) {
               // ※※※※※※ ▼通常の投稿のスラッグを変更している場合は必ずここも一致させる ※※※※※※
               $target_slug = 'info';
          } elseif ('products' === $post_type) {
               // 製品情報タームアーカイブのメニューにカレントを付ける
               $term = get_the_terms($post->ID, 'pro_cat')[0];
               $target_slug = $term->slug;
          } elseif ('requirements' === $post_type) {
               // 募集要項アーカイブのメニューにカレントを付ける
               $target_slug = 'requirements';
          } elseif (is_parent_slug() === 'voice') {
               // 先輩社員の声ページのメニューにカレントを付ける
               $target_slug = 'voice';
          }

          foreach ($sorted_menu_items as $sorted_menu_item) {

               // アイテムのurlから投稿タイプのスラッグを抽出(他に妥当な要素が見当たらない)
               $item_slug = basename($sorted_menu_item->url);

               if ($target_slug === $item_slug) {
                    $sorted_menu_item->classes[] = 'current-menu-item';    // 該当するメニューにクラスを付与
                    break;    // ここに到達するアイテムは1つしかないので余計にループさせない
               }
          }
     }
     return $sorted_menu_items;
}
add_filter('wp_nav_menu_objects', 'nav_menu_add_current_class');

if文で区切っているのはカスタム投稿タイプなので適宜皆さんのやり方に変更してください。
内容としてはコメントしている通り!
いろいろと複雑ですが、これで対応できます。

リプレイス方がダサいけどわかりやすい方はその方法でもいいと思いますよー!
みなさんも試してみて下さい!