こんにちは。今日もアウトプットしていきます。テーマはこちら
投稿ページに関連記事一覧を表示させる方法
ブログ投稿ページなどの個別投稿記事(テンプレート階層でいうところのsingle.php)のサイドバーに、同じカテゴリーの投稿をランダムで3件表示するというのが目標です。今回もプラグインは使わず、自力で作成しています。その方が概念的な理解が進むと個人的に思っています。ということで、まずは結論から。今回は、このようなコードを記入することで実装させることができました。
<?php
$categories = get_the_category($post->ID); //ループの外で投稿のカテゴリーを取得
$category_ID = array();
foreach ($categories as $category) :
array_push($category_ID, $category->cat_ID);
endforeach;
$args = array(
‘post__not_in’=>array($post->ID),
‘posts_per_page’=>3,
‘category__in’=> $category_ID,
‘orderby’=>’rand’,
);
$my_query = new WP_Query($args);
if ($my_query->have_posts()) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<li class=”related-item”>
<?php if (has_post_thumbnail()) { ?>
<?php echo get_the_post_thumbnail($post->ID, ‘custom’); ?>
<?php } else { ?>
<img src=”<?php bloginfo(‘template_url’); ?>/images/no-image.gif”>
<?php } ?>
<a href=”<?php the_permalink(); ?>” rel=”bookmark” title=”<?php the_title_attribute(); ?>”><?php echo wp_trim_words(get_the_title(), 34); ?></a>
</li>
<?php endwhile;
wp_reset_query(); ?>
<?php } else { ?>
<p class=”no-related”>記事はありませんでした</p>
<?php }
?>
いつものごとくベタっと貼り付けました。もっと見やすく分かりやすく貼りたいんですが、それは今後の課題ということで。あくまで忘備録をかねたアウトプットなので、それなりの知見がついてからリライトしていきたいと思います。
今回も相変わらずググって色々なブログサイトを参考にしながら作成しました。今回実装した機能については、テンプレートファイル(single.php)にベタ書きしても良いのですが、可読性が下がることから異なるファイルを作成して上記のコードを記入し、テンプレートファイルの表示させたい箇所で読み込ませて表示させる手法を取っています。
コード全体の流れ
get_the_category関数で投稿のカテゴリーを配列で取得 → foreach関数で取得したカテゴリーのIDを取得? → サブループの準備 → WP_Queryでインスタンスを作成してお決まりのループ処理で掃き出して出力
みたいなイメージで理解しました。相変わらずの言葉足らず・・・。
実装にあたってのポイント
・get_the_category関数
・’post__not_in’を指定して、指定された投稿は取得せず、その投稿のIDを配列で持たせる
・’orderby’=>’rand’を指定して投稿をランダムで並び替える
この3点が今回の実装の肝の部分かなという感想。
get_the_categoryとは何者なのか
コーデックスによると
オブジェクト(カテゴリー)の配列を返し、各オブジェクトは現在の投稿が属するカテゴリーを表します。このタグはパラメータとして投稿IDを渡すことで、ループの外でも使うことができます。
とのこと。
基本の使い方は
<?php get_the_category($id); ?>
ということで、配列として返ってくるから、それを繰り返し処理して各カテゴリーへのリンクを作成したり、投稿IDを使ってカテゴリーの画像を表示したりと言った使い方ができると。まあ、言われればなんとなくわからないでもない話。
戻り値の中身としては、
- term_id (整数)カテゴリーID
- name (文字列)カテゴリー名
- slug (文字列)カテゴリーのスラッグ
- term_group (整数)カテゴリーのグループ
- term_taxonomy_id (整数)カテゴリーのタクソノミーID
- taxonomy(文字列)タクソノミー名
- description (文字列)カテゴリーの説明
- parent (整数)親カテゴリーのID
- count (整数)カテゴリーに登録されている投稿の数
- object_id (整数)オブジェクトID
- cat_ID (整数)カテゴリーID
- category_count (整数)カテゴリーに登録されている投稿の数
- category_description (文字列)カテゴリーの説明
- cat_name (文字列)カテゴリー名
- category_nicename (文字列)カテゴリースラッグ名(カテゴリー名から生成されたスラッグ)
- category_parent (整数)親カテゴリーのID
ということで沢山ありました。きっと普段使いするのは3つくらいだと思うけど、、、こんなにもあるんだということを知れただけでも良しとしよう。
今回も非常にざっくりとした感じだけど、ただのコピペで終わらないようにすることが大切だと思ってます。懲りずにこれからも投稿を続けて行こうと思いますので、引き続きよろしくお願いします。そんな感じ。以上!
おしまい。