ランダムに並べられた投稿を正しくページネーションすることは可能ですか?


30

Wordpressサポートでこの問題を見つけましたが、残念ながらこのトピックは閉じられました。これと同じ問題があります...(以下をお読みください)


メンバーがお気に入りの本、映画、歌などのようなものを推薦できるサイトを作成しました。この問題のために、例として映画ページを使用します。

「ムービー」ページは、最終的にカスタムページテンプレートであり、ワードプレスに、「ムービー」カテゴリ(カテゴリ31)が付与されたすべての投稿のランダムリストを表示するように要求します。以下のコードを使用して、これらの映画のタイトルをランダムな順序で表示します。

<?php 
$rand = new WP_Query("cat=31&showposts=-1&orderby=rand"); 
while($rand->have_posts()) : $rand->the_post();
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>

問題は、リストがかなり長くなっていることであり、私はそれをそれぞれ約10本の映画の2つ以上のページに分割したいと思います。これを実現するために、以下のコードを使用しました。

<?php 
$page = (get_query_var('paged')) ? get_query_var('paged') : 1; 
query_posts("cat=31&orderby=rand&showposts=10&paged=$page"); 
while ( have_posts() ) : the_post() 
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>

しかし、データを各10ページのページに分割する(ページ区切り)が、2ページ目などに10ポストの新しいセットを含めることができないため、問題があります。言い換えると、それはランダムな順番で物事をリストしているので、外に出て別の10個のランダムな投稿(またはこの場合は映画タイトル)を取得します。その結果、2ページ目のランダムな映画タイトルの10個の新しいセットではなく、映画タイトルの投稿が繰り返されます。

私の質問は、このコードに何を追加すれば、ワードプレスがページ1に含まれるランダムな10個の投稿を「記憶」し、ページ2、3などに配置する10個の投稿の新しいセットを取得できるようにすることです。すべての投稿が表示されます。10のセットでランダムに並べ替えられた場合、ページごとに投稿が1回だけ発生するようにしたいと思います。

回答:


38

フィルターを使用して、WP_queryのORDER BYステートメントを変更できます。

そうすれば、ORDER BY RAND($ seed)を使用するようにクエリを手動で設定できます。

Mysql RAND()は、オプションの引数としてシードを受け入れます。シードを使用すると、毎回同じランダム化された結果セットが返されます。

したがって、最初のページの読み込み時に乱数を生成し、それをSESSION変数に保存して、それをさらにページ分割されたリクエストの$ seedとして使用できます。

たとえば、メインループでこれを達成しようとしている場合、functions.phpファイルに次を追加できます。

session_start();

add_filter('posts_orderby', 'edit_posts_orderby');

function edit_posts_orderby($orderby_statement) {

    $seed = $_SESSION['seed'];
    if (empty($seed)) {
      $seed = rand();
      $_SESSION['seed'] = $seed;
    }

    $orderby_statement = 'RAND('.$seed.')';
    return $orderby_statement;
}

完璧なソリューション。どうもありがとう
ファイサル・ラムザン

4

WordPressの最新バージョン以降、のorderbyパラメーターの値にシードを追加できるようになりましたWP_Query

$query = new WP_Query([
    'orderby' => 'RAND($seed)',
    ...
]);

$seed乱数です。PHPセッション変数として保存する必要があります。WordPressでPHPセッションを有効にすることを忘れないでくださいsession_start()でくださいfunctions.php

if (!session_id()) {
    session_start();
}

この構文を使用すると、posts_orderbyフィルターを使用する必要がありません。さらに、フィルターが対象のWP_Queryにのみ適用されることを確認する必要はありません。

詳細については、WordPress Coreのこのチケットをお読みください。


答えは技術的には正しいかもしれませんが、残念です。
RTFMに

この特定のケースでフィルターを使用するのではなく、なぜより良い選択であることができるかを説明するために、回答を編集しました。
ギカラ

遅い+1ですが、セッションの代わりにCookieを使用する必要があります。セッションはあらゆる種類の点で問題が多すぎるため、基本的に使用しないでください。
マーク・Kaplun

たくさん助けてくれました。ありがとう
ファイサル・ラムザン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.