WordPress: Les archives par mois et par année

Les archives sur un blog posent en général, un problème assez bête: après quelques mois de fonctionnement, la sidebar est envahie par une liste de plusieurs dizaines de liens datés par mois. Lors de la conception du site, je cherchais un plug-in capable d’afficher les archives par mois pour l’année en cours, puis par année pour les années précédentes.

Mes recherches étant infructueuses, j’ai développé la fonction PHP adéquate, en m’inspirant largement de la fonction native de WordPress. Je vous propose cette fonction.

Installation

  • Repérez le fichier functions.php qui est situé à la racine de votre thème. Ce fichier se trouve normalement dans le répertoire /wp-content/themes/<votre thème>. Si ce fichier n’existe pas créez-le,
  • Téléchargez le fichier suivant: wp_get_archives_advanced.zip,
  • Décompressez-le, et copiez le contenu du fichier wp_get_archives_adv.php dans le fichier functions.php.

J’étudierai ultérieurement comment créer une méthode d’installation plus conviviale que celle-ci.

Documentation

Description

Cette fonction affiche donc une liste d’archives, regroupées par année pour les articles antérieurs à une date pivot spécifiée, et regroupées par mois, pour les articles postérieurs à cette même date pivot. Cette fonction peut être utilisée n’importe où dans un fichier modèle.

Utilisation

<?php wg_get_archives_advanced('paramètres'); ?>

Les paramètres par défaut sont:

$defaults = array(
'pivot' => 0,
'limit' => '',
'format' => 'html',
'before' => '',
'after' => '',
'show_post_count' => false);

Paramètres

  • pivot
    • (entier) année pivot (défault l’année en cours),
  • limit
    • (entier) Nombre de lignes maximum souhaité (défault 0, pas de limite),
  • format
    • (chaîne de caractères) Format de la liste. Valeurs possibles:
      • html: liste non ordonnée (balises ul/li) – Utilise également les paramètres before et after – Valeur par défaut,
      • option: liste de sélection (balises select / option),
      • custom: format personnalisé en utilisant les paramètres before et after.
  • before
    • (chaîne de caractères) Texte placé devant le lien. Argument utilisé pour les valeurs html et custom de l’argument format. Pas de valeur par défaut.
  • after
    • (chaîne de caractères) Texte placé après le lien. Argument utilisé pour les valeurs html et custom de l’argument format. Pas de valeur par défaut.
  • show_post_count
    • (booléen) Affiche la liste des articles par archive si la valeur est 1 (ou TRUE) ou ne l’affiche pas si la valeur est 0 (ou FALSE). Valeur par défaut: 0.

Exemples d’utilisation

<h2>Archives</h2>
<ul>
<php wp_get_archives_advanced('pivot=&limit=0&format=html&before=&after=&show_post_count=1')?>
</ul>

Ce code donnera le résultat suivant:

Archives

  • 2006
  • 2007
  • Jan 2008
  • Fév 2008
  • Mar 2008

Fonction(s) liée(s)

wp_get_archives

Conclusion

La fonction wp_get_archive_advanced permet d’afficher les archives par mois ET par année, limitant ainsi le nombre de lignes affichées dans la sidebar.

La documentation et la méthode d’installation sont encore sommaires. Je les améliorerai lorsque mes connaissances sur WordPress se seront un peu étoffées.

