Il Loop
On this page... (hide)
1. Introduzione
Il Loop viene utilizzato da WordPress per visualizzare ciascuno dei vostri articoli. Utilizzando Il Loop, WordPress processa gli articoli che devono venir visualizzati nella pagina corrente e li formatta in accordo con i criteri specificati nei tag del Loop. Qualsiasi codice HTML o PHP inserito fra l'inizio del The Loop e la sua fine verrà usato per ogni singolo articolo. Quando nella documentazione di WordPress trovate l'indicazione "Questo tag va utilizzato all'interno de Il Loop, come ad esempio i Tag dei Template o i plugin, si intende questo Loop.
Ad esempio, in WordPress 1.5, fra le varie informazioni che Il Loop visualizza di base ci sono: Il Titolo (the_title()), Data (the_time()) e le Categorie (the_category()) per ciascun articolo. Possono essere visualizzate altre informazioni sui singoli articoli utilizzando gli opportuni Marcatori di Template o (per gli utenti evoluti) accedendo alla variabile $post, che viene impostata con le informazioni sull'articolo corrente durante l'esecuzione del Loop.
2. Utilizzo del Loop
Il Loop deve venir inserito in index.php ed in qualsiasi altro Template utilizzato per visualizzare informazioni sugli articoli, potrà però apparire leggermente differente in funzione della vostra versione di WordPress. Per prima cosa dovete determinare quale versione di WordPress avete".
2.1 WordPress 1.5
Assicuratevi di inserire una chiamata al Template della testata in cima ai vostri Template del vostro Tema.
<?php get_header(); ?>
Il loop inizia qui:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
e termina qui:
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
2.2 WordPress 1.2
Assicuratevi di inserire una chiamata a wp-blog-header.php all'inizio della vostra pagina di indice. Ricordatevi che il percorso a wp-blog-header.php deve venir impostato all'effettiva posizione del vostro file wp-blog-header.php:
<?php /* Don't remove this line. */ require('./wp-blog-header.php'); ?>
Il loop inizia qui:
<?php if ( $posts ) : foreach ( $posts as $post ) : start_wp(); ?>
e finisce qui:
<?php endforeach; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
3. Esempi
3.1 Applica uno stile differente agli articoli di alcune categorie
Solo per WordPress v1.5
Questo esempio, utilizzando la sintassi della versione 1.5, visualizza ciascun articolo con il suo Titolo (che viene usato come Permalink all'Articolo), le Categorie ed il Contenuto. Si tratta di un esempio semplice ed essenziale; tipicamente il vostro Template visualizzerà molte più informazioni in una modalità che renda semplice renderli con vari stili tramite CSS.
Tuttavia, per poter essere il più istruttivo possibile, questo esempio permette anche di applicare uno stile differente per tutti gli articoli della Categoria di ID'3'. Per far ciò viene utilizzato il marcatore in_category().
i marcatori <!-- --> sono i marcatori HTML di commento; se utilizzate questo esempio, questi marcatori non verranno visualizzati nel web browser. Hanno il solo scopo di annotare il codice sottostante in modo da chiarire ile singole sezioni.
<!-- Avvia il Loop. --> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<!-- Si verifica che l'articolo corrente appartenga alla categoria 3. -->
<!-- Se è così, al div viene assegnata la classe CSS class "post-cat-three". -->
<!-- Altrimenti al div viene assegnata la classe CSS "post". -->
<?php if ( in_category('3') ) { ?>
<div class="post-cat-three">
<?php } else { ?>
<div class="post">
<?php } ?>
<!-- Visualizza il Titolo come un link al Permalink dell'Articolo. --> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<!-- Visualizza Data e Ora. -->
<small><?php the_time('F jS, Y'); ?></small>
<!-- Visualizza il contenuto dell'Articolo all'interno di un div. --> <div class="entry"> <?php the_content(); ?> </div>
<!-- Visualizza le Categorie dell'Articolo separate da virgole. -->
<p class="postmetadata">Pubblicato in <?php the_category(','); ?></p>
</div> <!-- chiude il primo div box -->
<!-- Termina il Loop - ma si noti la clausola "else:" --> <!-- (si veda la riga successiva). --> <?php endwhile; else: ?>
<!-- Il primo "if" verificava la presenza di Articoli da visualizzare --> <!-- Questo "else" dice cosa fare se non ve ne è nessuno. --> <p>Spiacente, nessuna articolo corrisponde ai tuoi criteri.</p>
<!-- Termina DAVVERO Il Loop. --> <?php endif; ?>
Nota: Ogni volta si utilizza del codice HTML, questo deve essere esterno ai marcatori <?php ?>. Il codice PHP (anche una semplice parentesi graffa: } ) deve essere all'interno dei marcatori <?php ?>. Potete iniziare e terminare il codice PHP per permettere l'interpretazione del codice HTML anche all'interno di una condizione if e else, come mostrato nell'esempio precedente.
3.2 Escludere Articoli di una Determinata Categoria
Solo per WordPress v1.5
Questo esempio può essere utilizzato per escludere la visualizzazione di una determinata Categoria. È basata sull'esempio precedente. Poiché vogliamo escludere una particolare categoria utilizzeremo nuovamente il marcatore in_category(),ma in questo caso negheremo la stampa utilizzando l'operatore PHP NOTA: il punto esclamativo !.
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<!-- Verifica che l'articolo corrente è nella categoria 3. -->
<!-- Se non lo è, il codice nel Loop viene eseguito normalmente. -->
<!-- Se lo è, non viene fatto nulla sino a quando viene analizzato -->
<!-- l'articolo seguente. -->
<?php if ( !(in_category('3')) ) { ?>
<div class="post">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y'); ?></small>
<div class="entry">
<?php the_content(); ?>
</div>
<p class="postmetadata">Pubblicato in <?php the_category(','); ?></p>
</div> <!-- chiude il primo div -->
<?php } ?> <!-- Chiude il controllo if. -->
<?php endwhile; else: ?> <p>Spiacente, nessuna articolo corrisponde ai tuoi criteri.</p> <?php endif; ?>
Nota: Se utilizzate questo esempio nella vostra pagina principale, dovrete utilizzare un Template differente per gli archivi di Categoria. Altrimenti, WordPress escluderà tutti gli articoli della Categoria 3 anche quando si visualizza l'Archivio di Categoria!
Tuttavia se volete utilizzare il medesimo template, potete evitare il problema utilizzando il marcatore is_home() ?:
...
<?php if ( !(in_category('3') && is_home()) ) { ?>
...
Ciò assicura gli articoli della Categoria 3 verranno esclusi solo dalla pagina principale. Vi sono altri marcatori condizionali che possono venir utilizzati per controllare l'output in funzione del verificarsi o meno di una particolare condizione rispetto alla pagina richiesta.
4. Utilizzo Avanzato
Questa sezione tratta dell'utilizzo avanzato del Loop. È un trattazione un poco tecnica, quindi, se non avete pratica di PHP e delle sue strutture dati, potete semplicemente ignorarla :)
Di seguito si tratterà dell'uso di Loop multipli tramite la pubblicazione di una discussione fra Ryan Boren e Alex King riguardo al Loop sulla Hackers Mailing List. Sono stati apportati alcuni piccoli cambiamenti alla formattazione dl testo.
Da:Ryan
Sono apparse diverse domande sull'utilizzo di query multiple e di loop multipli sugli articoli all'interno di un template. Eccoci quindi a parlare dei loop. Questo è il loop di base sugli articoli.
<?php while (have_posts()) : the_post(); ?> // Esegui delle cose. <?php endwhile; ?>
Le funzioni have_posts() e the_post() sono dei wrapper all'oggetto $wp_query, che è dove tutta l'azione si svolge. $wp_query viene chiamato nell'header del blog ed è alimentato dagli argomenti della query che arrivano tramite GET e PATH_INFO. $wp_query prende glia argomenti e costruisce ed esegue la query al DB, il cui risultato è un array di articoli. Questo array viene memorizzato nell'oggetto e restituito al blog header dove viene memorizzato nell'array globale $posts (per una questione d compatibilità con il vecchio loop degli articoli).
Una volta terminato con il blog header e scendendo lungo il template, arriviamo al loop degli articoli. have_posts() chiama semplicemente $wp_query->have_posts() che verifica un contatore del loop per vedere se vi è ancora qualche articolo presente nell'array degli articoli. the_post() richiama $wp_query->the_post() che incrementa il contatore del loop ed imposta anche i dati globali dell'articolo. Una volta terminato il ciclo, have_posts() restituisce il valore falso e si termina.
Ora, volendo ripassare attraverso la medesima query una seconda volta, si dovrà chiamare la funzione rewind_posts(). La quale azzera il contatore del loop consentendo quindi di eseguire nuovamente il ciclo.
<?php rewind_posts(); ?>
<?php while (have_posts()) : the_post(); ?> // Esegui delle altre cose. <?php endwhile; ?>
Cosa fare se si desidera utilizzare una query differente? Se si è terminato con gli articoli della query originale, è possibile riutilizzare l'oggetto $wp_query richiamando query_posts() e quindi ciclando nuovamente il tutto. query_posts() esegue una nuova query, costruisce un nuovo array di articoli e azzera il contatore del ciclo.
// Prendi gli ultimi 10 articoli nella categoria special_cat.
<?php query_posts('category_name=special_cat&showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?> // Esegui delle cose su special_cat. <?php endwhile;?>
Se vi fosse necessità di mantenere la query originale, è possibile creare un nuovo oggetto query.
<?php $my_query = new WP_Query('category_name=special_cat&showposts=10'); ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?> // Do Esegui delle cose. <?php endwhile; ?>
Come vedete non potete usare la have_posts() globale ne la the_post() poiché utilizzate da $wp_query. Tuttavia, vengono richiamata nell'oggetto $my_query.
Ryan
DA:Alex
Il "sistema" che uso per aggirare il problema (impossibilità di usare have_posts() e the_post() ) è quello di memorizzare la query originale in una variabile, e quindi riassegnarla una volta terminato l'altro mio ciclo. In tal modo è possibile utilizzare tutte le funzioni standard che si basano sulle variabili globali.
Ad esempio:
// Esco per i fatti miei
<?php $temp_query = $wp_query; ?>
// faccio elle cose
<?php query_posts('category_name=special_cat&showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?> // Faccio delle cose su special_cat. <?php endwhile; ?>
// torno alla programmazione normale
<?php $wp_query = $temp_query; ?>
Alex