WordPressカスタマイズで、投稿個別ページなどに関連記事やおすすめ記事をランダムで表示する方法を紹介します。
Contents
複数記事をランダムで取得・表示
記事一覧を取得するために、WP_Query
を使います。
<?php
$args = array(
'post_type' => 'post', // 投稿タイプ
'posts_per_page' => 6, // 取得する件数
'orderby' => 'rand' // ランダムで記事を取得
);
$my_query = new WP_Query($args);
?>
<div class="c-posts c-posts--col2">
<?php if ($my_query->have_posts()) :
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<!-- ここにコンテンツ -->
<?php endwhile;
wp_reset_postdata();
endif; ?>
</div>
WP_Query()
の引数で以下を指定すると、最新の投稿からn件取得できます。
- post_type:投稿タイプ(postは投稿)
- posts_per_page:取得件数(全件取得したい場合は-1)
- orderby:取得した投稿の並び順を指定(randでランダム取得)
コンテンツ出力部分では、通常のループと同様the_title()
やthe_content()
などのテンプレートタグが使えます。
特定カテゴリの記事のみに限定して取得・表示
上記は投稿タイプのみを指定していましたが、カテゴリやタグを絞って取得することももちろん可能です。以下を引数$args
に追加してください。
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'rand',
'tax_query' => array(array(
'taxonomy' => 'category', // タクソノミー(カテゴリ、タグ、カスタムタクソノミーなど)
'field' => 'slug', // タクソノミーの指定方法
'terms' => 'wordpress' // ターム名
)),
);
tax_query
でタクソノミーを指定しました。上記は投稿カテゴリのスラッグ「wordpress」の記事を取得しています。
具体的な指定内容は以下です。
- taxonomy:タクソノミーを指定
- field:タクソノミーを指定する方法(term_id, name, slug, term_taxonomy_idが使えます。)
- terms:具体的なターム名
現在表示している記事以外をランダムで取得・表示
WP_Queryでは、最新記事から順に取得されます。
これをランダムで、かつ投稿個別ページで表示している記事を除いて取得する方法を紹介します。
上記までの引数$args
(取得条件)に、以下を追加してください。
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'rand',
'tax_query' => array(array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $category
)),
'post__not_in' => array($post->ID) // 現在表示している記事は除く
);
post__not_in
は特定の記事だけ除外するパラメータです。ここでarray($post->ID)
を指定すると、現在表示している記事が除外されます。
【まとめ】関数にまとめる
最後は上記内容をfunctions.phpに移動しておきます。
// 投稿個別ページ > おすすめ記事を取得
// ---------------------------------------
function get_recommend_posts($category, $post)
{
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'rand',
'tax_query' => array(array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $category
)),
'post__not_in' => array($post->ID)
);
$my_query = new WP_Query($args);
return $my_query;
}
今回は以上です!