カスタム投稿でタクソノミーのタームに属する記事をタームごとに一覧表示させる方法
カスタム投稿のタームごとに記事を表示させたかったので備忘録
普通にタイトル、本文、カスタマフィールドを取得することができずかなり苦戦したので備忘録
実際に使用したコード
<?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 ); ?>
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 ); ?>
記事に紐づいていないタームの出力方法
記事に紐づいてないタームは初期状態だと表示されないので以下のコードを記述する必要がある
// 記事に紐づいていないタームを隠す(初期値:1(true))
'hide_empty' => false,
参考
▼【WordPress】記事が未登録のタクソノミーのタームリストを取得する
https://www.p-nt.com/technicblog/archives/84