Bisognerebbe sempre avere una pagina archivio in un blog, così da dare la possibilità al lettore di spulciare tutti gli articoli, anche quelli del passato, direttamente da un’unica pagina, senza fargli perdere troppo tempo.
Ho già mostrato come creare una pagina archivio, ma avevo utilizzato due plugin.
Visto che la velocità è molto importante e che i plugin rallentano (chi più, chi meno) il caricamento di WordPress, perchè non creare una pagina Archivio senza installare nessun plugin?
Indice
Creare un template personalizzato
In WordPress è possibile assegnare un template diverso per ogni pagina.
Per template, intendo una struttura della pagina stessa, ad esempio eliminando la sidebar, aggiungendo un testo iniziale e poi mostrare articoli, dividendo la pagina in colonne, ecc ecc.
Si può fare davvero di tutto.
Per creare una pagina Archivio, dovrai creare un template apposito.
Fai una copia del file page.php (scaricalo sul tuo computer via FTP) del tema e chiamalo page_archivio.php . Inserisci il seguente codice prima di ogni altro codice della pagina:
<?php
/**
* The template for displaying archive pages.
Template Name: Archivio
*/
?>
Questo serve per indicare le informazioni principali della pagina stessa e soprattutto per indicare il nome del template: Archivio.
Il codice
Il codice mostra tutti gli articoli che sono stati pubblicati suddividendoli per Mese e Anno.
<?php
/*
* Mostra l'archivio di un blog WordPress senza usare plugin
*/
global $wpdb;
// Ottiene l'ID dell'ultimo articolo
$ultimo_articolo = $wpdb->get_var("
SELECT ID FROM $wpdb->posts
WHERE post_date < '" . current_time('mysql') . "'
AND post_status='publish'
AND post_type='post'
AND post_password=''
ORDER BY post_date DESC
LIMIT 1
");
// Recupera l'archivio memorizzato
$output = get_option('hfy_archives_' . $ultimo_articolo);
if (empty($output)) {
$output = '';
// Cancella vecchi archivi
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE 'hfy_archives_%'");
// Legge tutti i mesi che hanno almeno un post
$query_mese = "
SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month, COUNT(ID) as posts
FROM $wpdb->posts
WHERE post_date < '" . current_time('mysql') . "'
AND post_status='publish'
AND post_type='post'
AND post_password=''
GROUP BY YEAR(post_date), MONTH(post_date)
ORDER BY post_date DESC
";
$risultati_mese = $wpdb->get_results($query_mese);
if ($risultati_mese) {
// Array dei nomi dei mesi
$month = [
'01' => 'Gennaio', '02' => 'Febbraio', '03' => 'Marzo', '04' => 'Aprile',
'05' => 'Maggio', '06' => 'Giugno', '07' => 'Luglio', '08' => 'Agosto',
'09' => 'Settembre', '10' => 'Ottobre', '11' => 'Novembre', '12' => 'Dicembre'
];
// Estrae i risultati per ogni mese
foreach ($risultati_mese as $risultato_mese) {
$questo_mese = zeroise($risultato_mese->month, 2);
$questo_anno = $risultato_mese->year;
// Estrae tutti i post per il mese corrente
$query_post = "
SELECT ID, post_date, post_title, comment_count
FROM $wpdb->posts
WHERE post_date LIKE '$questo_anno-$questo_mese-%'
AND post_status='publish'
AND post_type='post'
AND post_password=''
ORDER BY post_date DESC
";
$risultati_post = $wpdb->get_results($query_post);
if ($risultati_post) {
// Mostra il nome del mese e anno
$text = sprintf('%s %d', $month[$questo_mese], $questo_anno);
$output .= '<h2>' . esc_html($text) . '</h2>';
$output .= "<ul class='archiveslist'>\n";
foreach ($risultati_post as $risultato_post) {
if ($risultato_post->post_date != '0000-00-00 00:00:00') {
$url = get_permalink($risultato_post->ID);
$arc_title = $risultato_post->post_title;
$text = $arc_title ? wptexturize(strip_tags($arc_title)) : $risultato_post->ID;
$title_text = 'read more "' . esc_attr($text) . '"';
$output .= "<li><a href='$url' title='$title_text'>$text</a></li>\n";
}
}
$output .= "</ul>\n\n";
}
}
update_option('hfy_archives_' . $ultimo_articolo, $output);
} else {
$output = '<strong>' . __('ERROR:') . '</strong> ' . __('No items were found to be displayed.');
}
}
echo $output;
?>
Il risultato è semplice ma funzionale.
Ovviamente sei libero di personalizzarlo come meglio credi.
Quando hai terminato le modifiche, elimina i // che trovi alla riga 6. In questo modo mantiene la pagina salvata in memoria fino a che non viene creato un nuovo articolo (funziona da cache), per evitare di continuare a fare delle richieste inutili al database.

Dove inserire il codice
Questo è il problema più grande che dovrai affrontare 🙂
Io ti consiglio di inserirlo dopo <?php the_content(); ?> . In questo modo, verrà visualizzato anche il contenuto che scriverai nella pagina tramite editor, utile se vuoi introdurre l’archivio con del testo.
Ecco come risulta la mia pagina page_archivio.php:
<?php
/**
* Template Name: Archivio
* The template for displaying archive pages.
*/
get_header();
?>
<!-- begin colLeft -->
<div id="colLeft">
<!-- Begin .postBox -->
<div class="postBox">
<div class="postBoxTop"></div>
<div class="postBoxMid">
<div class="postBoxMidInner first clearfix">
<h1><?php the_title(); ?></h1>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php the_content(); ?>
<!-- CODICE CHE HO MOSTRATO PRIMA -->
<?php endwhile; ?>
<?php else : ?>
<p><?php _e( 'Sorry, no posts matched your criteria.', 'ritheme' ); ?></p>
<?php endif; ?>
</div>
</div>
<div class="postBoxBottom"></div>
</div>
<!-- End .postBox -->
</div>
<!-- end colLeft -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Assegnare il template alla pagina
Salva il file che hai creato e caricalo nella cartella del tema.
Nella pagina di modifica della pagina (scusa il gioco di parole :)) è presente il box Attributi pagina sulla destra, qui seleziona nella tendina Modello il template Archivio, ed aggiorna la pagina (o pubblicala).

Vai a vedere il risultato.
Se non ti compare il box Attributi pagina, clicca su Impostazioni schermo in alto a destra e seleziona la casella Attributi pagina.
Buon archiviazione 🙂
PS: se non ti compare in automatico la pagina archivio nel blog e la vuoi mostrare, utilizza i menù personalizzati, comodi e molto utili!


