WEBTODESIGN

WordPressで読んでいる記事と同じカテゴリーの記事を表示するテンプレートタグ

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(); ?>

もちろんタイトル以外も取得して表示できます!
分岐を活用して、同じカテゴリーの記事がなかった場合は別のものを表示したりもできます。