у sql RAND() есть аргумент seed, который дает возможность "1" раз перемешать посты и всегда возвращать необходимую последовательность.
Один из примеров:
<?php
// functions.php
add_action('wp_ajax_load_more_posts', 'load_more_posts_callback');
add_action('wp_ajax_nopriv_load_more_posts', 'load_more_posts_callback');
function load_more_posts_callback() {
if (!isset($_SESSION['random_seed'])) {
$_SESSION['random_seed'] = rand(1, 999999);
}
$seed = $_SESSION['random_seed'];
add_filter('posts_orderby', function($orderby) use ($seed) {
return "RAND($seed)";
});
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => isset($_POST['page']) ? intval($_POST['page']) : 1,
);
$q = new WP_Query($args);
$output = '';
if ($q->have_posts()) {
while ($q->have_posts()) {
$q->the_post();
$output .= '<h2>' . get_the_title() . '</h2>';
}
}
wp_send_json(array(
'posts' => $output,
'seed' => $seed,
));
wp_die();
}
?>