サポート » 使い方全般 » 2つのループで記事が重複せずにランダムで記事を表示させたい

  • 構造上、連続してさせられない2つのループで、記事が重複しないようにランダム表示させたいと思っています。

    2つめのループでは、offsetで1つめのループの件数を引いたら良いかなと思い、

    <!-- ループの部分だけ抜粋 -->
    
    <!-- ランダムで2件表示 -->
    <?php query_posts('showposts=2&orderby=rand'); ?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <h2><?php the_title_attribute(); ?></h2>
    <?php endwhile;endif; ?>
    
    <!-- 1つめのループと重複しないようにランダムで2件表示 -->
    <?php query_posts('showposts=2&orderby=rand&offset=2'); ?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <h2><?php the_title_attribute(); ?></h2>
    <?php endwhile;endif; ?>

    のようにおいてみましたが、重複してしまいました。

    どのように書けば重複しないようにループさせることができるか、
    ご教授いただければ幸いです。
    どうぞよろしくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター Okamoto Hidetaka

    (@hideokamoto)

    oisit

    (@oisit)

    ループの回数を取得する[WordPress]
    php不勉強な者ですが、4つ取得して、ループ中に回数でif文とかだとよろしくない一般的な理由があるのでしょうか。ifで表示する部分が大変かもしれないですが。
    あとwp_queryが推奨されてたような。

    msio

    (@msio)

    query_posts
    メタ的な投稿データの編成につき煩雑で更新の優先度を下げたい関数 = 非推奨
    ・実行速度が遅い
    ・メモリを食う
    ・無駄なデータ連携がなされる

    wp_query
    SQLクエリ構成に近く機能維持に優位性がある関数 = 推奨
    ・シンプル

    なのではないかと思うので早めに乗り換えたほうが良いかもしれないとは思うのですが、ランダム抽出の有効性はpostsのほうの特性な気もするので私には判断することができないのです。
    post__not_in を使って望ましい抽出はできると思います。でもランダムとなるとランダムの母体範囲を指定しなくてはならないと思うのと両立方法が私にはわかっていません。

    2条件併記して重複ということは、タグを複数つけた状態のように「2視点からの抽出を併記したいが、近しい条件のため一部重複記事がある」場合の利用なのではないかと想像しております。
    その場合は、PHPの範疇ではありますがランダマイズした抽出結果の抽出自体の採用条件をランダマイズするという階層構造にするのはどうでしょうか。

    条件1 条件2
    A1   A1 —-重複 条件によっては除外対象
    B2   B2 —-重複 条件によっては除外対象
    C3   B3
    D4   D1
    E5   D2
    F6   E1
    G7   D2

    ア.条件1の重複していないランダム抽出
    C3
    D4
    E5
    F6
    G7

    イ.条件2の重複していないランダム抽出
    B3
    D1
    E1
    D2

    ウ.重複しているランダム
    A1
    B2

    選択肢ランダム
    A.ア.とイ.は相互に重複を含まない
    B.ア.はウ.の1件を含みイ.は重複を含まない
    C.ア.は重複を含まずイ.はウ.の1件を含む

    それぞれの条件結果でランダム表示をしたい範囲を抽出し配列に代入
    配列をshuffle
    撹拌したデータの先頭をA.B.C.それぞれのランダムで選択された内容にそって取り出し掲載する。

    それぞれの全体の条件を確定しながら、確定したものを次の条件の分母から除去していけばいいと思います。
    分母を三つも用意しなくても段階的な処理を1つのプロセス上に乗せるとみため分母変数は一つになるかと思いますが、
    保持しておくデータが選別プロセスのたびに肥大化すると条件定義の要素が変数にも増えて結果メタ的な情報になってしまうかと思います。
    (1つの条件を2度の選別にかけると2度比較データができるので結果5分母分+2条件を満たす演算回数が必要なのではないかと思って)

    候補選択のプロセスで抽出するデータはそれぞれの記事IDだけにしておいて、表示記事が決定するとget_postなどで表示するのはどうでしょうか。

    あとoffsetは抽出結果の開始位置だと思うので以下の条件になっているのではないでしょうか。

    showposts=2&orderby=rand&offset=2
    表示2件 ランダムで 上から2件を = 記事条件に合致する中から起算位置を2とし2~終端のうちの上位2件を表示 = ランダムに並べ替えた記事の3~4を表示

    • この返信は3 ヶ月前に msio さんが編集しました。理由: 自分で出した条件に合致しない表記をしていました…。
    ishitaka

    (@ishitaka)

    こんにちは

    post__not_in を使う方法や単純に if で振り分けるが無難かなと思いますが、ちょうど同じようなことを調べていたので、レスさせてもらいました。

    RAND の値(シード値)に同じ値を指定する方法もあります。

    $rand = rand();
    
    $query1 = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => 2, 'orderby' => "RAND($rand)" ) );
    while ( $query1->have_posts() ) {
    	$query1->the_post();
    	echo '<h2>' . get_the_title() . '</h2>';
    }
    wp_reset_postdata();
    
    $query2 = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => 2, 'orderby' => "RAND($rand)", 'offset' => 2 ) );
    while ( $query2->have_posts() ) {
    	$query2->the_post();
    	echo '<h2>' . get_the_title() . '</h2>';
    }
    wp_reset_postdata();
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • このトピックに返信するにはログインが必要です。