web関連

カスタム投稿でタクソノミーのタームに属する記事をタームごとに一覧表示させる方法

カスタム投稿でタクソノミーのタームに属する記事をタームごとに一覧表示させる方法

カスタム投稿のタームごとに記事を表示させたかったので備忘録
普通にタイトル、本文、カスタマフィールドを取得することができずかなり苦戦したので備忘録

実際に使用したコード

<?php
$taxonomy_name = 'タクソノミーのスラッグ名';
$post_type = 'カスタム投稿のスラッグ名';
$args = array(
'orderby' => 'name',
'hide_empty' => false, // 投稿の紐づいていない記事を隠すかどうか
'hierarchical' => false
);
$taxonomys = get_terms( $taxonomy_name, $args);
if(!is_wp_error($taxonomys) && count($taxonomys)):
foreach($taxonomys as $taxonomy):
$url = get_term_link($taxonomy->slug, $taxonomy_name);
$tax_posts = get_posts( array(
'post_type' => $post_type,
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy_name,
'terms' => array( $taxonomy->slug ),
'field' => 'slug',
)
)
));
?>

// ターム名を取得
<h3><?php echo esc_html($taxonomy->name); ?></h3>

<?php foreach($tax_posts as $tax_post): ?>

// 記事タイトル取得方法
<?php echo get_the_title($tax_post->ID); ?>

// 記事本文取得方法
<?php echo apply_filters( 'the_content', $tax_post->post_content ); ?>

// 記事URL取得方法
<?php echo get_permalink($tax_post->ID); ?>

// カスタムフィールド(画像)取得例
<?php $acf_img = get_post_meta($tax_post->ID,'フィールド名',true); ?>
<?php echo wp_get_attachment_image( $acf_img, 'full' ); ?>
<?php echo wp_get_attachment_url( $acf_img ); ?>// urlのみ取得

<?php endforeach; wp_reset_postdata(); ?>
<?php endforeach; endif; ?>

タームに属する記事をループで取得しています。
通常のループと異なる様で「the_title()」「the_content()」で記事の中身を取得できなかった。

参考

▼tax_queryでターム毎に分類してカスタム投稿記事一覧を表示する
https://naoyu.net/tax_query/

▼WordPress ターム情報の取得と表示方法
https://hirashimatakumi.com/blog/164.html

以下は、悪戦苦闘した備忘録です。

「the_title()」「the_content()」で取得ができない

archive.php内で「the_title()」「the_content()」を使っても、項目が最新の1件の内容で全部同じになってしまった…

なので、記事のIDや配列から取得して表示させています。

記事本文の取得方法

「the_content()」が使えなかったが、タイトルの取得がget_the_title($tax_post->ID)でうまくいっていたから「get_the_content($tax_post->ID)」で取得しようと思ったらうまくいかなかったので以下のように取得

<?php echo apply_filters( 'the_content', $tax_post->post_content ); ?>
「$tax_post」の配列の[post_content]をvar_dump使って確認したら記事の本文は取得できているっぽかったので上記コードで出力した

カスタムフィールドも通常の方法では取得できない

カスタムフィールドも普通に「the_field()」で取得しようとしても全部同じ内容が出力されてしまったのでget_post_meta()でIDに属するカスタマフィールドを指定して「wp_get_attachment_image()」で出力しています。

<?php $acf_img = get_post_meta($tax_post->ID,'フィールド名',true); ?>
<?php echo wp_get_attachment_image( $acf_img, 'full' ); ?>
<?php echo wp_get_attachment_url( $acf_img ); ?>
上記コ―ドはimgタグを含む画像の出力と画像URLのみの出力方法

記事に紐づいていないタームの出力方法

記事に紐づいてないタームは初期状態だと表示されないので以下のコードを記述する必要がある

// 記事に紐づいていないタームを隠す(初期値:1(true))
'hide_empty' => false,

参考

▼【WordPress】記事が未登録のタクソノミーのタームリストを取得する
https://www.p-nt.com/technicblog/archives/84

どこに「’hide_empty’ => false,」を入れればいいのかわからなくて躓いた
普通のループと同じ考えで、タイトルや本文を取得しようと思ったら取得できないから解決して、カスタマフィールドも同じく普通に取得できないから調べて解決、最後に記事が紐づいていないタームが表示できずボロボロになりながら解決…凄い疲れた。