Il blog è archiviato e questo articolo è vecchio di diversi anni. Le informazioni al suo interno potrebbero essere inesatte o non più aggiornate. Torna alla home

Pillole di WordPress: ottenere la lista delle sottopagine in PHP
13 Agosto 2014Tra i vari esperimenti che sto portando avanti sul blog, oggi vede la luce anche “Pillole di WordPress”: una rubrica in cui pubblicherò trucchi facili e avanzati per il CMS che tanto adoriamo =)
Difficoltà:
L’obiettivo
Vogliamo generare una semplice lista in PHP che contenga tutte le sottopagine di una determinata pagina di WordPress.
Immaginiamo di avere questa struttura:
- www.sito.it/colori/
- www.sito.it/colori/rosso
- www.sito.it/colori/verde
- www.sito.it/colori/blu
Se “colori”, “rosso”, “verde” e “blu” sono tutte pagine (non articoli) di WordPress, allora purtroppo non ci sono widget o altre automazioni che ci permettono di ottenere la lista di tutte le sottopagine di “colori”.
La soluzione
Per risolvere il problema, facciamo uso della funzione WP_Query() che permette di interrogare il database passandogli una serie di parametri per definire la ricerca.
Se la pagina “colori” avesse come ID = 25, allora questo sarebbe il codice:
<?php
$args = array(
'post_type' => 'page',
'post_parent' => 25,
'post_status' => 'publish',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
echo '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
echo '<li><a href="' .get_permalink().'">' . get_the_title() . '</a></li>';
}
echo '</ul>';
}
wp_reset_postdata();
?>L’output dell’intero script, sarebbe:
<ul> <li><a href="http://www.sito.it/colori/rosso">Rosso</a></li> <li><a href="http://www.sito.it/colori/verde">Verde</a></li> <li><a href="http://www.sito.it/colori/blu">Blu</a></li> </ul>
Spiegazione
Per prima cosa, dobbiamo popolare l’array $args inserendo i valori che intendiamo utilizzare per eseguire la query. In questo caso semplicissimo, abbiamo usato:
‘post_type’ => ‘page’,
‘post_parent’ => 25,
‘post_status’ => ‘publish’,
Con questi parametri, comunichiamo a WordPress la nostra intenzione di ottenere solo le pagine (cone il post_type), solo quelle “figlie” della pagina “colori” (con il post_parent) e solo quelle con lo status “pubblicato” (altrimenti verrebbero prese anche le pagine in Bozza)
La query viene effettivamente lanciata con il comando $query = new WP_Query( $args );
Con l’istruzione successiva if ( $query->have_posts() ) { controlliamo che la query abbia generato dei risultati. Se il controllo è positivo, allora stampiamo l’apertura di una lista con echo ‘<ul>’;
Successivamente attiviamo un loop:
while ( $query->have_posts() ) {
$query->the_post();
Questo loop significa: finché ci sono risultati della query, analizzane uno per uno.
Nel blocco successivo, è possibile inserire qualsiasi operazione che debba essere svolta con ciascun post. Per ragioni di praticità noi ci limitiamo a inserire il titolo linkato della pagina, all’interno di un <li></li>, e quindi:
echo ‘<li><a href=”‘ .get_permalink().'”>’ . get_the_title() . ‘</a></li>’;
Successivamente chiudiamo i due costrutti e ci ricordiamo di inserire la chiusura della lista con echo ‘</ul>’;
Prima di chiudere il nostro codice PHP è sempre bene lanciare la funzione wp_reset_postdata(); che serve a pulire il contenuto della variabile globale $post (è un controllo di sicurezza).
Variante
Quello che abbiamo visto prima è il codice base, ma spesso c’è bisogno di maggiori funzionalità, come ad esempio ordinare le pagine per un determinato parametro, aumentare il numero di pagine in output e così via.
Di seguito trovate il codice “maggiorato” con altri parametri utili
<?php
global $post;
$args = array(
'post_type' => 'page',
'post_parent' => $post->ID,
'post_status' => 'publish',
'orderby' => 'name',
'order' => 'ASC',
'posts_per_page' => 9999,
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
echo '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
echo '<li><a href="' .get_permalink().'">' . get_the_title() . '</a></li>';
}
echo '</ul>';
}
wp_reset_postdata();
?>Le novità apportate sono le seguenti:
- per rendere lo script universale, ho aggiunto la riga 2 e ho modificato la 6. Il fatto di caricare la variabile $post tramite global $post; mi permette successivamente di usare $post->ID alla riga 6 (prima avevamo inserito un ID fisso, il 25). Così facendo, questo script può essere copiato e incollato ovunque e produrrà la lista relativa alla pagina in cui si trova. (se copio questo script nella pagina /libri/ otterrò la lista delle sottopagine di /libri/)
- alle righe 8-9 abbiamo aggiunto i parametri orderby e order, per dire a WordPress di ordinare la lista in ordine alfabetico crescente
- alla riga 10 diciamo a WordPress che non deve limitare il numero massimo di righe, ma che deve fornirci fino a 9999 sottopagine

