Ist es möglich, Beiträge in zufälliger Reihenfolge korrekt zu paginieren?

30

Ich habe dieses Problem im Wordpress-Support gefunden und das Thema ist jetzt leider geschlossen. Ich habe das gleiche Problem ... (siehe unten)


Wir haben eine Site erstellt, auf der Mitglieder Dinge wie Lieblingsbücher, Filme, Lieder usw. empfehlen können. Für dieses Problem verwende ich die Seite Filme als Beispiel.

Die Seite "Filme" ist letztendlich eine benutzerdefinierte Seitenvorlage, die WordPress auffordert, eine zufällige Liste ALLER Beiträge anzuzeigen, denen die Kategorie "Filme" (Kategorie 31) zugewiesen wurde. Der Titel dieser Filme wird in zufälliger Reihenfolge mit dem folgenden Code angezeigt.

<?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; ?>

Das Problem ist, dass die Liste ziemlich lang wird und ich sie gerne in zwei oder mehr Seiten mit jeweils etwa 10 Filmen aufteilen möchte. Um dies zu erreichen, habe ich den folgenden Code verwendet.

<?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; ?>

Es gibt jedoch ein Problem, da die Daten zwar in Seiten mit jeweils 10 Posts (Paginaten) aufgeteilt werden, jedoch keine neuen 10 Posts auf Seite 2 usw. enthalten sind. Mit anderen Worten, weil es Dinge in einer zufälligen Reihenfolge auflistet, geht es einfach aus und erhält weitere 10 zufällige Beiträge (oder in diesem Fall Filmtitel). Infolgedessen haben wir einige wiederholte Beiträge zu Filmtiteln anstelle von neuen 10 zufälligen Filmtiteln auf Seite 2 usw.

Meine Frage ist - was kann ich zu diesem Code hinzufügen, um WordPress zu veranlassen, sich zu "erinnern", welche 10 zufälligen Posts es auf Seite 1 enthielt, und es dann einen neuen Satz von 10 Posts erhalten zu lassen, die auf den Seiten 2, 3 usw. abgelegt werden sollen, bis Alle Beiträge werden angezeigt. Ich möchte, dass nur ein Beitrag pro Seite auftritt, wenn er zufällig in Zehnersätzen sortiert wird.

user9604
quelle

Antworten:

38

Sie können einen Filter verwenden, um die ORDER BY-Anweisung von WP_query zu ändern.

Auf diese Weise können Sie die Abfrage manuell so einstellen, dass sie ORDER BY RAND ($ seed) verwendet.

Mysql RAND () akzeptiert einen Startwert als optionales Argument. Bei Verwendung eines Startwerts wird jedes Mal dieselbe zufällige Ergebnismenge zurückgegeben.

Sie können also beim Laden der ersten Seite eine Zufallszahl generieren und diese dann in einer SESSION-Variablen speichern und diese als $ seed für weitere paginierte Anforderungen verwenden.

Wenn Sie beispielsweise versuchen, dies in Ihrer Hauptschleife zu erreichen, können Sie Ihrer functions.php-Datei Folgendes hinzufügen.

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;
}
Nick Ryall
quelle
perfekte Lösung. Vielen Dank
Faisal Ramzan
3

Seit den letzten Versionen von WordPress können Sie jetzt einen Startwert zum Wert des orderbyParameters hinzufügen WP_Query:

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

$seedist eine Zufallszahl. Sie sollten es als PHP-Sitzungsvariable speichern. Vergessen Sie nicht, die PHP-Sitzung in WordPress zu aktivieren, indem session_start()Sie Folgendes aufrufen functions.php:

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

Mit dieser Syntax müssen Sie den posts_orderbyFilter nicht verwenden. Darüber hinaus müssen Sie nicht sicherstellen, dass der Filter nur auf die Ziel-WP_Query angewendet wird.

Für weitere Informationen lesen Sie bitte dieses Ticket auf WordPress Core.

Guicara
quelle
Die Antwort mag technisch korrekt sein, aber sie ist scheiße. Bitte redigieren Sie und erklären Sie das Warum, anstatt Leute an RTFM zu schicken
Mark Kaplun
Ich habe meine Antwort bearbeitet, um zu erklären, warum es in diesem speziellen Fall eine bessere Wahl sein könnte, anstatt einen Filter zu verwenden.
Guicara
ein spätes +1, aber Cookies sollten anstelle von Sitzungen verwendet werden. Grundsätzlich sollten Sessions niemals verwendet werden, da sie in jeder Hinsicht zu problematisch sind.
Mark Kaplun
sehr geholfen .. danke
Faisal Ramzan