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 »','seventyone'), __('1 Comment »','seventyone'), __('% Comments »','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');
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;