Voici comment créer une page d’archives facilement et sans plugin !
Fonction d’archivage d’articles pour WordPress
Copier coller le code suivant en functions.php :
function astuceswp_archiveData()
{
global $wpdb;
$data = [];
$day = intval(get_query_var('dayNb'));
$month = intval(get_query_var('monthNb'));
$year = intval(get_query_var('yearNb'));
if ($year !== 0 && $month !== 0 && $day !== 0) {
$query = getQuery(
[
'date_query' => [
'year' => $year,
'month' => $month,
'day' => $day,
]
],
-1
);
$data = [
'posts' => $query['posts'],
'year' => $year,
'month_name' => monthNbToFrenchName($month),
'month_nb' => $month,
'day' => $day < 10 ? '0' . $day : $day
];
} elseif ($year !== 0 && $month !== 0) {
$data = [
'days' => $wpdb->get_col("SELECT DISTINCT DAY(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND YEAR(post_date) = '" . $year . "' AND MONTH(post_date) = '" . $month . "' AND post_type in ('post', 'pays') ORDER BY post_date DESC"),
'year' => $year,
'month_name' => monthNbToFrenchName($month),
'month_nb' => $month,
'nb_days_in_month' => date("t", mktime(0, 0, 0, $year, 1, $month)),
];
} else {
$years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type in ('post', 'pays') ORDER BY post_date DESC");
foreach ($years as $year) {
$months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND YEAR(post_date) = '" . $year . "' AND post_type in ('post', 'pays') ORDER BY post_date ASC");
$data[$year] = $months;
}
}
return $data;
}
Templates Parts
Template Jour
<?php /** * day * */ $archive_data = astuceswp_archiveData(); $blogposts = new WP_query($archive_data); ?> <h1>ARCHIVES DE <?php echo $archive_data['month_name']; ?> <?php echo $archive_data['year']; ?></h1> <h2>Articles du <?php echo $archive_data['day']; ?> <?php echo $archive_data['month_name']; ?> <?php echo $archive_data['year']; ?></h2> <ul class="row"> <?php if ( $blogposts->have_posts() ) : while ($blogposts->have_posts()) : $blogposts->the_post(); // Get loop markup get_template_part( 'template-parts/loop/content', 'blogposts' ); // Close blogposts loop endwhile; endif; ?> </ul>
Template Mois
<?php /** * month * */ $archive_data = astuceswp_archiveData(); ?> <h1>ARCHIVES DE <?php echo $archive_data['month_name']; ?><?php echo $archive_data['year']; ?></h1> <div class="row"> <?php for($day = 1; $day <= $archive_data['nb_days_in_month']; $day++): if($day === 1 || $day % 6 == 1):?> <ul class="col-lg-2 col-md-4 col-sm-4"> <?php endif; ?> <li> <?php if(in_array($day, $archive_data['days'])){?> <a href="<?php echo ('/archive-par-date-taxonomies/' . $archive_data['year'] . '/' . $archive_data['month_nb'] . '/' . $day . '/');?>"> <?php echo $day. ' '. $archive_data['month_name']. ' '.$archive_data['year'] . '</a>'; } else { echo $day. ' '. $archive_data['month_name']. ' '.$archive_data['year'] . ''; } ?> </li> <?php if($day % 6 == 0):?> </ul> <?php endif; endfor; if($day % 6 != 1):?> </ul> <?php endif; ?> </div>
Template Archives pages
<?php /** * Template Name: Archives * */ get_header(); the_post(); function whichTemplateToUse() { $day = intval(get_query_var('dayNb')); $month = intval(get_query_var('monthNb')); $year = intval(get_query_var('yearNb')); if ($year !== 0 && $month !== 0 && $day !== 0) { $return = 'day'; } elseif ($year !== 0 && $month !== 0) { $return = 'month'; } else { $return = 'noDate'; } return $return; } function monthNbToFrenchName($monthNb) { $dateObj = DateTime::createFromFormat('!m', $monthNb); $monthName = $dateObj->format('F'); return str_replace( array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'), array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'), $monthName ); } $archive_data = astuceswp_archiveData(); $which_template_to_use = whichTemplateToUse(); ?> <div class="container archive-seo padding-header"> <?php if($which_template_to_use === 'day') { get_template_part( 'template-parts/archives/day'); /*Chemin de vos templates parts*/ } elseif($which_template_to_use === 'month'){ get_template_part( 'template-parts/archives/month'); /*Chemin de vos templates parts*/ }else{?> <h1>ARCHIVES DES ARTICLES</h1> <div class="row"> <?php foreach($archive_data as $yearNb => $months):?> <div class="col-lg-2 col-md-4 col-sm-4"> <h3><?php echo $yearNb; ?></h3> <ul> <?php for($monthNb = 1; $monthNb <= 12; $monthNb++) : $dateObj = DateTime::createFromFormat('!m', $monthNb); $monthName = str_replace( array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'), array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'), $dateObj->format('F') ); ?> <li> <?php if(in_array($monthNb, $months)){?> <a href="<?php echo('/archive-par-date-taxonomies/' . $yearNb . '/' . $monthNb . '/'); ?>"><?php echo $monthName; ?></a> <?php } else{ echo $monthName; } ?> </li> <?php endfor; ?> </ul> </div> <?php endforeach; ?> </div> <?php }?> </div> <?php get_footer();