Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 20 di 33
  • livello avanzato
Indice lezioni

Pagine di archivio nei temi di WordPress

Impariamo a gestire gli archivi di WordPress, elenchi di articoli associati a tipologie specifiche. Analizziamo la procedura per la generazione di un archivio tramite index.php e studiamo le caratteristiche dei template per le pagine di archivio, compresi i template per gli archivi basati su custom fields.
Impariamo a gestire gli archivi di WordPress, elenchi di articoli associati a tipologie specifiche. Analizziamo la procedura per la generazione di un archivio tramite index.php e studiamo le caratteristiche dei template per le pagine di archivio, compresi i template per gli archivi basati su custom fields.
Link copiato negli appunti

Una pagina di archivio è un elenco di articoli, questi ultimi possono appartenere ad una certa categoria, presentare una data etichetta (tag), essere uno specifico tipo di post o essere stati scritti da un determinato autore. Per ognuna di queste tipologie, la gerarchia dei template prevede un ordine in base al quale WordPress sceglie il file da utilizzare per generare l'output HTML.

Generare gli archivi con il file index.php

Nel caso il tema non disponga di alcuno dei file previsti dalla gerarchia dei template, per visualizzare le pagine di archivio verrà utilizzato il file index.php. In un tema semplice, il ricorso ai conditional tags può essere sufficiente. Si inserisca, ad esempio, il seguente codice prima del Loop del file index.php:

<?php if( is_tag() ){ ?>
	<div id="archive-heading"><?php single_tag_title('Currently browsing tag: '); ?></div>
<?php } elseif ( is_category() ) { ?>
	<div id="archive-heading"><?php single_cat_title('Currently browsing category: '); ?></div>
<?php } ?>

Le funzioni single_tag_title() e single_cat_title() restituiscono la stringa passata come argomento e, in coda a questa, il nome del tag o della categoria corrispondente all'archivio corrente. Entrambi i tag vanno utilizzati al di fuori del Loop. La tabella che segue fornisce l'elenco dei conditional tag utili a testare il tipo di archivio.

Funzione Descrizione
is_archive() Un archivio generico.
is_post_type_archive() Un archivio per un tipo di post personalizzato.
is_category() L'archivio di una categoria.
is_tag() Testa un archivio di tag.
is_tax() Un archivio di una tassonomia personalizzata.
is_date(), is_year(), is_month(), is_day(), is_time() Archivi basati su intervalli temporali.
is_search() Archivio per i risultati di una ricerca.

Qualora si avverta il bisogno di una maggiore specificità, è necessario passare al gradino successivo della gerarchia, creando il template archive.php.

I template per le pagine di archivio

WordPress seleziona automaticamente il template semplicemente perché gli si attribuisce un dato nome. Qualora nel tema sia presente il file archive.php, questo sarà sempre utilizzato al posto del file index.php per generare le pagine di archivio, senza alcun bisogno di una query specifica.

Lo stesso avviene nel caso in cui il tema disponga dei template category.php: questo sarà selezionato ogni qual volta l'utente richieda un archivio di categoria. Così pure saranno selezionati i template (author.php, taxonomy.php, tag.php..).

Ora si crei il seguente file archive.php:

