Est-il possible de paginer correctement les publications qui sont commandées au hasard?

27

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

Nous avons créé un site sur lequel les membres peuvent recommander des choses comme des livres, films, chansons, etc., préférés. Pour ce problème, je vais utiliser 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 TOUS les messages auxquels la catégorie "films" a été attribuée (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 est de plus en plus longue et je voudrais la scinder en deux pages ou plus de 10 films environ. Pour ce faire, 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, même s'il divise les données en pages de 10 articles chacun (paginé), il ne parvient pas à inclure un nouvel ensemble de 10 articles à la page 2, etc. En d’autres termes, parce qu’il énumère les choses dans un ordre aléatoire, il sort et reçoit 10 autres messages au hasard (ou dans ce cas, des titres de films). Par conséquent, nous avons plusieurs messages de titre de film répétés au lieu d’un nouvel ensemble de 10 titres de film aléatoires à la page 2, etc.

Ma question est la suivante: que puis-je ajouter à ce code pour que wordpress "se souvienne" des 10 messages aléatoires qu'il a inclus à la page 1, puis qu'il reçoive une nouvelle série de 10 messages à mettre aux pages 2, 3, etc. jusqu'à ce que tous les messages soient affichés. Je souhaite qu’il n’y ait qu’une seule occurrence d’un message par page lorsqu’il est trié aléatoirement par ensembles de 10.

    
posée user9604 20.10.2011 - 20:59

2 réponses

36

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 qu'elle utilise ORDER BY RAND ($ seed);

Mysql RAND () accepte une graine comme argument facultatif. En utilisant un germe, il retournera le même jeu de résultats aléatoires à chaque fois.

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

Si vous essayez d’obtenir ce résultat sur votre boucle principale, par exemple, 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;
}
    
réponse donnée Nick Ryall 09.11.2011 - 09:35
2

Depuis les dernières versions de WordPress, vous pouvez maintenant ajouter une valeur de départ à la valeur du paramètre orderby de WP_Query :

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

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

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

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

Pour plus d'informations, veuillez consulter ce billet sur WordPress Core.

    
réponse donnée Guicara 21.07.2017 - 15:31

Lire d'autres questions sur les étiquettes