Un lettore del blog mi ha contattato per chiedermi di aiutarlo a impostare Wordpress.
In particolare, ha bisogno di ordinare i post in modo casuale nell’archivio di categoria.
Dopo aver spulciato le librerie di Wordpress e aver eseguito un po’ di prove ho sfornato questa funzione che sembra funzionare a dovere.
La classe WP_Query
In Wordpress le query (interrogazioni) al database vengono gestite con la classe WP_Query che si trova in wp-includes/query.php.
Ecco le proprietà e i metodi della classe WP_Query che utilizziamo:
- con il metodo
set($query_var, $value)impostiamo le caratteristiche della query - il metodo
get($query_var)restituisce il valore di una variabile - per eseguire la query utilizziamo la funzione
get_posts()
Tuttavia, questi tre metodi non bastano a modificare l’elenco dei post che verranno visualizzati.
Questo elenco è memorizzato all’interno della proprietà posts (di tipo array) che verrà sovrascritta con l’array restituito dal metodo get_posts(), nell’ultima riga.
Per saperne di più sulla classe WP_Query vai su http://codex.wordpress.org/Function_Reference/WP_Query.
Il codice
function jblog_orderbyRand()
{
global $wp_query;
// Imposta il tipo di ordinamento
$wp_query->set('orderby', 'rand');
// Disabilita la paginazione dei post
$wp_query->set('nopaging', true);
$wp_query->set('posts_per_page', -1);
// Reimposta l'array dei post da stampare
$wp_query->posts = $wp_query->get_posts();
}
Come utilizzare la funzione
Innanzitutto copiamo il codice precedente nel file functions.php (all’interno della directory del template). Se il file non esiste basterà crearlo.
Anche se la necessità originale era quella di modificare l’elenco dell’archivio di categoria, questa funzione è efficace in ogni pagina del blog che contenga un elenco di post, quindi nell’homepage, nell’archivio di tag, ecc.
Per utilizzarla basterà inserirla in testa alla pagina da modificare. Ad esempio, se vogliamo che tutti gli archivi vengano ordinati in modo casuale, dobbiamo aprire il file archive.php del template e inserirla in testa:
<? // Ordinamento casuale
jblog_orderbyRand(); ?>
<? get_header(); ?>
<div id="content" class="narrowcolumn">
<?php if (have_posts()) : ?>
. . .
Se, come nel caso del lettore, si deve ordinare in modo casuale solo l’archivio di categoria scriveremo la funzione all’interno di un costrutto if in cui si controlla che l’archivio sia relativo a una categoria.
Questo controllo si esegue ottenendo l’id della categoria grazie alla funzione get_query_var('cat') che restituisce il valore di una variabile per la query. Nota che quella funzione è equivalente all’istruzione $wp_query->get('cat'). Entrambe restituiscono l’id (di tipo intero) della categoria. Questo sarà maggiore di zero se l’archivio che si sta visualizzando è di categoria.
<? // Ordinamento casuale (se id categoria è positivo)
if(get_query_var('cat')>0)
jblog_orderbyRand(); ?>
<? get_header(); ?>
<div id="content" class="narrowcolumn">
<?php if (have_posts()) : ?>
. . .
Svantaggio: non è possibile dividere i post per pagine
Ogni volta che si carica la pagina viene rigenerato l’elenco e, dato che viene ordinato in modo casuale, i post non vengono adeguatamente distribuiti nelle varie pagine. In pratica è concreto il rischio che dei post apparsi nella pagina 1 possano apparire nuovamente in altre pagine. Per questo motivo viene disabilitata la paginazione.
Inoltre, è necessario applicare un ultima modifica al tema della pagina che ospiterà l’elenco da ordinare in modo casuale. Cioé, è necessario evitare che appaiano i link “post precedenti” e “post successivi”. Nei casi più semplici basterà eliminare il codice relativo a questi link. Se invece l’ordinamento casuale è condizionato (come nel codice precedente) bisognerà applicare le condizioni (contrarie rispetto a quelle relative alla funzione) alla visualizzazione di questi link:
<? // Per la funzione la condizione era get_query_var('cat')>0 (con il ">" anziché "<=")
if(get_query_var('cat')<=0) : ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link(__('« Older Entries', 'kubrick')); ?></div>
<div class="alignright"><?php previous_posts_link(__('Newer Entries »', 'kubrick')); ?></div>
</div>
<? endif; ?>
Serve aiuto?
Come vedi quello che ho scritto nella pagina “Informazioni” riguardo l’aiuto ai lettori non sono solo un mucchio di frasi fatte per riempire una pagina. Quindi se hai bisogno di aiuto o, più semplicemente, di un consiglio ricordati di passare da qui. Finché ne avrò il tempo sarò felice di aiutarti!


