¿Es posible paginar correctamente las publicaciones ordenadas al azar?

27

Encontré este problema en el Soporte de Wordpress y desafortunadamente el tema ahora está cerrado. Tengo este mismo problema ... (leer más abajo)

Hemos creado un sitio donde los miembros pueden recomendar cosas como libros favoritos, películas, canciones, etc. Para este problema, usaré la página de Películas como ejemplo.

La página "Películas" es, en última instancia, una plantilla de página personalizada que le pide a wordpress que muestre una lista aleatoria de TODAS las publicaciones a las que se les ha otorgado la categoría "películas" (categoría 31). Muestra el título de estas películas en orden aleatorio usando el código a continuación.

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

El problema es que la lista es bastante larga y me gustaría dividirla en dos o más páginas de aproximadamente 10 películas cada una. Para lograr esto, he usado el siguiente código.

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

Pero hay un problema porque aunque divide los datos en páginas de 10 publicaciones cada una (páginas), no incluye un nuevo conjunto de 10 publicaciones en la página 2 y así sucesivamente. En otras palabras, debido a que enumera las cosas en un orden aleatorio, solo sale y obtiene otras 10 publicaciones aleatorias (o en este caso, títulos de películas). Como resultado, tenemos algunas publicaciones repetidas de títulos de películas en lugar de un nuevo conjunto de 10 títulos de películas al azar en la página 2, etc.

Mi pregunta es: ¿qué puedo agregar a este código para hacer que wordpress "recuerde" las 10 publicaciones aleatorias que incluyó en la página 1, y luego obtener un nuevo conjunto de 10 publicaciones para colocar en las páginas 2, 3, etc. hasta que se muestren todas las publicaciones. Me gustaría que solo haya una aparición de una publicación por página cuando se clasifica aleatoriamente en grupos de 10.

    
pregunta user9604 20.10.2011 - 20:59

2 respuestas

36

Puede usar un filtro para modificar la sentencia ORDER BY de WP_query.

De esa manera, puede configurar manualmente la consulta para usar ORDER BY RAND ($ seed);

Mysql RAND () acepta una semilla como un argumento opcional. Usando una semilla, devolverá el mismo conjunto de resultados aleatorios cada vez.

Por lo tanto, puede generar un número aleatorio en la primera carga de la página y luego almacenarlo en una variable SESSION y usarlo como $ semilla para otras solicitudes paginadas.

Si está intentando lograr esto en su bucle principal, por ejemplo, podría agregar lo siguiente a su archivo 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;
}
    
respondido por el Nick Ryall 09.11.2011 - 09:35
2

Desde las últimas versiones de WordPress, ahora puedes agregar una semilla al valor del parámetro orderby de WP_Query :

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

$seed es un número aleatorio. Debe almacenarlo como una variable de sesión de PHP. No olvides habilitar la sesión de PHP en WordPress llamando a session_start() en ti functions.php :

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

Con esta sintaxis no es necesario usar el filtro posts_orderby . Además, no tiene que asegurarse de que el filtro solo se aplique a la WP_Query objetivo.

Para obtener más información, lea este ticket en WordPress Core.

    
respondido por el Guicara 21.07.2017 - 15:31

Lea otras preguntas en las etiquetas