È possibile impaginare correttamente i post ordinati in modo casuale?


30

Ho riscontrato questo problema sul supporto di Wordpress e l'argomento purtroppo ora è chiuso. Ho questo stesso problema ... (leggi sotto)


Abbiamo creato un sito in cui i membri possono consigliare cose come libri preferiti, film, canzoni, ecc. Per questo problema userò la pagina Film come esempio.

La pagina "Film" è in definitiva un modello di pagina personalizzato che chiede a wordpress di visualizzare un elenco casuale di TUTTI i post a cui è stata assegnata la categoria "film" (categoria 31). Visualizza il titolo di questi film in ordine casuale usando il codice qui sotto.

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

Il problema è che l'elenco sta diventando piuttosto lungo e vorrei dividerlo in due o più pagine di circa 10 film ciascuna. Per raggiungere questo obiettivo, ho usato il codice qui sotto.

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

Ma c'è un problema perché, sebbene divida i dati in pagine di 10 post ciascuno (impaginati), non riesce a includere un nuovo set di 10 post a pagina 2 e così via. In altre parole, poiché elenca le cose in un ordine casuale, esce e ottiene altri 10 post casuali (o in questo caso titoli di film). Di conseguenza, abbiamo alcuni post di titoli di film ripetuti invece di un nuovo set di 10 titoli di film casuali a pagina 2, ecc.

La mia domanda è: cosa posso aggiungere a questo codice per ottenere wordpress per "ricordare" quali 10 messaggi casuali ha incluso nella pagina 1, e quindi avere un nuovo set di 10 post da mettere nelle pagine 2, 3, ecc. Fino a vengono visualizzati tutti i post. Vorrei che ci fosse una sola occorrenza di un post per pagina quando ordinato in modo casuale in set di 10.

Risposte:


38

È possibile utilizzare un filtro per modificare l'istruzione ORDER BY di WP_query.

In questo modo è possibile impostare manualmente la query per utilizzare ORDER BY RAND ($ seed);

Mysql RAND () accetta un seme come argomento facoltativo. Usando un seme, restituirà ogni volta lo stesso set di risultati randomizzato.

Quindi è possibile generare un numero casuale al primo caricamento della pagina, quindi memorizzarlo in una variabile SESSION e utilizzarlo come $ seed per ulteriori richieste impaginate.

Se stai provando ad ottenere questo risultato sul tuo ciclo principale, ad esempio, potresti aggiungere quanto segue al tuo file 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;
}

soluzione perfetta grazie mille
Faisal Ramzan,

4

Dalle ultime versioni di WordPress, ora puoi aggiungere un seed al valore del orderbyparametro di WP_Query:

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

$seedè un numero casuale. Dovresti memorizzarlo come variabile di sessione PHP. Non dimenticare di abilitare la sessione PHP in WordPress chiamando session_start()in te functions.php:

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

Con questa sintassi non è necessario utilizzare il posts_orderbyfiltro. Inoltre, non è necessario assicurarsi che il filtro sia applicato solo al WP_Query di destinazione.

Per ulteriori informazioni, leggi questo ticket su WordPress Core.


la risposta potrebbe essere tecnicamente corretta, ma fa schifo. si prega di modificare e spiegare il perché di esso invece di inviare persone a RTFM
Mark Kaplun il

Ho modificato la mia risposta per spiegare perché potrebbe essere una scelta migliore invece di utilizzare un filtro in questo caso particolare.
Guicara,

+1 in ritardo, ma i cookie dovrebbero essere utilizzati al posto delle sessioni. in pratica le sessioni non dovrebbero mai essere utilizzate in quanto sono troppo problematiche in tutti i modi.
Mark Kaplun,

aiutato molto .. grazie
Faisal Ramzan l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.