Est-il possible de paginer correctement les messages qui sont classés au hasard?

30

J'ai trouvé ce problème sur le support Wordpress et le sujet est malheureusement maintenant fermé. J'ai ce même problème ... (lire ci-dessous)


Nous avons créé un site où les membres peuvent recommander des choses comme des livres préférés, des films, des chansons, etc. Pour ce problème, j'utiliserai la page Films comme exemple.

La page "Films" est finalement un modèle de page personnalisé qui demande à wordpress d'afficher une liste aléatoire de TOUTES les publications qui ont reçu la catégorie "films" (catégorie 31). Il affiche le titre de ces films dans un ordre aléatoire en utilisant le code ci-dessous.

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

Le problème est que la liste devient assez longue et je voudrais la diviser en deux ou plusieurs pages d'environ 10 films chacune. Pour y parvenir, j'ai utilisé le code ci-dessous.

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

Mais il y a un problème car bien qu'il divise les données en pages de 10 articles chacune (pagine), il n'inclut pas un nouvel ensemble de 10 articles à la page 2 et ainsi de suite. En d'autres termes, car il répertorie les choses dans un ordre aléatoire, il s'éteint et reçoit 10 autres publications aléatoires (ou dans ce cas, les titres de films). En conséquence, nous avons des articles de titres de films répétés au lieu d'un nouvel ensemble de 10 titres de films aléatoires à la page 2, etc.

Ma question est - que puis-je ajouter à ce code pour que wordpress se "souvienne" des 10 messages aléatoires qu'il a inclus à la page 1, puis lui faire obtenir un nouvel ensemble de 10 messages à mettre sur les pages 2, 3, etc. jusqu'à tous les messages sont affichés. Je voudrais qu'il n'y ait qu'une seule occurrence d'un article par page lors d'un tri aléatoire par ensembles de 10.

user9604
la source

Réponses:

38

Vous pouvez utiliser un filtre pour modifier l'instruction ORDER BY de WP_query.

De cette façon, vous pouvez définir manuellement la requête pour utiliser ORDER BY RAND ($ seed);

Mysql RAND () accepte une graine comme argument facultatif. En utilisant une graine, il renverra le même ensemble de résultats randomisés à chaque fois.

Vous pouvez donc générer un nombre aléatoire lors du premier chargement de page, puis le stocker dans une variable SESSION et l'utiliser comme graine $ pour d'autres requêtes paginées.

Par exemple, si vous essayez de réaliser ceci sur votre boucle principale, vous pouvez ajouter ce qui suit à votre fichier 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;
}
Nick Ryall
la source
solution parfaite. merci beaucoup
Faisal Ramzan
4

Depuis les dernières versions de WordPress, vous pouvez désormais ajouter une graine à la valeur du orderbyparamètre de WP_Query:

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

$seedest un nombre aléatoire. Vous devez le stocker en tant que variable de session PHP. N'oubliez pas d'activer la session PHP dans WordPress session_start()en vous appelant functions.php:

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

Avec cette syntaxe, vous n'avez pas besoin d'utiliser le posts_orderbyfiltre. De plus, vous n'avez pas à vous assurer que le filtre n'est appliqué qu'à WP_Query ciblé.

Pour plus d'informations, veuillez lire ce ticket sur WordPress Core.

Guicara
la source
la réponse est peut-être techniquement correcte, mais ça craint. veuillez modifier et expliquer le pourquoi de celui-ci au lieu d'envoyer des gens à RTFM
Mark Kaplun
J'ai modifié ma réponse pour expliquer pourquoi cela pourrait être un meilleur choix au lieu d'utiliser un filtre dans ce cas particulier.
Guicara
+1 tard, mais les cookies doivent être utilisés à la place des sessions. fondamentalement, les sessions ne devraient jamais être utilisées car elles sont trop problématiques de toutes sortes de manières.
Mark Kaplun
beaucoup aidé .. merci
Faisal Ramzan