【WordPress】子タームの投稿一覧にも親タームのメニューや内容を表示したい

ACFなどでカスタム投稿+カスタムタクソノミー(タームに親子関係あり)で記事を作成してるとき、タームごとの記事一覧ページにそれぞれの親ターム(ここが重要)ごと違うメニューやコンテンツを表示したい!
となった時にうまく表示できずすこし引っかかったものの、なんとかなったのでメモ。

例として、カスタム投稿のスラッグは「goods」、タクソノミーは「kind」とします。

taxonomy-kind.php

<?php get_template_part('template-parts/term-kind_link'); ?><!-- メニュー部分のパーツテンプレート -->

template-parts/term-kind_link.php

<?php
$terms = get_the_terms($post->ID, 'kind'); // カスタムタクソノミーのスラッグを指定
if ($terms && ! is_wp_error($terms)) {
  foreach ($terms as $term) {
    if ('food' === $term->slug) {
      // 親タームが「food」の場合の表示
      get_template_part('template-parts/term-kind_link', 'food');
      break;
    } elseif ('book' === $term->slug) {
      // 親タームが「book」の場合の表示
      get_template_part('template-parts/term-kind_link', 'book');
      break;
    } elseif ('fashion' === $term->slug) {
      // 親タームが「fashion」の場合の表示
      get_template_part('template-parts/term-kind_link', 'fashion');
      break;
    }
  }
} else {
  // デフォルトの表示(もしカスタムタクソノミーが設定されていない場合など)
}
?>

上記コードで、たとえば「food」を親とした子ターム「fruit」でも「food」の一覧ページと同じテンプレートを読み込むことができます。
前提として、子タームを使用した投稿の際は親タームも選択してください(当たり前ですが……)。
$term->slugで一覧に出ている投稿に含まれるタームを全て取得するため、親タームが選択されていれば一覧にそれが表示されるというわけです。

あとは親タームごとに読み込むメニューとテンプレートファイルを作成します。

functions.php

// WordPressの「メニュー」に表示位置を追加
function register_my_menus()
{
register_nav_menus(
array(
'menu-food' => 'フードメニュー',
'menu-book' => '書籍メニュー',
'menu-fasion' => '衣類メニュー',
)
);
}
add_action('after_setup_theme', 'register_my_menus');

food専用のメニューを読み込むなら「template-parts/term-kind_link-food.php」に下記コードを追加。

<?php wp_nav_menu(array(
  'theme_location'  => 'menu-food',
)); ?>

肝心のメニュー内容はWordPress標準機能の「メニュー」でそれぞれ作成するだけです。

これでうまくいきました。

もっとファイル数少なく作れるかもしれませんが、基本的にはパーツごとにテンプレート分けたい派なのでこうなりました。
メニューそのものの表示の追加はphpファイルをいじらないといけないのですが、メニューの内容をクライアントに自由に編集してもらう場合はこの方法だとWordPress管理画面から可能なので便利です。
私の場合は、親タームごとに違う外部リンク集を貼りたい場合に使用しました。

phpやWordPressはまだまだ初心者ですが、これを使えば他にも色々応用が効きそうです。

参考サイト
https://markleaps.com/2024/07/31/wp_cpt-term/
https://thewppress.com/libraries/enable-navigation-menu/

コメント