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

Pillole di WordPress: ottenere la lista delle sottopagine in PHP

13 Agosto 2014 0 Di Danilo petrozzi

Tra 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