
Het archief werd een beetje lang. Voor iedere maand dat er tenminste 1 bericht is geplaatst zie the “Maand (1)” ofzo en aangezien ik al bezig ben sinds 2011 werd die lijst een beetje lang. Ik kon niet echt een goed alternatief vinden en heb daarom zelf maar wat verzonnen. Sommige stukjes code zijn “beter goed gejat dan slecht bedacht”.
De laatste keer dat ik in WordPress heb lopen “hacken” is al denk ik al weer een jaar of vijf geleden. Ik heb toen veelvuldig de documentatie van WordPress erbij moeten pakken en vragen gesteld op het gebruikersforum van het Theme die ik gebruik. Aangezien dit meer een aanpassing is van WordPress zelf dan van de theme wilde ik het als plugin maken maar google vond het handiger om dit als toevoeging te zien van de theme. Oke.
Het komt in het kort op neer dat je 4 dingen moet dan:
- Backup maken van de (child-) them voor als je het verkloot 😉
- Bestandje maken met de code die het archief genereert en die in de “/inc” directory van je (child-) theme.
- Stukje code toevoegen aan de functions.php van de (child-) them.
- De widget die het archief toon wegmikken en de nieuwe neerzetten (als text-widget)
Het stukje code voor het archief – (/inc/shortcodes.php):
<?php// Prevent direct access to the file for securityif (!defined('ABSPATH')) {
exit;
}function custom_smart_archive_list() {
global $wpdb;
$current_year = (int)date('Y');
$last_year = $current_year - 1;
$output = '<ul class="custom-smart-archive">';
// 1. Fetch monthly counts for Current and Last Year$monthly_results = $wpdb->get_results("
SELECT YEAR(post_date) as year, MONTH(post_date) as month, COUNT(ID) as post_countFROM $wpdb->postsWHERE post_type = 'post' AND post_status = 'publish'AND YEAR(post_date) IN ($current_year, $last_year)GROUP BY YEAR(post_date), MONTH(post_date)ORDER BY post_date DESC");
foreach ($monthly_results as $row) {
$dateObj = DateTime::createFromFormat('!m', $row->month);
$monthName = wp_date('F', $dateObj->getTimestamp());
$archive_link = get_month_link($row->year, $row->month);
// Zet de maand om naar kleine letters en maak de eerste letter een hoofdletter$formattedMonth = mb_ucfirst(mb_strtolower($monthName, 'UTF-8'));
if ((int)$row->year === $current_year) {
$output .= sprintf('<li><a href="%s">%s (%d)</a></li>', esc_url($archive_link), $formattedMonth, $row->post_count);
} else {
$output .= sprintf('<li><a href="%s">%s %d (%d)</a></li>', esc_url($archive_link), $formattedMonth, $row->year, $row->post_count);
}}// 2. Fetch purely yearly counts for anything older than Last Year$yearly_results = $wpdb->get_results($wpdb->prepare("
SELECT YEAR(post_date) as year, COUNT(ID) as post_countFROM $wpdb->postsWHERE post_type = 'post' AND post_status = 'publish'AND YEAR(post_date) < %dGROUP BY YEAR(post_date)ORDER BY year DESC", $last_year));
foreach ($yearly_results as $row) {
$archive_link = get_year_link($row->year);
$output .= sprintf('<li><a href="%s">%d (%d)</a></li>', esc_url($archive_link), $row->year, $row->post_count);
}$output .= '</ul>';
return $output;
}add_shortcode('smart_archive', 'custom_smart_archive_list');
// Helper functie om de eerste letter van een UTF-8 string een hoofdletter te makenif (!function_exists('mb_ucfirst')) {
function mb_ucfirst($string, $encoding = 'UTF-8') {
$firstChar = mb_substr($string, 0, 1, $encoding);
$then = mb_substr($string, 1, null, $encoding);
return mb_strtoupper($firstChar, $encoding) . $then;
}}
Het script laat van het huidige jaar alleen de maanden zien waarin berichtjes zijn geplaatst. Dan van het vorige jaar (2025) in dit geval worden ook alle maanden met berichten getoond maar dan inclusief het jaar – en daarna alleen het jaar. Lijkt mij wel netjes zo.
De aanpassing in functions.php (ergens onderaan in dat bestandje):
// Load custom shortcodes filerequire( get_stylesheet_directory() . '/inc/shortcodes.php' );
En dan nog even de bestaande archive-widget vervangen voor de text-widget en daar de shortcode smart_archive in plakken (tussen blokhaken)


All done…