É possível paginar corretamente as mensagens que são ordenadas aleatoriamente?

27

Eu encontrei este problema no Wordpress Support e o tópico infelizmente está encerrado. Eu tenho esse mesmo problema ... (leia abaixo)

Criamos um site onde os membros podem recomendar coisas como livros favoritos, filmes, músicas etc. Para esse problema, usarei a página "Filmes" como exemplo.

A página "Filmes" é basicamente um modelo de página personalizado que pede ao wordpress para exibir uma lista aleatória de TODAS as postagens que receberam a categoria "filmes" (categoria 31). Exibe o título desses filmes em ordem aleatória usando o código abaixo.

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

O problema é que a lista está ficando bastante longa e eu gostaria de dividi-la em duas ou mais páginas de cerca de 10 filmes cada. Para conseguir isso, usei o código abaixo.

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

Mas há um problema porque, embora divida os dados em páginas de 10 postagens cada (paginatos), ele não inclui um novo conjunto de 10 postagens na página 2 e assim por diante. Em outras palavras, porque está listando as coisas em uma ordem aleatória, ele apenas sai e recebe outros 10 posts aleatórios (ou, no caso, títulos de filmes). Como resultado, temos algumas postagens de títulos de filmes repetidos em vez de um novo conjunto de 10 títulos de filmes aleatórios na página 2, etc.

A minha pergunta é - o que posso adicionar a este código para obter o wordpress para "lembrar" quais 10 mensagens aleatórias foram incluídas na página 1 e, em seguida, obter um novo conjunto de 10 publicações para colocar nas páginas 2, 3 e etc. até que todas as postagens sejam exibidas. Eu gostaria que houvesse apenas uma ocorrência de uma postagem por página quando classificada aleatoriamente em conjuntos de 10.

    
por user9604 20.10.2011 / 20:59
fonte

2 respostas

36

Você pode usar um filtro para modificar a instrução ORDER BY de WP_query.

Dessa forma, você pode definir manualmente a consulta para usar ORDER BY RAND ($ seed);

Mysql RAND () aceita uma semente como um argumento opcional. Usando uma semente, ele retornará o mesmo conjunto de resultados aleatórios a cada vez.

Assim, você pode gerar um número aleatório no primeiro carregamento da página e, em seguida, armazená-lo em uma variável SESSION e usá-lo como $ seed para outras solicitações paginadas.

Se você está tentando conseguir isso no seu loop principal, por exemplo, você pode adicionar o seguinte ao seu arquivo 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;
}
    
por Nick Ryall 09.11.2011 / 09:35
fonte
2

Desde as últimas versões do WordPress, agora você pode adicionar uma semente ao valor do parâmetro orderby de WP_Query :

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

$seed é um número aleatório. Você deve armazená-lo como uma variável de sessão do PHP. Não se esqueça de ativar a sessão PHP no WordPress chamando session_start() em você functions.php :

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

Com esta sintaxe, não é necessário usar o filtro posts_orderby . Além disso, você não precisa garantir que o filtro seja aplicado apenas à WP_Query de destino.

Para mais informações, leia este ticket no WordPress Core.

    
por Guicara 21.07.2017 / 15:31
fonte