Vous êtes ici : » » Catégories : PHP  >/ WordPress  » Item : Lister les archives WordPress par années et par mois

Item 107

Lister les archives WordPress par années et par mois

Mise à jour du 20 janvier 2015

Lister et faire des liens directs, permaliens, vers les pages d’archives mensuelles de WordPress

Il y a quelques temps je cherchais une solution simple et rapide pour lister toutes les archives mensuelles de WordPress classées par années.

De préférence dans une simple liste <ul> pour les années et des <ul> imbriqués dans les <li> de la liste année pour les mois ou il y avait des articles.

J’ai rapidement trouvé une petite fonction sur un blog de geek WordPress. Elle semblait fonctionner en 2012, d’après les commentaires, mais maintenant était en erreur.

Seulement cette fonction crée des erreurs…

Donc, pour information, si vous avez une fonction qui vous retourne comme erreur : strpos(): Empty needle ou Warning: strpos() [function.strpos]: Empty delimiter, qui dit que $output est indéfini et n’affiche pas les années… et que c’est la même fonction que celle que j’avais trouvé,

  • La première erreur est liée à la ligne :

$year = substr( $all_archives[$i], strpos( $all_archives[$i], '' )-4, 4 );

Le second argument de strpos() ne peut être une chaine vide.

Il faut ici extraire l’année, dans une chaine de texte de type ‘Janvier 2015 (3)’.
On peut donc utiliser une expression rationnelle standard avec preg_match() en lieu et place :

preg_match("/(?P<digit>\d+)/", $all_archives[$i], $year);

Puis récupérer la valeur qui nous intéresse dans la table des résultats :

$year = $year['digit'];

 

  • La seconde erreur est liée à la ligne :

echo $output . '<ul>';

La variable $output n’a pas été initialisée.
Il suffit de déclarer et initialiser la variable en début de fonction.

Améliorations de la fonction

Finalement, j’ai légèrement modifié le fonctionnement  puisque maintenant elle retourne une valeur et que cela oblige à faire un echo quand on l’invoque.
Mais c’est « plus propre » et puis cela m’arrangeait ainsi. 😉

La fonction modifiée devient donc :

//    LISTER LES ARCHIVES PAR ANNEES ET MOIS
    function liste_archives( $args = null ) {
    
        $sortie    = '';
        $an        = '';
        $mois    = '';
        
        $params    = 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
                        );
                        
        $tts_archives    = explode( "\n", wp_get_archives( $params ) );
        $nv_archives    = array();
        
        for( $i = 0; $i < count( $tts_archives )-1; $i++ ) {
            //echo $tts_archives[$i];    //    pour le débug
            preg_match('/(?P<digit>\d+)/', $tts_archives[$i], $an);
            //print_r($an);    //    pour le débug
            $an = $an['digit'];
            $nv_archives[$i] = array(
                'mois' => ucwords( trim( str_replace( ' '.$an.'', '', $tts_archives[$i] ) ) ),
                'an' => $an
                );
        }    //    fin de for
        
        $i = 0;        
        $sortie .= '<ul>';
        foreach( $nv_archives as $a ) {
            if( $an != $a['an'] ) {
                $an = $a['an'];
                array_reverse ($a); // Pour afficher Janvier en début de liste
                $sortie .= ( $i == 0 ) ? '<li><span class="annee">' . $an . '</span><ul>' : '</ul><li><span class="annee">'.$an.'</span><ul>';
            }    //    fin de if
            $sortie .= '<li>' . $a['mois'] . '</li>';
            $i++;
        }    //    fin de foreach
        
        unset($an, $mois, $params, $tts_archives, $nv_archives, $i, $a);    //    un peu de ménage avant de partir...
        
        return $sortie .= '</ul>';
        
    }    //    fin de fonction liste_archives
 

Cette fonction est idéalement à ajouter à la fin du fichier ‘functions.php’ de votre template WordPress.

Afficher la liste

Pour afficher la liste, il suffit d’ajouter au code source du fichier de template concerné :

<?php echo liste_archives( array( 'show_post_count'=>true, 'limit'=>24 ) ); ?>

La fonction accepte comme seuls arguments « limit » et « show_post_count » selon la syntaxe de wp_get_archives (dans une table).
L’exemple ci-dessus liste les archives sur les 24 derniers mois, avec l’affichage du nombre d’articles par mois.

Voilà, vous avez une petite fonction rapide et facilement modifiable en PHP pour lister toutes les pages d’archives mensuelles de WordPress  année par année.

Cet Item à été publié le 19 janvier 2015 par Sébastien
dans : PHP | WordPress
et est marqué :

Laissez un commentaire

« -o|o- »