wordpressのwp_queryのループで最新投稿20件だけをランダムさせ9件表示させる方法

最新の投稿20件だけをランダムにさせ、さらにループで表示させる投稿は数は9件だけにしてほしいという要望がありました。

こんなループの出力のさせ方をして何かサイトに良い影響を与えるのかどうかはわかりませんが、要望があったならやるしかありませんね。

wp_queryでorderbyの指定を複数する方法があるのか?

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

よく読んでみても日本語がすこし難しいですが、orederby orderの複数指定ができると書いてある。たぶんパラメーターの中の配列ごとに並び順が設定できるんだと思います。

最新の投稿20件のパラメーター設定は、

'orderby' => 'date',
'posts_per_page' => 20,

となりますが、9件のランダム表示は、

'orderby' => 'rand',
'posts_per_page' => 9,

となります。

この2つのwp_queryのパラメーター設定を一つのループ内に同居させるためにはどうしたら良いのか?

配列を使ったwp_query の設定方法

wp_queryのパラメーターには配列を使った設定方法もあります。

'post__in' =>arry(1,2,3,4),

これは記事ID1,2,3,4の4つだけをループさせることになります。

ならここの配列部分を、最新の記事ID20件にすればいいのです。

$args = array(
    'post__in' => arry(最新の記事20件の記事ID).
    'orderby' => 'rand',
    'posts_per_page' => '9',
);
$query1 = new WP_Query( $args );

これで最新の記事20件の記事だけをランダムさせて9件表示させることができます。

最新の記事20件の記事IDを配列で取得する

post__in' で設定するための配列を動的に取得するためにはget_postsを使って配列を取得します。

$args = array(
    'posts_per_page'   => 20,
   // 'orderby' => 'date'
);
$posts_array = get_posts( $args );

foreach ( $posts_array as $post ) : setup_postdata( $post );
    $id_array[] = $post->ID;
endforeach;

wp_queryを使わない場合のループ処理にget_potsからのforeachhを使うので、とく見かけると思います。foreachでループさせるのは記事IDだけで、ループさせた記事IDすべて配列にブチ込んでいます。

ちなみにorderby' => 'date'はデフォルトなので、記述する必要はありません。

取得した配列$id_arrayを使ってwp_queryを使う。

$args = array(
    'post__in' => $id_array,
    'orderby' => 'rand',
    'posts_per_page' => '9',
);
$query1 = new WP_Query( $args );
while ( $query1->have_posts() ) {
    $query1->the_post();
    //ループさせる内容
    echo '<p>' . get_the_title() . '</p>';
}
wp_reset_postdata();

get_potsを使って取得した配列から使いたい内容だけを取り出すことができるようになると、wordpressの幅がかなり広がります。この配列はオブジェクト型となっていますので$post->ID;のような感じでアロー演算子を利用すればデータを取り出すことができるのです。

まとめ

<?php
//最新の投稿20件の配列を取得
$args = array(
    'posts_per_page'   => 20,
    //'orderby' => 'date'
);
$posts_array = get_posts( $args );
foreach ( $posts_array as $post ) : setup_postdata( $post );
    $id_array[] = $post->ID;
endforeach;
wp_reset_postdata();
    
//取得した配列を使ってwq_queryでループさせる
$args = array(
    'post__in' => $id_array,
    'orderby' => 'rand',
    'posts_per_page' => '9',
);
$query1 = new WP_Query( $args );
while ( $query1->have_posts() ) {
    $query1->the_post();
    //ループの内容
    echo '<p>' . get_the_title() . '</p>';
}
wp_reset_postdata();

正社員という奴隷制度に中指を立てるWebエンジニアです。PHPが得意。繋がれた鎖を断ち切るために、自由を取り戻すために、プログラミングスキルを磨く日々です。プログラミングと個人でもできるビジネスについて、情報発信しています。

詳しくはこちら