4 Loop

Inizio del loop

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

codice interno …..

fine del loop

<?php endwhile; else: ?>
<p>Un eventuale messaggio di errore</p>
<?php endif; ?>

tutto questo lo si può inserire nel file index.php, oppure in altri template files che richiamo con get_template_part(); che se lasciato così richiamerà il file loop.php. Finchè ci sono post da mostrare, il loop continua interrompendosi solo dopo l’ultimo post.

ecco un esempio pratico del loop:

  if (have_posts()) :
    while (have_posts()) : the_post(); ?>
    <div id="post-<?php the_ID(); ?>" 
<?php post_class(); ?> >
        <h2><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">            
<?php the_title(); ?>
            </a>
        </h2>
        <?php the_content(); ?>
    </div><?php endwhile; else: ?>

Le prime 2 righe e l’ultima riga costituiscono il loop, mentre il codice tra di esse è l’output (contenuto).
È buona norma separare il loop dal suo output:

PARTI DEL TEMPLATE

Usando get_template_part() si potranno includere file differenti di loop a seconda di dove l’utente si trova all’interno del sito. Per esempio con get_template_part(‘loop’,”)

<div id="post-<?php the_ID(); ?>" 
<?php post_class(); ?> > 
<h2><a href="<?php the_permalink(); ?>
" title="<?php the_title_attribute(); ?>
"> <?php the_title(); ?> 
</a></h2> 
<?php the_content(); ?> 
</div>

Questo tipo di codice va inserito nel relativo template file  (per es potrebbe essere content-archive.php) e costituisce l’output del loop che poi verrà richiamato da get_template_part(‘content’,’archive’); .

WP_Query

WP_Query è l’oggetto predefinito che gestisce il meccanismo del loop. In realtà quando si utilizza per esempio the_post(), si richiamerebbe $wp_query->the_post().
Creando query personalizzate, dovrete creare un oggetto corrispondente

<?php $brand_new_query = new WP_Query(); ?>

ed è possibile eseguire operazioni al di fuori del loop.

TEMPLATE TAG frequenti nei loop

the_permalink();
restituisce il permalink  del post corrente
the_title()
stampa il titolo del post corrente
the_title_attribute()
restituisce il titolo del post in escape, cioè pulito da eventuali tag html. Come molti altri tag, gli argomenti possono essere passati tramite l’array (per es $args) e sono before e after.
the_content();
restituisce il contenuto degli articoli
post_class()
è un tag che restituisce una serie di classi per un elemento html su questo stile: class=”post-23 post type-post status-publish format-standard hentry category-featured”.
the_excerpt();
restituisce il riassunto (55 parole) degli articoli svuotati da collegamenti, immagini… Non ha parametri, e toglie ogni elemento multimediale. Per modificare la lunghezza, bisogna applicare un filtro all’hook  excerpt_length. Qualora si scrivesse testo nella parte di inserimento “Riassunto” del nostro articolo, sarebbe la parte che the_excerpt() visualizzerebbe al posto dell’estratto di 55 parole.
sticky_class();
aggiunge a post_class per tutti i post contrassegnati come sticky la classe sticky. In realtà se un post è sticky con post_class() viene utilizzato automaticamente sticky_class() senza specificarlo, quindi non si utilizza mai.
is_sticky();
è un tag condizionale che permette di creare delle azioni se un post è di tipo sticky. Es:

<?php if (is_sticky()) echo 'Post super importante. Leggilo! Ora!'; ?>

I formati dei post

Permettono di differenziare i tipi di post e quindi modificarne il contenuto. Ogni tema imposta tipi differenti con stili differenti.

  • aside (Digressione) per brevi aggiornamenti, in genere senza un titolo;
  • audio per i file audio;
  • chat per pubblicare le trascrizioni delle chat;
  • gallery (Galleria) per i post delle gallery;
  • image (Immagine) per visualizzare una singola immagine;
  • link per la lettura progressiva del post;
  • quote (Citazione) per mostrare le citazioni;
  • status (Stato) per brevi aggiornamenti dello stato;
  • video per visualizzare un singolo video.

Per es il formato di post aside aggiungerà la classe format-aside e intervenire coi css. Ancora più flessibile è la possibilità di utilizzare i tag condizionali all’interno del loop in base a un determinato formato con has_post_format() :

if ( has_post_format( 'aside' ) ) 
{ echo 'Questo è un post aside, quindi deve essere breve!'; }

Se un tema non ha di default un tipo di post, possiamo aggiungerlo nel file function.php con add_theme_support()
es, aggiungiamo aside , gallery, video

add_action( 'after_setup_theme', 'smashingtheme_setup' );

function smashingtheme_setup() { 
// Aggiungete formati di post 
add_theme_support( 'post-formats', array( 'aside', 'gallery', 'video' ) );
}

In questo modo aggiungeremo la funzione smashingtheme_setup() all’hook after_setup_theme

INCLUDERE I FORMATI COL GET_TEMPLATE_PART

