Creare un Tema WordPress – Query personalizzate
Nella precedente lezione abbiamo analizzato le funzionalità base del loop di WordPress, adesso vedremo come filtrare i risultati secondo determinati parametri, per esempio possiamo visualizzare tutti i post di alcuni autori piuttosto che altri oppure di una o più categorie. Questo grazie alla funzione query_post(), che dobbiamo utilizzare solamente per personalizzare il loop principale e non per creare più loop da inserire nella stessa pagina o in altri punti del sito (ad esempio un elenco di ultimi post inseriti nel footer). Se vogliamo aggiungere più loop dobbiamo utilizzare un’altra funzione di cui parlerò tra poco.
Torniamo a query_post(), i parametri vanno inseriti prima del loop. Ad esempio, per visualizzare solo 5 articoli invece del limite impostato nelle opzioni di lettura di WordPress dobbiamo scrivere:
query_posts ('posts_per_page=5'); /*INIZIO DEL LOOP */ if ( have_posts() ) : while ( have_posts() ) : the_post(); /*SERIE DI AZIONI DA ESEGUIRE*/ /*FINE DEL LOOP */ endwhile; else: /*MESSAGGIO DI ERRORE SE NON VIENE TROVATO NESSUN CONTENUTO*/ endif; /*ALLA FINE DEL LOOP CANCELLIAMO LA QUERY UTILIZZATA TRAMITE WP_RESET_QUERY*/ wp_reset_query ();
I tags interni del loop da utilizzare sono gli stessi visti nella precedente lezione. Ritornando a query_post(), per aggiungere nuovi parametri, bisogna separarli tramite una e commerciale ( & ), quindi per visualizzare gli ultimi 5 post della categoria avente come id 1 scriviamo:
query_posts ('posts_per_page=5&cat=1');
Se vogliamo utilizzare più valori per un parametro, ad esempio più categorie, dobbiamo separarli tramite una virgola:
query_posts ('posts_per_page=5&cat=1,2,3,4,5');
Il codice appena scritto visualizzerà gli ultimi 5 post delle categorie con ID 1,2,3,4 e 5, se invece vogliamo escludere uno o più valori di un parametro, dobbiamo aggiungere il prefisso meno prima del valore:
query_posts ('posts_per_page=5&cat=-1,-2');
Il codice appena scritto visualizzerà gli ultimi 5 post di tutte le categorie, tranne quelle aventi ID 1 e 2. Se, invece dell’ID vogliamo impostare il nome della categoria come parametro (Però in questo caso, modificando in un secondo momento il nome della categoria, la query non funzionerà più ed è quindi consigliato utilizzare l’ID come parametro) scriviamo:
query_posts ('posts_per_page=5&cat_name=nomedellacategoria');
Per visualizzare gli ultimi 5 post della categoria con ID 1 e dell’autore con ID 1 scriviamo:
query_posts ('posts_per_page=5&cat=1&author=1');
Per visualizzare gli ultimi 5 post della categoria con ID 1,2 e 3 e degli autori con ID 1,2,3 e 4 scriviamo:
query_posts ('posts_per_page=5&cat=1,2,3&author=1,2,3,4');
WP_Query()
Una lista dettagliata dei parametri che possiamo utilizzare la troviamo cliccando QUI ed è valida anche per quest’altra funzione di cui vi accennavo all’inizio della lezione, quando parlavo della possibilità di creare più loop da utilizzare nella stessa pagina, bene per fare questo dobbiamo utilizzare la funzione WP_Query:
/*QUERY*/ $the_query = new WP_Query( parametri ); /*INIZIO DEL LOOP*/ if ( $query->have_posts() ) : while ( $query-> have_posts() ) : $query->the_post(); /* AZIONI DA ESEGUIRE */ endwhile; else: /*MESSAGGIO DI ERRORE SE NON VIENE TROVATO NESSUN CONTENUTO*/ endif; /*ALLA FINE DEL LOOP CANCELLIAMO LA QUERY UTILIZZATA TRAMITE WP_RESET_QUERY*/ wp_reset_query ();
Come avrete potuto notare, anche l’inizio del loop è diverso, ma le differenze finiscono qui poiché sia i tags all’interno del loop, che l’impostazione dei parametri della query rimangono gli stessi che abbiamo già visto. Ecco qualche altro parametro che certamente ci potrà tornare utile in futuro:
$query = new WP_Query( 'p=4' );
Il parametro che abbiamo impostato visualizzerà il post con ID 4 mentre:
$query = new WP_Query( 'page_id=4' );
Visualizzerà la pagina avente 4 come ID
$query = new WP_Query( 'name = il-mio-articolo' );
Visualizzerà il post avente “il-mio-articolo” come slug, mentre
$query = new WP_Query( 'pagename = la-mia-pagina' );
Visualizzerà la pagina avente “la-mia-pagina” come slug. Un altro parametro molto utile è offset, per poter visualizzare i risultati a partire da un certo valore da noi impostato ad esempio, se il loop ci dà 10 risultati e vogliamo mostrare solo gli ultimi 5, dobbiamo scrivere:
$query = new WP_Query( 'offset = 5' );
Per combinare più parametri, dobbiamo separarli sempre da una e commerciale (&)
$query = new WP_Query( 'posts_per_page=15&offset= 10' );
Per avere al massimo quindici post partendo dall’undicesimo
orderby, serve per ordinare i risultati in base all’ id, autore, titolo, data, data di modifica, numero di commenti, ordine causale, campi personalizzati, post o pagina principale. È possibile visualizzare i risultati sia in ordine crescente (ASC), che descrescente (DESC), quest’ultimo è il valore di default.
Ad esempio, per ordinare i risultati in base al titolo e in ordine crescente, dobbiamo scrivere:
$query = new WP_Query( array ( 'orderby' => 'title', 'order' => 'ASC' ) );
Dalla versione 3.0 di WordPress è possibile creare dei custom post, ovvero dei post personalizzati, ad esempio per creare delle schede di prodotti. Se vogliamo visualizzare i post presenti in “prodotti”, che altro non è che il nome del custom post, dobbiamo utilizzare il parametro post_type, scrivendo:
$query = new WP_Query ( 'post_type=prodotti' );
Invece, per visualizzare i post per data, dobbiamo scrivere:
$query = new WP_Query ( 'year=2012&monthnum=5&day=28&hour=22&minute=30&second=11' );
E visualizzerà tutti i post scritti il 28 Maggio 2012, alle 22:30 e 11 secondi, è possibile anche impostare la settimana dell’anno, da 0 a 53. Ad esempio:
$query = new WP_Query ( 'year=2012&w=1' );
Mostrerà tutti i post scritti la prima settimana del 2012.
Vediamo anche qualche parametro di tassonomia. Quello più semplice sarà scritto in questo modo:
query = new WP_Query( array( 'colore' => 'rosso' ) );
E visualizzerà tutti i post aventi come tassonomia “colore” e valore “rosso”.
Per unire più tassonomie è necessario racchiuderle in un array:
$query = new WP_Query( array( 'colore' => 'rosso', 'materiale' => 'ferro' ) );
In questo modo visualizzeremo i post che hanno come tassonomia “colore” e valore “rosso” e tassonomia “materiale” e valore “ferro”.
Per avere risultati più complessi e utilizzare più parametri, dobbiamo utilizzare “tax_query“, inserendo i seguenti parametri all’interno di un array:
- taxonomy (stringa) – Nome della tassonomia.
- 2field (stringa) – Selezioniamo la tassonomia in base all’ id’ oppure ‘slug’.
- terms – Valore della tassonomia.
- include_children (booleano) – Includere o meno le tassonomie secondarie, se abbiamo impostato una gerarchia delle stesse. Di default è TRUE.
- operator (stringa) – Operatori. I valori sono: ‘IN’, ‘NOT IN’, ‘AND’.
$args = array( 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'film', 'field' => 'slug', 'terms' => array( 'thriller', 'poliziesco' ) ), array( 'taxonomy' => 'regista', 'field' => 'id', 'terms' => array( 103, 106, 111), ) ) ); $query = new WP_Query( $args );
Abbiamo caricato tutti i parametri nella variabile $args ed abbiamo deciso di visualizzare i post aventi come tassonomia “film”, valori “thriller” e “poliziesco” e, visto che abbiamo utilizzato l’operatore AND, mostrerà i risultati solo se la seconda tassonomia è “regista” e come valore gli ID “103”, “106” e “111”.
Passiamo ora a come filtrare i post in base a dei campi personalizzati, ad esempio se vogliamo visualizzare tutti i post che hanno come valore “Roma”:
$query = new WP_Query( 'meta_value=Roma' );
Così visualizzeremo tutti i post che hanno, come valore di un qualsiasi campo personalizzato, il valore “Roma”. Se invece vogliamo cercare i post che hanno, come campo personalizzato, la parola “Città”, scriviamo:
$query = new WP_Query( 'meta_key=Città' );
Per cercare tutti i post che hanno, come campo personalizzato, “Città” e come valore “Roma”:
$query = new WP_Query( array( 'meta_key' => 'Città', 'meta_value' => 'Roma' ) );
Se invece vogliamo escludere la città Roma, dobbiamo utilizzare un operatore logico, quindi scriviamo:
$query = new WP_Query( array( 'meta_key' => 'Città', 'meta_value' => 'Roma', 'meta_compare' => '!=' ) );
Invece, per utilizzare meta_query, scriviamo:
$args = array( 'post_type' => 'prodotti', 'meta_query' => array( array( 'key' => 'colore', 'value' => 'blu', 'compare' => 'NOT LIKE' ) ) ); $query = new WP_Query( $args );
In questo modo cercheremo tutti i custom post “Prodotti”, che non hanno come valore del campo “Colore”, “Blu”. Per confrontare più campi personalizzati, dobbiamo racchiuderli in array separati:
$args = array( 'post_type' => 'prodotti', 'meta_query' => array( array( 'key' => 'colore', 'value' => 'blu', ), array( 'key' => 'taglia', 'value' => 'large', ) ) ); $query = new WP_Query( $args );
Per visualizzare i post in base al loro stato, scriviamo:
$query = new WP_Query( array( 'post_status' => array( 'publish'), 'perm' => 'readable' ) );
Come risultato otterremo tutti i post pubblicati, che possono essere modificati.
In questa lezione abbiamo visto come personalizzare il loop, filtrando i post in base ai risultati. Ricordatevi di utilizzare la funzione query_post() per personalizzare il loop principale, se dovete aggiungere più loop dovete utilizzare la funzione WP_Query.
Adesso è necessario ottimizzare il loop, creiamo un file vuoto e rinominiamolo come loop.php, copiamo il loop che abbiamo scritto in page.php e archive.php e, al loro posto, scriviamo:
get_template_part('loop');
single.php e search.php
Creiamo anche il file single.php, che gestirà la visualizzazione del singolo post e search.php che gestirà i risultati del modulo di ricerca e scriviamo anche al loro interno:
get_template_part('loop');
Se è necessario escludere alcune parti del loop, in base al template corrente, dobbiamo utilizzare i Conditional Tags
. Ad esempio, per visualizzare il riassunto solo in search.php e archive.php e il testo completo in page.php e single.php, scriviamo all’interno del loop:
if ( (is_category() ) || (is_search() ) ) { the_excerpt(); } if ( (is_single() ) || (is_page() ) ) { the_content(); }
Facciamo lo stesso per quegli elementi che vogliamo includere ed escludere dal loop, in base al template corrente.
In questa lezione abbiamo visto come personalizzare il loop, in base a determinate query. L’argomento della prossima lezione sarà come visualizzare i commenti e come inserire il form che permette ai visitatori di inserirli, quindi aggiungiamo un’ulteriore riga nel file che gestisce il loop:
comments_template();
La funzione comments_template() prevede due parametri:
- $file, ovvero il nome del file che gestisce i commenti, lasciandolo vuoto verrà utilizzato comments.php.
- $separa-commenti, valore booleano che indica se vogliamo o meno separare i commenti per tipo (di default è false).
Commenti
Ottima idea quella di creare un blog dove spiega come costruire un tema wordpress anche perché nel sito italiano WordPress italy sono fermi a versioni ormai obsolete … Mi auguro che non smetterai di pubblicare le lezioni …. Ciao
Ciao Marco, ti ringrazio. Intanto tutti gli articoli relativi alla costruzione base di un tema sono pronti, il blog avrà un aggiornamento settimanale (tutti i martedi).
A presto.
Grazie, ti seguirò con piacere …
Rieccomi Alex, su questa lezione ho da dirti due cose. La prima è che il codice wp_query mi dà errore e per funzionare devo togliere “endwhile; else:”
La seconda è che sui custom post non ci ho capito niente su cosa servono 🙂
Ciao, si mancava un if all’inizio 🙂 avendo corretto molte volte i contenuti forse l’ho cancellato per sbaglio.
I custom post sono semplicemente dei tipi di post personalizzati. Ad esempio puoi creare un custom post denominato “Prodotti” e caricare dei prodotti in esposizione, personalizzandone la visualizzazione e gestendoli come i normali post di WordPress.
Comunque ci arriveremo più avanti;)
Allora aspetto prima di approfondirli quando metterai la lezione completa più avanti … grazie 🙂
io fatto un custom type che si chiama glossario e ho inserito i termini importanti con relativo significato.
ho la necessità di identificarli per lettera…cioè per esempio vorrei tutte le parole che iniziano per “a”. nella vecchia dicitura di mysql sarebbe where title like “a%”.
è possibile simulare quella condizione con wp_query?e se si come?