WordPressで、今読んでいる記事と同じカテゴリーの記事を表示したかったのでメモ。
例えば、関連記事数件を記事の下に表示したい時など。
コードの全貌
以下のように記述すると、同じカテゴリーの記事がある場合に、そのカテゴリーの記事3件のタイトルがリスト形式で表示されます。
<?php
$categories = get_the_category();
$query = new WP_Query( array('post__not_in' => array($post -> ID), 'posts_per_page'=> 3, 'category__in' => $categories[0] -> cat_ID, 'orderby' => 'rand'));
if( $query -> have_posts() ): ?>
<ul>
<?php while ($query -> have_posts()): $query -> the_post(); ?>
<li><?php the_title(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; wp_reset_postdata(); ?>
解説
記事のカテゴリーを取得
まずは、記事のカテゴリーを取得しておきます。これは、親カテゴリーも子カテゴリーも全て取得され、配列になります。
$categories = get_the_category();
WP_Queryでループを作成
WP_Queryを使えば、オリジナルのループを作成できます。
$query = new WP_Query();
今回は、読んでいる記事と同じカテゴリーの記事をループで取得します。
WP_Queryの中に、ループの条件を配列(array())で記述します。
array(
'post__not_in' => array($post -> ID),
'posts_per_page'=> 3,
'category__in' => $categories[0] -> cat_ID,
'orderby' => 'rand'
)
今回配列で指定したのは以下の値。
- post__not_in = 指定した記事を除外
- posts_per_page = 1ページあたりの表示件数を指定
- category__in = カテゴリーを指定
- orderby = 並び順を指定
まず、今読んでいる記事が表示されても仕方がないので、今読んでいる記事は除外します。
'post__not_in' => array($post -> ID)
次に、表示件数を指定。今回は3件にしています。
'posts_per_page'=> 3
そして、今読んでいる記事と同じカテゴリーを指定します。
'category__in' => $categories[0] -> cat_ID
先に$categories = get_the_category();でカテゴリーを配列で取得していたので、「$categories[0]」つまり配列の0番目(1個目)の、「cat_ID」つまりカテゴリーIDを取得。0番目は親カテゴリーになります。
最後に、並び順はランダムにします。こうすれば、同じカテゴリーの別の記事にとんでも、様々な記事が表示されます。
'orderby' => 'rand'
記事があった場合のみ表示
同じカテゴリーの記事があった場合のみ表示するという分岐。
if( $query -> have_posts() ):
試したところ、読んでいる記事以外に同じカテゴリーの記事が2件以上あった場合のみ記事があると認識されるようです。読んでいる記事以外に1件しかない場合は記事がない方に分岐しました。
ループを開始&終了
ループを開始する記述です。
<?php while ($query -> have_posts()): $query -> the_post(); ?>
〜
<?php endwhile; ?>
have_posts()で次の記事があるか調べ、the_post()でその記事を取得します。
このループの中に書いたものが、posts_per_pageの数生成されます。
分岐を終了してリセットする
分岐を終了して、WP_Queryをリセットします。
<?php endif; wp_reset_postdata(); ?>
おわりに
以上が、同じカテゴリーの記事がある場合に、そのカテゴリーの記事3件のタイトルをリスト形式で表示するコードの解説でした。
コードの全貌をもう一度。
<?php
$categories = get_the_category();
$query = new WP_Query( array('post__not_in' => array($post -> ID), 'posts_per_page'=> 3, 'category__in' => $categories[0] -> cat_ID, 'orderby' => 'rand'));
if( $query -> have_posts() ): ?>
<ul>
<?php while ($query -> have_posts()): $query -> the_post(); ?>
<li><?php the_title(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; wp_reset_postdata(); ?>
もちろんタイトル以外も取得して表示できます!
分岐を活用して、同じカテゴリーの記事がなかった場合は別のものを表示したりもできます。