Ce que j'essaie de faire, c'est de définir 2 boucles sur une page. Le premier prend les 11 derniers messages et les trie par ordre aléatoire. Second Affiche le reste des messages classés par date.
PREMIÈRE BOUCLE
$args = array('posts_per_page' => 11,'orderby' => 'Rand' , 'order' => 'ASC');
$loop = new WP_Query($args);
$do_not_duplicate[] = $post->ID;
while ($loop-> have_posts()) : $loop->the_post();
$do_not_duplicate[] = $post->ID;
DEUXIÈME BOUCLE
$args2 = array('posts_per_page' => 22, 'paged' => $paged, 'post__not_in' => $do_not_duplicate, 'orderby' => 'date', 'order' => 'ASC', 'max_num_pages' => 5);
$loop2 = new WP_Query($args2);
while ($loop2-> have_posts()) : $loop2->the_post();
Mon problème est que la deuxième boucle doit afficher les mêmes publications dans le même ordre après chaque actualisation, malheureusement ce n'est pas le cas. Aucun conseil?
Avec quelques indices de @PieterGoosen, j'ai trouvé une solution qui fonctionne.
Première boucle
$argsR = array(
'numberposts' => 11,
'fields' => 'ids'
);
$latest_posts = get_posts( $argsR );
shuffle( $latest_posts );
$args = array('posts_per_page' => 11,
'post__in' => $latest_posts ,
'orderby' => 'post__in',
'order' => 'ASC');
$loop = new WP_Query($args);
$do_not_duplicate[] = $post->ID;
while ($loop-> have_posts()) : $loop->the_post();
$do_not_duplicate[] = $post->ID;
Ainsi, la première boucle affiche les 11 publications les plus récentes dans un ordre aléatoire et pousse chaque ID de publication dans $do_not_duplicate[]
array que j'utilise pour exclure les publications les plus récentes de la deuxième boucle.
Deuxième boucle
$args2 = array(
'posts_per_page' =>-1,
'post__not_in' => $do_not_duplicate,
'orderby' => 'date',
'order' => 'ASC');
$loop2 = new WP_Query($args2);
$num_of_posts = $loop->post_count;
while ($loop2-> have_posts()) : $loop2->the_post();
Avoir deux boucles séparées me permet de paginer la deuxième liste de publications selon mes besoins.
Oui, n'oubliez pas la <?php wp_reset_postdata(); ?>
entre les boucles. Je me souviens de m'être retrouvé coincé là-dessus la première fois que j'ai exécuté plusieurs requêtes sur une page.
Obtenir des publications au hasard est assez coûteux et devrait être évité si nécessaire. Je pense que nous pouvons le faire mieux.
Permet d’interroger tous les articles à la fois, peu importe, triés par date. WE interrogera uniquement les ID qui devraient être extrêmement rapides
Stocke les résultats de la requête ( post-ID ) dans deux variables
Mélangez le seul tableau d'identifiants pour les randomiser, puis récupérez les 11 premiers identifiants
Nous allons ensuite supprimer ces 11 identifiants du second tableau et obtenir 22 identifiants.
Fusionner les deux tableaux et exécuter notre dernière requête
Essayons le code suivant
$args = [ // ADJUST THESE AS NEEDED
'posts_per_page' => -1,
'order' => 'ASC',
'fields' => 'ids' // Only get post ID's, this also bypass object caches
];
$array_1 = $array_2 = get_posts( $args );
// Make sure we have posts and we have more than 11 posts
if ( $array_1
&& 11 < count( $array_1 )
) {
// Shuffle the first array
shuffle( $array_1 );
// Get the first 11 entries sorted randomly
$array_1_random = array_slice( $array_1, 0, 11 );
// Remove the entries from $array_1_random from $array_2
$difference = array_diff( $array_2, $array_1_random );
// Get the first 22 entries from $difference
$diff_22_IDs = array_slice( $difference, 0, 22 );
// Merge the two arrays, $array_1_random and $diff_22_IDs
$ids = array_merge( $array_1_random, $diff_22_IDs );
// Now that we have our ID's sorted to suite our needs, query the posts
$last_args = [ // DO NOT ADJUST THESE, SHOULD BE FINE
'post__in' => $ids,
'orderby' => 'post__in',
'order' => 'ASC',
'posts_per_page' => count( $ids )
];
$q = new WP_Query( $last_args );
// Output your loop
while ( $q->have_posts() ) {
$q->the_post();
the_title();
}
wp_reset_postdata(); // VERY VERY IMPORTANT
}
Ajustez le code si nécessaire. Vous devriez cependant changer quoi que ce soit dans $last_args
Vous avez dit que vous aviez besoin d'une page. Il n'est donc pas nécessaire de définir le paramètre paged
car nous ne paginerons pas. Si vous avez besoin de pagination, vous devrez ajuster légèrement mon code
'max_num_pages'
n'est pas un paramètre valide
La deuxième requête n’affichera pas toujours les mêmes publications, car elle dépend de la première requête, qui est aléatoire.
Par exemple, vous avez 50 articles (ID 1 à 50, classés par date).
Première exécution:
La première requête prend 1,2,3,4,5,6,7,8,9,10,11 et transmet ces identifiants à la seconde requête. La seconde requête affichera 12,13,14, ...
Deuxième manche:
La première requête sélectionne de manière aléatoire les identifiants 39,40,41,42,43,44,45,46,47,48,49,50 et la seconde requête renverra les identifiants 1-22.
Veillez également à appeler wp_reset_postdata()
pour vous assurer du comportement correct de toutes les requêtes. (merci @PieterGoosen :))