ためしたことは無いですが、mysqlのrand(n)は効かないんですかね?ここには。
上記試してみました
======================================================
$paged = get_query_var(‘paged’);
$terms = array(‘category__and’ => array((int)$cat),
‘paged’ => $paged,
‘orderby’ => ‘rand(10)’);
query_posts($terms);
=====================================================
結果
randの後の数値を変化させても、表示順に変化なし
取得結果はorderbyをつけないときと同じ
よって、上記のやり方では達成できないのではと考えました
ページングする
がどういう動作を意図されているか具体的に説明していただくと回答があるかもです。
ありがとうございます
通常のページング機能として私がイメージしているのは、
たとえば、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 です。
ありがとうございます
上記やり方で解決いたしました
functions.phpはセッションIDをシードに
function my_orderby_request($orderby){
if(session_id() == ""){
session_start();
}
mt_srand(session_id());
return 'RAND(' . mt_rand() . ')';
}
という形にしました。
お陰さまでなんとか形になりそうです
本当にありがとうございました