jblog: news e appunti per webmaster
 

Logo WordpressUn 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(__('&laquo; Older Entries', 'kubrick')); ?></div>
		<div class="alignright"><?php previous_posts_link(__('Newer Entries &raquo;', '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! ;-)

Articoli correlati
Articoli casuali (stesse categorie)
Commenti
Trackbacks
.1
5 Giugno 2009 alle 14:55

molto interessante..proprio quello che stavo cercando ;-)

.2
stradino
6 Giugno 2009 alle 17:51

Che dire, grazie di tutto, disponibilità impegno e pazienza che hai avuto!
Non è facile trovare gente così disponibile oggigiorno, veramente un sentito ringraziamento.
Si dice che nella vita si raccoglie ciò che si semina, io te lo auguro perchè ne hai solo che da guadagnare!
Dal canto mio, rimango a tua disposizione per poter ricambiare il favore, magari in altri settori nei quali capisco qualcosa in più ;)

.3
6 Giugno 2009 alle 20:04

Quando è possibile non c’è niente di meglio che aiutare gli altri. Alla prossima!

.4
7 Giugno 2009 alle 10:54

Ottima risoluzione Giacomo!

.5
16 Dicembre 2009 alle 17:18

ciao giacomo… innanzitutto grazie per la guida e le conoscenza che metti a disposizione di tutti ;)

ho provato ad utilizzare il tuo script ma non ci sono riuscito… riusciresti a darmi na mano…? o anche a segnalrmi un plugin che faccia proprio questo: il random dei post diviso per categoria…

ti ringrazio ;)

.6
16 Dicembre 2009 alle 17:29

@fab77: ok, non c’é problema! ;-)
Però non ho capito bene cosa vuoi fare.
Potresti spiegamelo meglio perfavore?

“Index.php” stampa la lista degli ultimi X post.
“Archive.php” stampa la lista degli ultimi X post appartenenti a un certo autore, tag, categoria, anno, mese, giorno.
In questo articolo fornisco delle righe di codice per ordinare i modo casuale i post della pagina archive.php, e in particolare quelli relativi alle categorie.
E’ questo che vuoi fare o c’è altro?

.7
16 Dicembre 2009 alle 18:28

Grazie giacomo per la risposta…
esatto è proprio questo che voglio fare… vorrei rendere la pagina della “singola” categoria (quindi lavorando su archive.php) con una visualizzazione dei post a random esattamente il tuo esempio, ma a me non funge… sicuramente colpa mia ;)

.8
16 Dicembre 2009 alle 18:58

@fab77: bene, allora si risolve tutto in 3 passaggi.

Non so se conosci bene php, quindi scusami se ti spiegherò anche gli aspetti basilari…

(1) Copia il primo codice nel file functions.php.
Per non sbagliare incollala alla fine.
Attenzione: è una funzione php quindi dovresti metterla prima di “?>”, il tag che indica la chiusura del codice php.

(2) Copia questo codice
< ?
// Ordinamento casuale (se id categoria è positivo)
if(get_query_var('cat')>0)
jblog_orderbyRand();
?>

e incollalo all’inizio di archive.php.

(3) Impedisci che venga visualizzato l’elenco delle pagine.
Dato che con questo script non è possibile dividere i post casuali in pagine è bene non visualizzare il codice html relativo all’elenco delle pagine.

Quindi individua il div con l’attributo class “navigation”.
Cancella tutto quel blocco di codice html e sostituiscilo con l’ultimo codice di questo articolo (quello del paragrafo “svantaggio: bla bla bla”).
__

Fai attenzione ai tag html e php, e dovrebbe filare tutto liscio.

Se non funziona e non hai fretta risolveremo in altri modi.
Fammi sapere com’é andata! :-)

.9
17 Dicembre 2009 alle 11:22

niente… ho fatto tutto come mi hai descritto
funziona il random ma mi mixa tutte le categorie purtroppo!!

.10
5 Gennaio 2010 alle 16:00

perfetto ragazzi tutto risolto alla grande!!!

anche ovviamente al supporto ed alla disponibilità (infinita…. ;) ) di giacomo!

Puoi usare questi tag:   <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

ATTENZIONE. Se inserisci più di 2 link il commento verrà messo in coda, quindi non sarà visibile subito.

jblog: news e appunti per webmaster