投稿記事と同じカテゴリーに所属している他の記事一覧を、現在の記事は除いて表示する。複数カテゴリー対応

検索して出てきた方法を使ったら複数のカテゴリーに属しているときはうまく動くけど、一つのカテゴリーにしか属していないときにはうまく動かない、というかエラー吐いたりして困ったので頑張ってみた。

条件

  1. single.php
  2. 投稿記事の下に「同じカテゴリーのその他の記事」を一覧表示させたい
  3. ただし、投稿記事はその一覧から省く
  4. 現在の投稿記事が複数のカテゴリーに属しているときは、それらを全てひっくるめて表示すること
  5. 扱いやすいnew WP_Query を使いたい

コード

<?php
$post_id = get_the_ID();
$cat_ = get_the_category() ;
$a = $cat_[1];

if (empty($a)) :
    $cat_ids = $cat_[0] -> term_id;
else :
    foreach ($cat_ as $cat_id):
        $cat_ids .= $cat_id -> term_id.",";
    endforeach;
endif ;

$rel_posts = new WP_Query (array(
    'showposts' => 6,
    'post__not_in' => array($post_id),
    'cat' => $cat_ids
    ));
?>
<?php if( $rel_posts -> have_posts() ) : ?>
<?php while ( $rel_posts -> have_posts() ) : $rel_posts -> the_post(); ?>

 表示処理 

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

解説

$post_id = get_the_ID();

現在の投稿のIDを取得。あとでWP_Queryから現在の投稿を外すために使用する。

$cat_ = get_the_category() ;

現在の投稿のカテゴリに関する情報を取得。$catは使うのがはばかられたので(予約語にcatってあるし・・・)アンダースコアをつけてます。

$a = $cat_[1];

現在の記事にカテゴリーが複数割り当てられているかどうかを判別するために使用。邪道っぽいやり方ですが。
このあとで if (empty($a)) : というかたちで、$aにデータがなければ、所属するカテゴリーは1つだけ、というやり方。

条件分岐その1

if (empty($a)) :
$cat_ids = $cat_[0] -> term_id;
現在の記事の所属するカテゴリーが1つだけの場合、そのカテゴリーのidを$cat_idsに格納します。

else :
foreach ($cat_ as $cat_id):
$cat_ids .= $cat_id -> term_id.",";
endforeach;
endif ;
現在の記事の所属するカテゴリーが複数ある場合、$cat_idsに、,区切りでカテゴリIDを格納します。
メモ1:.=(結合代入演算子
メモ2:foreach

クエリ発行

これで必要な変数、IDを、条件ごとに取得できたので、あとはいつもどおりWP_Queryを使う。
$rel_posts = new WP_Query (array(
'showposts' => 6,
'post__not_in' => array($post_id),
'cat' => $cat_ids
));
showposts で出力する記事数を決定。ここでは6記事分。

出力処理

<?php if( $rel_posts -> have_posts() ) : ?>
<?php while ( $rel_posts -> have_posts() ) : $rel_posts -> the_post(); ?>
ここから先は普通のループと同じように出力処理が可能。

<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata() ?>
WP_Queryを使ったのでちゃんとwp_reset_postdata()してループをメインループに返してあげる、と。