南国スキーぶろぐ・Z

岩手県盛岡市のネタを中心としたお出掛け雑記ブログ

当サイトはアフィリエイト広告を利用しております

岩手県と盛岡市のブログです

投稿とカスタム投稿を同じループ内にまとめて表示させ、カテゴリ名とターム名を同時に表示させる方法

にほんブログ村 地域生活(街) 東北ブログ 岩手県情報へ にほんブログ村 地域生活(街) 東北ブログ 盛岡市情報へ

2023/02/14

wordpress ,

同じループ内に、通常の投稿一覧とカスタム投稿投稿一覧を同時に(一緒に)表示させたい時ってあるよね。異なる投稿タイプを同一のループ内に一緒に表示させるのは簡単だけど、俺が困っていたのは、投稿のカテゴリ名とカスタム投稿のターム名を同じループ内で表示させる方法だったんです。

投稿カテゴリは、カテゴリ出力関係のテンプレートタグで出力するけど、ターム名はパラメータでタクソノミー 名を指定した上でのターム名出力なので、どちらかを指定するとどちらかが出力されない感じになってたの。

今までなーなーにしてたけど、一緒に出力させる事が出来ればやっぱり便利だなと思ったので、気合い入れて調べてみました。
結果、狙い通りの出力結果を得られたので備忘録として紹介。
と言うか、WordPress Codexに書いてあったんだけどね(笑)。

その前に、通常の投稿(post)と、カスタム投稿(lessonとclass)を同一のループ内でまとめて表示させるループ記述から。

get_postsで投稿とカスタム投稿を同時に表示

<?php
$args = array(
  'post_type' => array('lesson', 'class', 'post'),
  'posts_per_page' => 10
);
$post_list = get_posts($args);
if(!empty($post_list)): foreach($post_list as $post): setup_postdata($post);
?>

<p>ループの中身</p>

<?php endforeach; elseif(empty($myposts)):?>

<p>投稿がありません。</p>

<?php endif; wp_reset_query(); ?>

WP_Queryで投稿とカスタム投稿を同時に表示

get_postsだとページネーションが出来ないので、アーカイブやカテゴリページでページングしたい時はWP_Queryを使用。

<?php
$paged = get_query_var('paged')? get_query_var('paged'): 1;
$args = array(
  'post_type' => array('lesson', 'class', 'post'),
  'posts_per_page' => 10,
  'paged' => $paged
);
$my_query = new WP_Query($args);
if($my_query->have_posts()): while($my_query->have_posts()): $my_query->the_post();
?>

<p>ループの中身</p>

<?php endwhile; else: ?>

<p>投稿がありません。</p>

<?php endif; wp_reset_postdata(); ?>

functions.phpに記述

こちらの記述、WordPress Codexに書いてあった物そのまんまです。
カテゴリとタームを一緒に表示させる記述。

function custom_taxonomies_terms_links() {
  $post = get_post($post - > ID);
  $post_type = $post - > post_type;
  $taxonomies = get_object_taxonomies($post_type, 'objects');
  $out = array();
  foreach($taxonomies as $taxonomy_slug => $taxonomy) {
    $terms = get_the_terms($post - > ID, $taxonomy_slug);
    if (!empty($terms)) {
      foreach($terms as $term) {
        $out[] = $term - > name;
      }
    }
  }
  return implode('', $out);
}

上記コードだと「タグ」も一緒に表示されてしまうという報告がコメント欄にありました。
タグは除外したい場合は、下記コードでいけるそうです。
ぐれこさん情報ありがとうございます!

function custom_taxonomies_terms_links() {
    $post = get_post($post - > ID);
    $post_type = $post - > post_type;
    $taxonomies = array(
        'taxonomy-slug',
        'category'
    );
    $terms = get_the_terms($post->ID, $taxonomies );
    $out = array();
    foreach($taxonomies as $taxonomy_slug => $taxonomy) {
        $terms = get_the_terms($post - > ID, $taxonomy_slug);
        if (!empty($terms)) {
            foreach($terms as $term) {
                $out[] = $term - > name;
            }
        }
    }
    return implode('', $out);
}

カテゴリ名、ターム名を出力したい場所に記述

<?php echo custom_taxonomies_terms_links(); ?>

以上です。
最後の出力記述はPタグとかで囲ってあげないと裸で出力されます。
これらの記述により、新着情報などの一覧に通常の投稿とカスタム投稿をまとめて表示出来るようになり、カテゴリ名とターム名も同じループ内で表示出来るようになりました。