Un menu laterale con le sottopagine

Dopo aver aggiunto nel menu in cima alla testata tutte le pagine e sottopagine del blog in un dropdown menu, ho rivisitato ultimamente la mia sidebar, togliendo un po’ di elementi superflui. Uno di questi rimaneggiamenti riguarda l’inclusione di un menu in cima alla stessa sidebar che compare solo quando si sta visitando una pagina che contiene delle sottopagine oppure se si è in una di queste sottopagine. Penso che sia un servizio ulteriore per facilitare la navigazione di questo inutile blog. Un modello di applicazione lo potete vedere visitando, ad esempio, la pagina Iniziare con Linux: in cima alla sidebar apparirà un piccolo menu con le sottopagine; e questo menu rimarrà anche se visitate una delle sottopagine. Il titolo del menu recita: “Sottopagine di XYZ”, dove XYZ è il titolo della pagina madre ed è anche cliccabile per tornare su di un livello.

Se siete interessati ad implementarlo anche nel vostro tema, seguite il resto dell’articolo.

Il codice

Questo pezzo di codice si rifà a quanto scritto nella pagina del Codex di WordPress, con alcuni adattamenti. Andrebbe inserito nella vostra sidebar o comunque dove desiderate.

<?php
// Assegnazione di una funzione alla variabile $children in base ad alcuni criteri
if($post->post_parent) // Se la pagina ha un genitore, la variabile ne mostrerà le figlie
    $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
else // altrimenti, cioè se non ha un genitore, mostrerà le proprie figlie
    $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
// Assegnata una delle due funzioni alla variabile, verifichiamo le condizioni della pagina che si sta generando
if ($children) /* Se $children è vera, cioè se ha sottopagine o è una di esse, allora esegue il restante codice */ { ?>
    <div class="boxside">
        <h2>Sottopagine di 
            <a href="<?php echo (get_permalink($post->post_parent)); ?>" title="Torna alla pagina <?php echo get_the_title($post->post_parent); ?>">
                <?php echo get_the_title($post->post_parent); ?>
            </a>
        </h2>
        <ul class="pages">
            <?php echo $children; ?>
        </ul>
    </div>
<?php } /* Se $children non è vera, cioè se non ha sottopagine, allora non visualizza nulla */?></pre>

Ho commentato il codice così come l’ho compreso io, che non so nulla di PHP. Eliminate i commenti, se desiderate usarlo, oppure prelevatevi questo ripulito:

<?php
if($post->post_parent)
    $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
else
    $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
if ($children) { ?>
    <div class="boxside">
        <h2>Sottopagine di 
            <a href="<?php echo (get_permalink($post->post_parent)); ?>" title="Torna alla pagina <?php echo get_the_title($post->post_parent); ?>">
                <?php echo get_the_title($post->post_parent); ?>
            </a>
        </h2>
        <ul class="pages">
            <?php echo $children; ?>
        </ul>
    </div>
<?php } ?>

Personalizzazione del codice

Il codice utilizza alcune classi presenti nel mio foglio stile: ad esempio, la classe boxside mi crea un box come quelli che vedete nella sidebar; è quindi obbligatorio per voi cambiare queste classi con quelle che usate nel vostro tema o crearne di nuove, se necessario. Stessa cosa dicasi per la classe pages applicata al tag ul.

Qualche problema (istruttivo e risolto) nel mio blog

Mentre questo codice funziona perfettamente in tutte le pagine “statiche” e relative sottopagine, stranamente non appariva in due sole pagine: Archivio e Featured posts.
Ho provato a spostare il richiamo della sidebar prima della creazione della colonna centrale e… voilà!, ecco spuntare anche in queste pagine il sottomenu. Ho poi dovuto aggiungere una ulteriore riga sotto il richiamo della sidebar, perché in essa c’è già un query_posts che mi faceva apparire il titolo di quella query come titolo della pagina. Ecco la riga:

<?php $post = $posts[0]; ?>

Con essa azzero la precedente interrogazione del database.

Ho aperto ieri una discussione sul forum di WordPress per tentare di capire la ragione di quella sparizione. Probabilmente perché in quei due template manca il loop principale? O perché i vari query_posts presenti “spezzano” (per intenderci) la sequenza genitore/figlio?

[Aggiornamento] Non è necessario spostare la sidebar prima del contenuto centrale. Lasciando la sidebar alla fine del template, basta inserire prima del richiamo della sidebar la seguente riga:

<?php $post = $posts[0]; ?>

che azzera le precedenti query.