get_template_part( ‘content’, get_post_format() );

Se il post ha quindi il formato aside, get_template_part() includerà content-aside.php

PRE_GET_POSTS()

Rende possibile modificare la query prima che venga effettivamente eseguita. Viene applicato però non solo al front-end, ma anche al back-end, quindi se per es vogliamo nasconder i post con categoria ID 13, aggiungeremo nel function.php:

function smashingtheme_exclude_category( $query ) { 
  $query->set( 'cat', '-13' );
}
add_action( 'pre_get_posts', 'smashingtheme_exclude_category' );

$query è una proprietà della classe wp_query di WordPress. I posts della categoria 13 spariranno anche dall’amministrazione.
Per rimediare possiamo usare il tag condizionale : IS_MAIN_QUERY() che si limiterà alla sola query principale del sito.
Un altra tecnica è quella di evitare che la funzione si attivi quando siamo nell’interfaccia di amministrazione:

function smashingtheme_exclude_category( $query ) { 
 if ( !is_admin() && $query->is_main_query() ) { 
  $query->set( 'cat', '-13' ); }}
add_action( 'pre_get_posts', 'smashingtheme_exclude_category' );

Il tag is_admin si usa per indicare se ci troviamo nell’area di amministrazione

LOOP MULTIPLI

rewind_posts();
resetta il contatore del loop e permette di eseguirlo di nuovo

<?php rewind_posts(); 
while (have_posts()) : the_post(); 
?> 
<!-- Il loop di base continua... -->

Questa è una forma semplice utile a capire il funzionamento di rewind_post(), in questo caso però si ripeterebbe in modo identico lo stesso loop e la cosa è di scarsa utilità.

wp_reset_postdata()
Ripristina la variabile globale $post all’articolo corrente della query principale.

Immaginiamo di volere gli ultimi 5 posts della categoria news. Pe fare ciò dobbiamo estendere la classe WP_Query con una nuova e integrare un altro loop:

<?php 
// Argomenti per WP_Query 
$args = array( 'category_name' => 'news', 'showposts' => 5 ); 
// Il nuovo loop archiviato in $new_loop 
$new_loop = new WP_Query( $args ); 
while ( $new_loop->have_posts() ) : $new_loop->the_post(); ?> 
   <!-- L'output del loop va qui -->
<?php // Fine del loop 
endwhile; 
// Reimpostate la query 
wp_reset_postdata();
?>

Un altro impiego comune per i loop multipli è nella visualizzazione di un post in primo piano nella parte superiore della pagina.

Prima ci vuole un loop che recuperi il post più recente nella categoria featured (in evidenza).

Poi avete bisogno di un secondo loop che esegua il lavoro consueto, elencando gli ultimi post di tutte le categorie.

Per estrarli, dovete archiviare la prima query del loop all’interno del relativo oggetto query. Eseguite questa operazione chiamando l’oggetto WP_Query e archiviandolo in una nuova query.

WP_Query è l’elemento implicito che fa funzionare il loop, in realtà quando utilizziamo have_post(), stiamo incondizionatamente scrivendo WP_Query->have_posts().

<?php // Impostate un valore temporaneo per evitare errori 
$do_not_duplicate = null;
 
// Argomenti del loop 
$args = array( 'category_name' => 'featured', 'showposts' => 1 ); 
// La query e il loop in primo piano 
$featured_query = new WP_Query( $args ); 
  while ( $featured_query->have_posts() ) : $featured_query->the_post(); 
// Salvate l'ID del post in $do_not_duplicate 
$do_not_duplicate = $post->ID;?> 
<!-- L'output per il post in primo piano --> 
<?php // Fine del loop in primo piano 
endwhile; // Reset 
wp_reset_postdata(); ?> 
<!-- Inserite qui quanto desiderate tra il post in primo piano e il normale elenco dei post -->
<?php 
// Argomenti del loop 
$args = array( 'showposts' => 9 ); 
// Il secondo loop 
$second_query = new WP_Query( $args ); 
while ( $second_query->have_posts() ) : 
$second_query->the_post(); 
// Nessun output del post in primo piano 
if ( $post->ID == $do_not_duplicate ) 
continue; 
update_post_caches( $posts );?> 
<!-- L'output del post del loop normale va qui -->
<?php // Fine del secondo loop 
endwhile; ?>

$do_not_duplicate viene impostato a null, per evitare qualsiasi errore qualora non ci fossero post nel loop in primo piano.

Poi WP_Query è archiviato in $featured_query che sarà utilizzato nell’effettivo loop while

Infine, salvate il risultato del loop in $do_not_duplicate, che è l’ID del post, continuate con il loop di base, chiudete il loop con endwhile e reimpostate i dati del post con wp_reset_postdata().

WP_Query viene archiviato in $second_query e poi si fa la verifica per vedere se un ID del post sia lo stesso utilizzato nel loop in primo piano precedente. Se così fosse, il loop lo ignorerà.