Un menu laterale con le sottopagine

Come aggiungere un menu con le sole sottopagine o le pagine “sorelle” nella propria sidebar. Con un paragrafo in coda per risolvere un problema relativo.

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 */?>

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?

Note
[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.

Autore: Aldo Latino

Aldo Latino usa con entusiasmo Linux nella distribuzione Ubuntu, è un appassionato di WordPress e si diletta a fare il blogger. Ha anche una lista dei desideri. Per altre informazioni visita la sua .

12 pensieri riguardo “Un menu laterale con le sottopagine”

    1. Ciao devilio. Riesco purtroppo a risponderti solo ora, ma spero di esserti d’aiuto.

      Immagino che nel tuo tema tu voglia visualizzare l’elenco delle sottocategorie della categoria dell’articolo visualizzato. Ti propongo due blocchi di codice (da usare alternativamente) che producono questo risultato:

      Il primo blocco fa un elenco diretto delle sottocategorie; il secondo invece mostra anche la categoria usata (o le categorie usate).

      Entrambi vanno inseriti nella sidebar del tuo tema, proprio dentro il primo elemento ul (quello che contiene tutti i widgets).

      Primo tipo

      <?php
      if ( is_single() ) {
      	echo '<h3 class="widget-title">Sottocategorie</h3>';
      	echo '<li id="child-categories" class="widget-container widget-child-categories">';
      		echo '<ul>';
      			$categories = get_the_category();
      			foreach ( $categories as $category ) {
      				$args = array(
      				'child_of' => $category->cat_ID,
      				'hierarchical' => true,
      				'hide_empty' => false,
      				'title_li' => '',
      				'show_count' => true,
      				'use_desc_for_title' => true,
      				);
      				wp_list_categories( $args );
      			}
      		echo '</ul>';
      	echo '</li>';
      }
      ?>

      Secondo tipo

      <?php
      if ( is_single() ) {
      	echo '<h3 class="widget-title">Sottocategorie</h3>';
      	echo '<li id="child-categories" class="widget-container widget-child-categories">';
      		$categories = get_the_category();
      		foreach ( $categories as $category ) {
      			echo '<span class="current-category">Sottocategorie di <a href="' . get_category_link( $category- rel="nofollow">term_id ) . '" title="Vedi tutti i post in ' . $category->name . '">' . $category->name . '</a></span>';
      			echo '<ul>';
      			$args = array(
      				'child_of'           => $category->cat_ID,
      				'hierarchical'       => true,
      				'hide_empty'         => false,
      				'title_li'           => '',
      				'show_count'         => true,
      				'use_desc_for_title' => true,
      			);
      			wp_list_categories( $args );
      			echo '</ul>';
      		}
      	echo '</li>';
      }
      ?>

      Fammi sapere. Ciao!

  1. Gentilissimo Aldo,

    grazie per le informazioni: effettivamente c’ero andato vicino… ma mi manca qualche dettaglio. Ti spiego: pure io mi sto facendo un sitino-blog e sto cercando di implementare una barra laterale che contenga le subpages. Quindi uno seleziona la pagina principale dalla top-bar (come qui, per esempio Info, Archivio, Linux, etc.) e a lato gli appare la barra laterale con le sottopagine relative. Il tuo script funziona bene ma… per le sub-sub-pages? Di fatto quando seleziono una sub-sub-page mi viene mostrato il genitore (la subpage) e la subsubpage ma le altre subpages (a livello della prima) vengono ovviamente tolte. Sai mica se c’è la possibilità di ovviare a ciò? Grazie dell’aiuto e complimenti per il blog.

    1. Ciao Nicola :)
      nel Codex trovi uno snippet bell’e pronto, cui ho apportato una piccola modifica.
      Credo sia questo ciò che chiedi. In sostanza, in una sequenza di pagine del tipo:

      Pagina 1
         Pagina 1.1
            Pagina 1.1.1
         Pagina 1.2
      Pagina 2
      ecc.

      se vai alla 1.1.1, lui mostrerà questo:

      Titolo della pagina 1.1.1
      Pagina 1
         Pagina 1.1
            Pagina 1.1.1

      Fammi sapere se va bene.
      Ciao e grazie per i complimenti!

      1. Buonasera,

        ho provato lo snippet del codex al quale mi rimandi (non vedo il tuo modificato però…). Diciamo che mi mostra le sottopages (e va bene) ma quando ci vado sopra mi mostra la subpage su cui ho cliccato e il genitore. Così:

        Pagina 1
        Pagina 1.1
        Pagina 1.2
        Pagina 1.3

        Clicco su Pagina 1.1 e vedo:

        Pagina 1
        Pagina 1.1

        E stop. :)

    2. Ho preparato un piccolo plugin che ti mette a disposizione un widget. In questo modo è davvero semplicissimo usarlo. L’output di questo widget è ancora più dettagliato rispetto alla mia risposta precedente e, forse, è proprio quello che cerchi.

      Se sei interessato te lo faccio provare in anteprima. :)

      1. Esìmio, :D

        Ora provo il codex… mannaggia a me che leggo i manuali troppo in fretta. Poi se vuoi passarmi il widget lo provo volentieri. :) Un po’ di codicino fresco non si rifiuta mai, sempre che sia libero. :D

  2. Ok, ho testato e non è niente male. ;)
    Diciamo che fa tutto: mostra le subpages, se ci vado le mantiene, e mostra pur le subsubpages. Unico neo: se vado sulla subsubpage mostra lei, la genitrice ma non le sorelle subpages. Esempio:

    Pagina 1
    SottoPagina 1.1
    SottoPagina 1.2
    SottoPagina 1.3

    Entro in 1.2 per esempio e:

    Pagina 1
    SottoPagina 1.1
    SottoPagina 1.2
    Sottosottopagina 1.2.1
    SottoPagina 1.3

    Quindi ottimo. Vado su Sottosottopagina 1.2.1 e…

    Pagina 1
    Sottopagina 1.2
    Sottosottopagina 1.2.1

    Quindi perdo le 1.1 e 1.3. Ora provo a fare un po’ di hacking sul tuo plugins: ad ogni modo grazie mille, ci siamo vicini.

    1. Se sei nella 1.2.1 mi sembra inutile far comparire anche altre che non hanno un rapporto più diretto, come la 1.1 o la 1.3. Se vuoi farle apparire, allora ti conviene usare direttamente il widget Pagine di WordPress.

      In pratica, il plugin fa quello che propone il post in cui stiamo commentando (mostrare le sottopagine), ma in più mostra sempre le pagine genitrici, come chiedevi nel tuo primo commento.

  3. Ciao, molto utile questo codice :)
    Non è che potresti inviare il plugin anche a me? ho bisogno di vosualizzare delle su-sub-pages…
    Grazie mille

    Roberta

I commenti sono chiusi