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

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

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

[business_backbone]

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();

コメント

  1. rose より:

    投稿記事を参考にさせていただいております。

    一点お聞きしたいのですが、

    foreach ( $posts_array as $post ) : setup_postdata( $post );
    $post_id = $post->ID;
    $id_array[] = $post->ID;
    endforeach;
    のなかで

    $post_id = $post->ID;
    の記述をする意味合いを教えていただけないでしょうか。
    よろしくお願いいたします。

    • LibertyDock より:

      $post->IDを、なぜか変数に一旦入れてました。
      理由は自分でもわかりかねます。
      ミスのご指摘ありがとうございました。

      消しておきます。

タイトルとURLをコピーしました