<?php
/**
 * @package WordPress
 * @subpackage Seventy-One-WordPress-Theme
 * @since Seventy One 1.0
 */
 get_header(); ?>
 	<div id="main-content" class="main-content">
 		<div id="content" class="content-area" role="main">
 	<?php if( is_tag() ){ ?>
 		<div id="archive-heading"><?php single_tag_title('Currently browsing '); ?></div>
 	<?php } elseif ( is_category() ) { ?>
 		<div id="archive-heading"><?php single_cat_title('Currently browsing '); ?></div>
 	<?php } ?>
	<?php
	if (have_posts()) :
		// Start the Loop.
		while (have_posts()) : the_post();
			?>
			<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
				<header class="entry-header">
					<?php
					if ( is_single() ) :
						the_title( '<h1 class="entry-title">', '</h1>' );
					else :
						the_title( '<h1 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h1>' );
					endif;
					?>
					<?php posted_on(); ?>
					<?php edit_post_link( __( 'Edit', 'seventyone' ), '<span class="edit-link">', '</span>' ); ?>
				</header>
				<div class="entry-summary">
					<?php the_excerpt(); ?>
				</div>
				<footer class="entry-meta">
					<?php the_tags(__('Tags: ','seventyone'), ', ', '<br />'); ?>
					<?php _e('Posted in','seventyone'); ?> <?php the_category(', ') ?> |
					<?php
					if ( comments_open() ) :
						comments_popup_link(__('No Comments &#187;','seventyone'), __('1 Comment &#187;','seventyone'), __('% Comments &#187;','seventyone'));
					endif;
					?>
				</footer>
			</article>
		<?php endwhile; ?>
		<?php post_navigation(); ?>
	<?php
	else :
		get_template_part( 'content', 'none' );
	endif;
	?>
		</div><!-- #content -->
	</div><!-- #main-content -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Lo stesso file potrà essere duplicato e rinominato per essere adattato ad ogni singolo archivio. Purtroppo, la gerarchia dei template non dispone del template necessario. È il caso degli archivi di articoli che hanno uno stesso custom field.

Un template per un archivio basato su custom fields

Non esistendo un template specifico che permetta di generare un archivio degli articoli etichettati con un certo custom field, bisognerà sfruttare le potenzialità del framework per aggiungere un nuovo template e comunicare a WordPress in quali condizioni utilizzarlo. Nel file functions.php del tema si aggiunga:

function seventyone_register_query_var( $vars ) {
	$vars[] = 'citta';
	return $vars;
}
add_filter( 'query_vars', 'seventyone_register_query_var' );

WordPress dispone già delle query var meta_key e meta_value, ma queste sono private. Ciò significa che non vengono trasmesse attraverso le URL. Per questo morivo va predisposta una nuova query var, che dovrà essere intercettata dallo script del template file. Una volta registrata la query var citta, bisognerà imporre un template specifico, che sarà utilizzato nel caso la URL contenga la suddetta variabile:

function seventyone_url_rewrite_templates() {
    if ( get_query_var( 'citta' ) ) {
        add_filter( 'template_include', function() {
            return get_stylesheet_directory() . '/archive-citta.php';
        });
    }
}
add_action( 'template_redirect', 'seventyone_url_rewrite_templates' );

Per il rewriting delle URL, si aggiungeranno un rewrite tag e una rewrite rule. La registrazione avviene, sempre nel file functions.php, all'avvio di WordPress:

function seventyone_init() {
	...
	// ricordarsi di aggiornare le regole di rewriting (salvare i dati nella pagina di amministrazione dei permalink)
	add_rewrite_tag( '%citta%', '([^&]+)' );
	add_rewrite_rule( 'location/(.+?)/?$', 'index.php?citta=$matches[1]', 'top' );
}
add_action('init', 'seventyone_init');

Figura 1. Il meta box dei custom field.
Custom fields

Si duplichi, ora, il file archive.php e si rinomini la copia archive-citta.php. Prima dell'avvio del Loop si aggiunga il seguente codice:

$citta = get_query_var( 'citta' );
$args = array(
	'meta_query'	=> array(
		array(
			'key'		=> 'citta',
			'value'		=> $citta,
			'compare'	=> '='
		)
	)
);
$cpt_query = new WP_Query( $args );

Il valore della variabile citta viene passato come parametro di una nuova query, la quale sarà utilizzata per generare il Loop del file di archivio:

if ( $cpt_query->have_posts() ) :
	while( $cpt_query->have_posts() ) : $cpt_query->the_post(); 
		// inserire qui il codice che genera il contenuto degli articoli
	endwhile;
	post_navigation();
else :
	get_template_part( 'content', 'none' );
endif;

Figura 2. Una pagina di archivio per uno specifico custom field
Pagina di archivio custom field

Riferimenti

Ti consigliamo anche