20 thoughts on “WordPress: Les archives par mois et par année”

  1. Merci bien, ça m’a aidé pour afficher les archives que pour une catégorie voulue. J’ai modifié juste la requête :

    $arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(t.slug) as posts FROM $wpdb->posts AS p
    INNER JOIN $wpdb->term_relationships AS tr ON (p.ID = tr.object_id)
    INNER JOIN $wpdb->term_taxonomy AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
    LEFT JOIN $wpdb->terms AS t ON (tt.term_id = t.term_id)
    WHERE post_type = 'post'
    AND post_status = 'publish'
    AND tt.taxonomy = 'category'
    AND t.slug = 'le_slug_de_la_catégorie'
    GROUP BY YEAR(post_date), MONTH(post_date)
    ORDER BY post_date DESC");

    À priori ça fonctionne, merci encore 😉

  2. Bonjour,

    Merci pour cette fonction fort utile!
    Perso, je l’ai fait évoluer de manière à ne remonter que les mois qui correspondaient à l’année passée en paramètre (si celle-ci est renseignée). Par défaut, ceux de l’année en cours.

    A rajouter :

    global $wp_query;
    $theyear=$wp_query->query_vars[‘year’];
    if(isset($theyear) && $theyear > 0){
    $pivot_year=$theyear;
    }

    A remplacer :
    if ($arcresult->year year != $pivot_year) {

    Exemple visible ici :
    http://inspirationshabby.fr

  3. Bonjour,

    J’ai activé le count des posts et tout fonctionne à merveille 😉 mais j ai un problème avec le count pour les années précédentes.

    Par exemple en 2010 j’ai 6 posts mais il ne m’affiche que 3 (-> 2010 (3)) je comprend pas sur quoi il se base… alors qu’en 2009 j en ai 1 et il m’affiche 1.

    Cordialement.

  4. Merci bcp mais je l’ai déjà trouvé.J’ai modifié dans general_template.php ligne 839. 😉

  5. @Talian:
    Si la question est de regrouper les articles par mois, le widget standard suffit.
    Si la question de n’afficher que le mois (et pas mois+annee) pour l’annee en cours, il faut modifier la ligne 116 du fichier eg-archives.php

    Je note cette remarque pour une prochaine version.

  6. Merci pour cette fonction vraiment très pratique.
    Une présentation optimale, un gain de place et tout cela sans plugin, bravo…

  7. @Ben:
    Bonjour
    Cette demande n’est pas la premiere, mais j’ai du mal a comprendre son utilite. En effet, le but du widget est avant tout d’afficher des dates. En cliquant sur les liens, alors seulement les articles s’affichent.
    Donc proposer un filtre par categorie, au niveau du widget ne fera que limiter le nombre de dates proposees. Il faudra par ailleurs, au niveau du theme, modifier le fichier archive.php pour qu’il n’affiche que les articles de la (ou des) categorie voulue. Mais dans ce cas comment transmettre la liste de ces categories?

    Je peux prendre en compte votre demande, mais il faut m’en dire plus sur ses finalites …

    Emmanuel.

  8. Bonjour,

    Tout d’abord merci pour cette fonction, très pratique. Mais il me semble qu’il lui manque un paramètre, à mon sens, essentiel : filtrer les catégories. En effet, je ne voudrais lister que les articles d’une catégorie particulière (‘blog’ en l’occurrence).

    Une telle fonctionnalité serait particulièrement utile pour tous thème wordpress ‘CMS’.

    Ma question est donc la suivante : comment faire en sorte qu’un tel filtrage soit possible ?

    Merci d’avance pour votre réponse.
    Cordialement,
    Ben.

  9. L’appel a la fonction doit se faire dans le fichier sidebar.php.
    Mais les choses se compliquent si la sidebar en question est dynamique (si elle accepte les widgets). En plus, dans le cas du theme Atahualpa, le fichier sidebar.php n’existe pas.

  10. ça serait génial car j’ai beaucoup cherché sur le net et vous êtes le seul à proposer la solution à ma connaissance.
    tenez moi au courant.
    merci beaucoup

    laurence

    ps :mais pour info, où doit on ajouter l’appel a la fonction wp_get_archives_advanced ?

  11. Je vais transformer ces lignes de code en Widget.
    Je voulais le faire depuis un moment déjà, c’est l’occasion.

  12. bonsoir,

    houps ! je crois que je n’ai pas tout fait comme il faut !

    j’ai loupé le point 2 :

    2- ajouter l’appel a la fonction wp_get_archives_advanced, a l’endroit voulu.

    désolée mais là, vous me parlez chinois ! ( déjà que c’était pas simple pour moi …)

    donc la question du soir est : quel est l’endroit voulu pour placer cette fonction ?

    mes seules capacités en code sont globalement de changer les couleurs et la taille du texte dans la feuille de style…. là j’avoue que je suis perdue.

    merci de votre aide en tous les cas.

  13. Il y a deux étapes dans la manip:
    1- ajouter le code dans le fichier functions.php,
    2- ajouter l’appel a la fonction wp_get_archives_advanced, a l’endroit voulu.

    Qu’est ce qui ne marche pas exactement?

  14. Désolée mais cela ne marche pas.
    je suis en WP 2.7
    mon template est atahualpa 3.2
    j’ai bien copié le code dans l’endroit voulu mais rien n’y fait.
    des idées ?

    merci
    laurence

  15. Bonjour,

    Il faudrait décidement que je transforme ce code en plugin. Je ne savais pas le faire à l’époque.
    Le code doit être collé dans le fichier functions.php qui se trouve à la racine de votre thème, c’est-à-dire dans wp-content/themes/<nom du thème>.
    Si le fichier n’existe pas, il faut le créer.

  16. bonjour,

    pouvez vous m’expliquer ou je dois copier le code exactement ?

    est ce dans le WPincludes / functions.php ?
    si oui, à quel endroit exactement ?

    en vous remerciant de votre réponse.
    cordialement
    laurence

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *