WordPressの関連記事表示をPHPのみ使って行う方法

WordPressで関連記事表示するなら普通はプラグインを使います。

というか余程の理由がない限りはプラグインを使った方が楽です。

ですが例えば次のように

「どうしてもPHPを使って関連記事を表示したい」
「テキストだけの関連リンクを表示したい」
「なるべくプラグインを使いたくない・増やしたくない」

などの事情があるならPHPを使って自力で関連リンクを表示することもできます。

ここではそのやり方について簡単にまとめてみました。

関連記事表示の重要なポイント

最初に関連記事を表示するのに大事なことについていくつか説明します。

重要になってくるポイントは次の2つ

  • 記事リストをどうやって取得するのか
  • 関連記事をどうやって選ぶのか

特にどの記事を関連記事として選ぶかは超重要です。

 

まず記事リストの取得方法について

WordPressではクエリを発行することで特定の条件に当てはまる投稿リストを取得できます。

そのために使われる関数の1つが wp_get_post_categories  という関数

この関数に条件を表す配列を渡すことで投稿(WP_Post )のリストが取得可能です。

例えば次は記事タイトルに「PHP」が含まれ、順番がランダムな記事リストを返すコード例

条件を指定する配列 $args  を作り、それを get_posts  に渡すだけです。

より詳しい使い方については次の公式ページをチェック

とりあえず関連記事表示にはこのget_posts関数を使うことにします。

 

そして次に関連記事の選び方について

関連記事を厳密に選ぼうとすると結構大変で複雑になってしまいます。

なのでここでは現在記事のカテゴリと同じ記事を関連記事として選ぶことにしましょう。

WordPressで現在記事のカテゴリIDリストを取得するコードは次の通り

カテゴリには 21  とか 78  とか 104  とかのIDがそれぞれ割り振られています。

そのIDリストを [ 21, 78, 104 ]  みたいな配列形式で得られるのが上で紹介したコード

そしてそのリストをget_posts関数のパラメーターに渡すことで関連記事を絞り込み可能です。

 

以上が関連記事表示で大事な2つのポイント

これらのポイントを踏まえることでそこそこの精度で関連記事を表示することができます。

関連記事表示のPHPコード例

では実際にカテゴリで関連記事を絞り込みするやり方を紹介します。

具体的なコード例は次の通り

 

まず次のようにget_posts関数を使って関連記事リストを取得

$args  の内部で 'category__in' => $cat_ids  を指定しているのがポイントです、

これで現在投稿に含まれるカテゴリを持つ関連記事だけに絞り込みできます。

あと 'post__not_in' => array( $post->ID )  で現在投稿を除外してるのも地味に大事なポイント

 

そして次が投稿リストから実際に関連記事リンクを出力しているコード

foreachで各投稿オブジェクトを取り出し、タイトル付きでリンクを出力するだけです。

ただしforeachに渡している $post  は変数名を変更しないように注意してください。

これはただの変数ではなく、WordPressで定義済みの変数なので変更するのはNGです。

あとforeachループ内で setup_postdata  を実行することで the_permalink  とか the_title  とかのグローバル情報を変更し、foreachの最後で wp_reset_postdata  で元に戻しています。

これについてはWordPressの仕様なので深く考える必要はありません。

 

以上のコードを関数化してまとめて載せると次の通り

この関数をページ内の任意の場所で呼び出せば関連記事リンクが表示されます。

ここまでのまとめ

以上がWordPressで関連記事をPHPのみ使って表示する方法です。

僕自身こういうことをする機会があったので、その忘備録的な意味でまとめてみました。

でも普通に関連記事を表示するだけならプラグインを使った方が楽ですね。笑

車輪の再発明みたいな感じですが、「どうしてもプラグインの表示が気に入らない!」とかの事情があるときに使えるかなと思います。

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください