Kleine aanpassing aan het “archief”

Archief per maand
Archief per maand

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:

  1. Backup maken van de (child-) them voor als je het verkloot 😉
  2. Bestandje maken met de code die het archief genereert en die in de “/inc” directory van je (child-) theme.
  3. Stukje code toevoegen aan de functions.php van de (child-) them.
  4. De widget die het archief toon wegmikken en de nieuwe neerzetten (als text-widget)

Het stukje code voor het archief – (/inc/shortcodes.php):

  1. <?php
  2. // Prevent direct access to the file for security
  3. if (!defined('ABSPATH')) {
  4.     exit;
  5. }
  6.  
  7. function custom_smart_archive_list() {
  8.     global $wpdb;
  9.  
  10.     $current_year = (int)date('Y');
  11.     $last_year    = $current_year - 1;
  12.  
  13.     $output = '<ul class="custom-smart-archive">';
  14.  
  15.     // 1. Fetch monthly counts for Current and Last Year
  16.     $monthly_results = $wpdb->get_results("
  17.         SELECT YEAR(post_date) as year, MONTH(post_date) as month, COUNT(ID) as post_count 
  18.         FROM $wpdb->posts 
  19.         WHERE post_type = 'post' AND post_status = 'publish'
  20.         AND YEAR(post_date) IN ($current_year, $last_year)
  21.         GROUP BY YEAR(post_date), MONTH(post_date)
  22.         ORDER BY post_date DESC
  23.     ");
  24.  
  25.     foreach ($monthly_results as $row) {
  26.         $dateObj   = DateTime::createFromFormat('!m', $row->month);
  27.         $monthName = wp_date('F', $dateObj->getTimestamp()); 
  28.         $archive_link = get_month_link($row->year, $row->month);
  29.  
  30.         // Zet de maand om naar kleine letters en maak de eerste letter een hoofdletter
  31.         $formattedMonth = mb_ucfirst(mb_strtolower($monthName, 'UTF-8'));
  32.  
  33.         if ((int)$row->year === $current_year) {
  34.             $output .= sprintf('<li><a href="%s">%s (%d)</a></li>', esc_url($archive_link), $formattedMonth, $row->post_count);
  35.         } else {
  36.             $output .= sprintf('<li><a href="%s">%s %d (%d)</a></li>', esc_url($archive_link), $formattedMonth, $row->year, $row->post_count);
  37.         }
  38.     }
  39.  
  40.     // 2. Fetch purely yearly counts for anything older than Last Year
  41.     $yearly_results = $wpdb->get_results($wpdb->prepare("
  42.         SELECT YEAR(post_date) as year, COUNT(ID) as post_count 
  43.         FROM $wpdb->posts 
  44.         WHERE post_type = 'post' AND post_status = 'publish'
  45.         AND YEAR(post_date) < %d
  46.         GROUP BY YEAR(post_date)
  47.         ORDER BY year DESC
  48.     ", $last_year));
  49.  
  50.     foreach ($yearly_results as $row) {
  51.         $archive_link = get_year_link($row->year);
  52.         $output .= sprintf('<li><a href="%s">%d (%d)</a></li>', esc_url($archive_link), $row->year, $row->post_count);
  53.     }
  54.  
  55.     $output .= '</ul>';
  56.     return $output;
  57. }
  58. add_shortcode('smart_archive', 'custom_smart_archive_list');
  59.  
  60. // Helper functie om de eerste letter van een UTF-8 string een hoofdletter te maken
  61. if (!function_exists('mb_ucfirst')) {
  62.     function mb_ucfirst($string, $encoding = 'UTF-8') {
  63.         $firstChar = mb_substr($string, 0, 1, $encoding);
  64.         $then = mb_substr($string, 1, null, $encoding);
  65.         return mb_strtoupper($firstChar, $encoding) . $then;
  66.     }
  67. }

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):

  1. // Load custom shortcodes file
  2. require( 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)

Archief per jaar
Archief per jaar

Text-widget instellen
Text-widget instellen

 

 

 

 

 

 

 

 

 

All done…

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.