web-dev-qa-db-fra.com

Est-il possible de paginer correctement les publications ordonnées au hasard?

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 où les membres peuvent recommander des choses telles que 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 devient assez longue et je voudrais la scinder en deux pages ou plus d'environ 10 films chacune. 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és), il ne parvient pas à inclure un nouvel ensemble de 10 articles à la page 2 et ainsi de suite. En d’autres termes, comme il énumère les choses dans un ordre aléatoire, il sort et reçoit 10 autres messages au hasard (ou dans ce cas-ci des titres de films). En conséquence, 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 "mémorise" les 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. tous les messages sont affichés. Je souhaite qu’il n’y ait qu’une occurrence d’un article par page lorsqu’il est trié aléatoirement par lots de 10.

28
user9604

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 optionnel. En utilisant un germe, il retournera à chaque fois le même jeu de résultats aléatoire.

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 valeur de départ pour d'autres requêtes paginées.

Si vous essayez de réaliser cela 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;
}
37
Nick Ryall

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 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 lire ce ticket sur WordPress Core.

2
Guicara