サポート » 使い方全般 » ランダムでorderbyした内容をページングする方法

  • 解決済 fujikake

    (@fujikake)


    ランダムで内容をorderbyし、データを出力するページを作成したいと考えています
    当該ページ作成のため、以下のソースを作成いたしました
    ======================================================
    $paged = get_query_var(‘paged’);
    $terms = array(‘category__and’ => array((int)$cat),
    ‘paged’ => $paged,
    ‘orderby’ => ‘rand’);
    query_posts($terms);
    ======================================================
    しかし上のやり方だと、リクエストする度にランダムで並び変えられてしまい、
    ページング機能が全く意味のないものとなってしまいます
    (2ページ目の内容も1ページ目も含む内容でランダムで取得してくるため)

    取得した値をセッション変数に入れて格納し、ページごとにデータを取り出すやり方なら
    解決はできそうですが、そのためには自力でページング機能を作成しなければいけなくなります
    せっかくWordPressにページング機能があるから、そちらを使った方がスマートとは思いますが、
    ランダムで取得した内容を、WordPresssのページング機能を利用し表示する方法はあるのでしょうか?

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • ためしたことは無いですが、mysqlのrand(n)は効かないんですかね?ここには。

    トピック投稿者 fujikake

    (@fujikake)

    上記試してみました
    ======================================================
    $paged = get_query_var(‘paged’);
    $terms = array(‘category__and’ => array((int)$cat),
    ‘paged’ => $paged,
    ‘orderby’ => ‘rand(10)’);
    query_posts($terms);
    =====================================================
    結果
    randの後の数値を変化させても、表示順に変化なし
    取得結果はorderbyをつけないときと同じ
    よって、上記のやり方では達成できないのではと考えました

    ページングする

    がどういう動作を意図されているか具体的に説明していただくと回答があるかもです。

    トピック投稿者 fujikake

    (@fujikake)

    ありがとうございます

    通常のページング機能として私がイメージしているのは、
    たとえば、1ページ目に

    1,2,3,4,5

    と5まで表示されていた時、次へをクリックしたときには

    6,7,8,9,10

    と表示される仕組みです

    私が意図しているランダムに出力されるページングの機能としましては、

    8,4,5,9,3

    と出力内容がランダム順で表示され、次へをクリックしたとき

    10,1,7,2,6

    と1ページ目に表示されていなかったデータがランダムで表示されます
    このとき、次へをクリックしたときに表示される内容は、
    1ページ目に表示されている内容が表示されないようにします

    kvexさんが回答してくださったように、セッションIDなどより乱数にシードを設定し、
    その人がアクセスしている間はランダム順が変更にならなければ、
    出力内容はセッションごとにランダムになり、ページングしたときも内容が重複しません
    しかし、抽出する際にrandにシードを設定する方法が分かりません

    また、1ページ目で一度全データを取得し、一定件数ごとに配列に入れてセッション変数に格納し、
    2ページ目以降はセッション変数より該当するページのデータを取り出して並べるという手段も考えました
    このやり方だと処理はうまくいくと思いますが、WordPresssにもともとページング機能があるため、一からページングの仕組みを作り直すより、それを使った方がスマートだと思います
    そのため、セッションに入れて扱うやり方は最後の手段にしたいです

    何かよいやりかたがあれば、ご教授いただければ幸いです

    functions.php に以下を追加:

    function my_orderby_request($orderby){
      return 'RAND(10)';
    }

    ループ:

    $paged = get_query_var('paged');
    $terms = array(
      'category__and' => array((int)$cat), // $cat にカテゴリーIDが設定されていること
      /* 'cat' => $cat, */
      'paged' => $paged
    );
    
    add_filter('posts_orderby_request', 'my_orderby_request');
    query_posts($terms);
    remove_filter('posts_orderby_request', 'my_orderby_request');
    if(have_posts()) :
      while(have_posts()) :
        the_post();
        /* do stuff */
      endwhile;
    else :
      /* no post */
    endif;
    wp_reset_query();

    のような感じで OK です。

    トピック投稿者 fujikake

    (@fujikake)

    ありがとうございます
    上記やり方で解決いたしました
    functions.phpはセッションIDをシードに

    function my_orderby_request($orderby){
    	if(session_id() == ""){
    		session_start();
    	}
    	mt_srand(session_id());
      return 'RAND(' . mt_rand() . ')';
    }

    という形にしました。
    お陰さまでなんとか形になりそうです
    本当にありがとうございました

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「ランダムでorderbyした内容をページングする方法」には新たに返信することはできません。