WordPress 表示中の投稿と同じタームに分類された投稿の表示方法

WordPress 表示中の投稿と同じタームに分類された投稿の表示方法

WordPress で現在表示中の投稿と同じタームに分類された投稿を表示する方法を紹介します。
例えば、プラグインを使わずに関連記事を表示したい場合に便利な方法です。

  1. 現在表示中の投稿と同じタームに分類されている投稿の表示方法
  2. タームタイトルを表示
  3. 表示中の投稿を表示してカレントを付与する方法

現在表示中の投稿と同じタームに分類されている投稿の表示方法

表示中の投稿と同じタームに分類された投稿の表示する場合 wp_get_object_terms を使用します。
次のコードは、タクソノミースラッグ product-categories で投稿タイプのスラッグが products の場合の表示方法です。

<?php // 現在表示されている投稿と同じタームに分類された投稿を取得
$taxonomy_slug = 'product-categories'; // タクソノミーのスラッグを指定
$post_type_slug = 'products'; // 投稿タイプのスラッグを指定
$post_terms = wp_get_object_terms($post->ID, $taxonomy_slug); // タクソノミーの指定
$args = array(
'post_type' => $post_type_slug, // 投稿タイプを指定
'posts_per_page' => 5, // 表示件数を指定
'orderby' => 'rand', // ランダムに投稿を取得
'post__not_in' => array($post->ID), // 現在の投稿を除外
'tax_query' => array( // タクソノミーパラメーターを使用
array(
'taxonomy' => $taxonomy_slug, // タームを取得タクソノミーを指定
'field' => 'slug', // スラッグに一致するタームを返す
'terms' => $post_terms[0] // タームの配列を指定
)
)
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>

まずは、任意のタクソノミーと投稿タイプのスラッグを指定します。
タクソノミーの指定は $taxonomy_slug = 'product-categories’;product-categories を変更。
投稿タイプの指定は $post_type_slug = 'products';products を変更してください。

次に、表示中の投稿に紐付いているターム情報を配列に格納します。
最後にサブループのクエリにタームの配列を指定しておしまいです。
表示件数などの条件は適宜調整を加えてください。
サブループの詳しい出力方法はWordPress 基本的なループの表示方法を紹介をご覧ください。

タームタイトルを表示

ターム情報取得中にターム名を取得します。最初に紹介したコード内にターム名の取得を追加します。

<?php // 現在表示されている投稿と同じタームに分類された投稿を取得
$taxonomy_slug = 'product-categories'; // タクソノミーのスラッグを指定
$post_type_slug = 'products'; // 投稿タイプのスラッグを指定
$post_terms = wp_get_object_terms($post->ID, $taxonomy_slug); // タクソノミーの指定
$now_post_id = $post->ID; // カレント用に表示中の投稿IDを取得
if( $post_terms && !is_wp_error($post_terms)) { // 値があるときに作動
$terms_slug = array(); // 配列のセット
foreach( $post_terms as $value ){ // 配列の作成
$terms_slug[] = $value->slug; // タームのスラッグを配列に追加
$terms_name = $value->name; // ターム名の取得
}
}
$args = array(
--- 以下省略 ---

該当部分は以下の部分です。

$terms_name = $value->name; // ターム名の取得

取得した値を表示する場合は以下のコードを追加します。

<?php echo $terms_name ?>

ただし、この方法はタームを複数設定している場合に、取得した値を上書きしてしまうため注意が必要です。

表示中の投稿を表示してカレントを付与する方法

表示中の投稿を表示してカレントを付与する場合、最初に紹介したコードにいくつか手を加えます。
次のコードは、表示する記事一覧に表示中の記事があった場合、カレントを付与します。

<?php // 現在表示されている投稿と同じタームに分類された投稿を取得
$taxonomy_slug = 'product-categories'; // タクソノミーのスラッグを指定
$post_type_slug = 'products'; // 投稿タイプのスラッグを指定
$post_terms = wp_get_object_terms($post->ID, $taxonomy_slug); // タクソノミーの指定
$now_post_id = $post->ID; // カレント用に表示中の投稿IDを取得
if( $post_terms && !is_wp_error($post_terms)) { // 値があるときに作動
$terms_slug = array(); // 配列のセット
foreach( $post_terms as $value ){ // 配列の作成
$terms_slug[] = $value->slug; // タームのスラッグを配列に追加
$terms_name = $value->name; // ターム名の取得
}
}
$args = array(
'post_type' => $post_type_slug, // 投稿タイプを指定
'posts_per_page' => -1, // タームに紐づく全ての投稿を表示
'tax_query' => array( // タクソノミーパラメーターを使用
array(
'taxonomy' => $taxonomy_slug, // タームを取得タクソノミーを指定
'field' => 'slug', // スラッグに一致するタームを返す
'terms' => $terms_slug // タームの配列を指定
)
)
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<a href="<?php the_permalink() ?>" class="<?php if($now_post_id == $post->ID){echo 'current';} ?>"><?php the_title(); ?></a>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>

最初に紹介したコードに追加されていた、表示中の投稿を除外する記述 post__not_in を削除しています。

'post__not_in' => array($post->ID), // 現在の投稿を除外

次に、表示された表示中の投稿にカレントを付与したい場合は、表示中の投稿IDを取得。

$now_post_id = $post->ID; // カレント用に表示中の投稿IDを取得

投稿一覧を出力しているループないで、投稿IDが一致した場合にカレントを付与します。

<?php if($now_post_id == $post->ID){echo 'current';} ?>

まとめ

WordPress で現在表示中の投稿と同じタームに分類された投稿を表示する方法を紹介しました。