Tout savoir sur WordPress
Tutoriel WordPress

Afficher les archives mensuelles des articles classés par années

À l’aide de cette astuce, découvrez comment afficher les archives mensuelles des articles classés par années.

J’ai eu besoin d’afficher les archives d’un blog en mettant l’année en en-tête et les mois en-dessous. N’ayant pas trouvé de solution toute faite dans WordPress, j’ai réalisé une petite fonction et je vous la partage.

Copier le code ci-dessous dans le fichier functions.php présent à la racine de votre thème :

function archives_by_year( $args = null ) {
    $defaults = array(
        'type' => 'monthly', 'limit' => isset( $args['limit'] ) ? $args['limit'] : '',
        'format' => 'custom', 'before' => '',
        'after' => '', 'show_post_count' => isset( $args['show_post_count'] ) ? (bool)$args['show_post_count'] : false,
        'echo' => false
    );
    $all_archives = explode( "n", wp_get_archives( $defaults ) );
    $new_archives = array();
   
    for( $i=0; $i< count( $all_archives )-1; $i++ ) {
        $year = substr( $all_archives[$i], strpos( $all_archives[$i], '</a>' )-4, 4 );
        $new_archives[$i] = array(
        	'month' => ucwords( trim( str_replace( ' '.$year.'</a>', '</a>', $all_archives[$i] ) ) ),
                'year' => $year 
        );
    }
    $month = '';
	
    $i=0;
    echo $output . '<ul>'; 
    foreach( $new_archives as $n ){
        
        if( $year != $n['year'] ) {
            $year = $n['year'];
            $output .=  ( $i == 0 ) ? '<li><span class="annee">' . $year . '</span><ul>' : '</ul><li><span class="annee">'.$year.'</span><ul>';
        }
        $output .= '<li>' . $n['month'] . '</li>';
        
        $i++;
    }
    echo $output . '</ul>';
}

Dans votre template – à l’endroit où vous avez besoin d’afficher ces archives, voire même où vous souhaitez remplacer les anciennes archives – il est nécessaire d’inscrire ceci (par défaut, pas d’affichage du nombre d’articles et aucune limite) :

Le résultat est le suivant :

Pour les arguments, vous pouvez utiliser « limit » et « show_post_count » comme pour wp_get_archives sur lequel ce code se base. Voici un exemple pour les 12 derniers mois seulement, avec affichage du nombre d’articles :

<?php archives_by_year( array( 'show_post_count'=>true, 'limit'=>12 ) ); ?>

Les autres arguments ne sont plus disponibles, cela n’est pas trop grave. Il vous suffit de modifier le code HTML si vous préférez utiliser d’autres balises que des UL et LI.

Ce dernier exemple nous donne :

Bon codage  ;)

Cet article a été mis à jour il y a 2291 jours - Il n'est peut être plus à jour !

Article écrit par Julio P.

Co-fondateur de WP Media, la startup Lyonnaise qui a créé WP Rocket et Imagify, Julio Potier est un Expert WordPress, un Formateur Expérimenté et un Consultant en Sécurité Web.

Il aime partager ses compétences et ses réflexions sur WordPress, donnant des conférences partout dans le monde.

12 Commentaires

  1. Décidément, tu as le chic pour poster ce dont j’ai besoin. Je vais tester tout ça la semaine prochaine et je te ferai le retour utilisateur.
    Merci encore pour cette astuce.

    Cordialement,
    Yannick

  2. Et voila, testé, approuvé. 3min et ça fonctionne, c’est ce qu’on appelle une bonne fonction ^^.
    Si vous voulez le voir en action, here we go :
    roe.fr

    C’est dans le pied de page. Merci encore Julio, bonne semaine.

  3. Bien joué, je travaille justement sur un plugin qui est en relation avec les archives (mais je n’aurais pas besoin de ton code >_>) #teaser.

    Merci pour l’astuce, je sais où la trouver si besoin :)

  4. Merci beaucoup pour ce code très utile, que je cherchais depuis un moment !
    Juste une remarque, j’ai été obligé de définir la variable $output :
    $output= »;
    car j’avais un warning
    Notice: Undefined variable: output in…
    Bon ça n’empêche pas le script de fonctionner, mais ça fait plus propre ;-)
    Merci encore pour ton travail.

  5. Bonjour,

    Tout d’abord merci pour ce tutoriel très pertinent.
    Celui-ci correspond tout à fait à ce dont j’ai besoin. Cependant, je me permets de vous poser une question car en le mettant en place j’ai une erreur qui indique « Warning: strpos() [function.strpos]: Empty delimiter « .
    Pouvez-vous me dire d’où cela provient et comment afficher correctement le rendu ?

    Je vous remercie par avance pour votre réponse.

  6. oups..
    je ne dois pas en être bien loin.
    les mois s’affichent bien mais pas les année :-(
    > Un grand merci pour tous ces tutos !

  7. Bonjour,

    Pour actualiser rapidement le code il faut :
    – initialiser la variable $output =  »; en début de fonction,
    – Remplacer la ligne  »
    $year = substr( $all_archives[$i], strpos( $all_archives[$i],  » )-4, 4 );
     » par ces deux lignes  »
    preg_match(« /(?Pd+)/ », $all_archives[$i],$year);
    $year = $year[‘digit’];
    « .

    Et tout fonctionne !
    La démo est ici : http://numeridome.fr/items/date/2010/00

    Sébastien

  8. Suite…

    Lors de l’envoi du commentaire le signe égal est remplacé par un underscore…

    Donc en français dans le texte :
    1- $output = '';
    2- $year = $year[‘digit’];

    Et le masque de recherche est modifié également…
    /(?P<digit>d+)/

    Sébastien

  9. Bonjour,

    J’ai eu les mêmes problèmes que Patricia et franckds.

    La solution et les explications à ces bugs sont sur le site numeridome.fr.
    Il faut chercher l’Item 107, publié en Janvier 2015, dans les catégories PHP ou WordPress.

    Cordialement,

    Sba

af624d1df86b1e492ffa79463a2b9110[[[[[[[[[[[[[[[[[[[[[[[[[[