【WordPress】個別記事で同じカテゴリーやタグの関連記事を出力してみる

wordpress

WordPressで個別記事(single.php)で同じカテゴリーや同じタグをもった記事を関連ページとして出力したい時ってあるかと思うので、それを忘備録として記事にしてみた。ただし今回はプラグインを使わない方法です。

また出力する際にループ処理しますが、ループにはWP_Queryget_postsと2種類あるかと思いますが、今回はWP_Queryで統一します。ループは決まり文句みたいな部分もあるのでループの書き方は以下のサイトを参考にさせていただきました。

同じカテゴリーの記事一覧を表示させるには?

同じカテゴリーに属している記事の一覧を表示させるコードは以下になります。

    ID); if($tags): //カテゴリーIDを代入する配列を定義する $tagArray = array(); foreach($tags as $tag): //カテゴリIDを追加 array_push($tagArray,$tag->term_id); endforeach; $args=array( 'post__not_in'=>array($post->ID), 'tag__in'=>$tagArray, 'posts_per_page'=>5, 'ignore_sticky_posts'=>1,//『この投稿を先頭に固定表示』にチェックをつけた投稿」を除外して取得する 'orderby'=>'rand'//ランダム ); $query=new WP_Query($args); if($query->have_posts()): while($query->have_posts()): $query->the_post(); ?>

見ている記事が属しているカテゴリーを取得して配列を作る

まずは、現在見ている記事がどのカテゴリーに属しているのかをget_the_category($post->ID);で取得し、$categoriesに配列として保存しています。そしてforeachでカテゴリーのIDを新しい配列に保存します。
カテゴリーが1つだけであっても配列で保存してください。理由は、WP_Queryで同じカテゴリーを絞り込むパラメータに配列を指定しないといけないからです。

ループの条件に取得したカテゴリーの配列を指定する

記事が属してるカテゴリーの配列を作ったら、以下のようにcategory__inのパラメータに配列を指定しWP_Queryに渡します。
*他のパラメータは、一旦省略しています。

$args=array(
      'category__in'=$category_ids,
);

$query=new WP_Query($args);

他のパラメータについて

同じカテゴリーの上記のように指定しますが、他のリーの上記のように指定しますが、他のパラメータについて説明しておきます。

‘post__not_in’=>array($post->ID)指定した投稿(現在のページ)は取得されない。配列を指定。
‘posts_per_page’=>5,表示する件数を指定。
‘orderby’=>’rand’ランダムで並び替える。
WP_Queryに指定したパラメータについて

同じタグの記事一覧を表示させるには?

今度は、同じタグに属している記事の一覧を表示させる方法です。
基本的には、カテゴリーの方法は同じですが、タグの取得方法が違う感じです。


    ID); if($tags): //カテゴリーIDを代入する配列を定義する $tagArray = array(); foreach($tags as $tag): //カテゴリIDを追加 array_push($tagArray,$tag->term_id); endforeach; $args=array( 'post__not_in'=>array($post->ID), 'tag__in'=>$tagArray, 'posts_per_page'=>5, 'ignore_sticky_posts'=>1,//『この投稿を先頭に固定表示』にチェックをつけた投稿」を除外して取得する 'orderby'=>'rand'//ランダム ); $query=new WP_Query($args); if($query->have_posts()): while($query->have_posts()): $query->the_post(); ?>

見ている記事が属しているタグを取得して配列を作る

現在の投稿から$tags = wp_get_post_tags($post->ID);でタグを取得してカテゴリーと同じくfoeach文で$tag->term_idでタグIDを配列に追加します。

ループの条件に取得したタグの配列を指定する

カテゴリーの時と同じようにWP_Queryに引き渡す条件として現在の記を除いた記事'post__not_in'=>array($post->ID)'tag__in'=>$tagArrayと取得したタグIDの配列を指定することで現在の記事以外の同じタグに属した記事を取得することができます。
*他のパラメータは、一旦省略しています。一旦省略しています。

$args=array(
 'post__not_in'=>array($post->ID),
      'tag__in'=>$tagArray,
    
    );
$query=new WP_Query($args);

条件分岐しているのは?

現在表示してる記事のタグを取得した後に、if($tags):文で条件分岐をしているかと思います。
なぜかいうと仮に特定の記事にタグが設定されてない場合や、その記事にしか設定されていないタグがあったりすると'tag__in'=>$tagArrayの配列の値が0となるので、全部の記事が表示されてしまうので、配列が空だった場合は、if文でWP_Queryの処理を実行させないようにしたほうがいいでしょう。

まとめ

以上で、よくありそうな処理方法を記事にしてみましたが、以下のサイトにいろいろループの方法が書かれてるので参考になります。

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#.E3.82.BF.E3.82.B0.E3.81.AE.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF