Afficher les articles d’une catégorie

0 Flares 0 Flares ×

WordpressVoila un petit bout de code vous permettant d’extraire les articles d’une catégorie de votre blog WordPress, en utilisant un shortcode, pour les intégrer où vous voulez.

Le code à placer dans le fichier functions.php de votre thème :

function jc_post_by_category($atts, $content = null) {
extract(shortcode_atts(array(
"nb" => '5',
"orderby" => 'post_date',
"order" => 'DESC',
"category" => '1'
), $atts));
global $post;
$tmp_post = $post;
$myposts = get_posts('showposts='.$nb.'&orderby='.$orderby.'&category='.$category);
$out = '<ul>';
foreach($myposts as $post){
setup_postdata( $post );
$out .= '<li><a href="'.get_permalink().'">'.the_title("","",false).'</a></li>';
}
$out .= '</ul>';
wp_reset_postdata();
$post = $tmp_post;
return $out;
}
add_shortcode("post-by-category", "jc_post_by_category");

pour l’appeler dans une page :

[post-by-category category="19"]

Vous pouvez également, par exemple, l’ajouter à un widget texte dans votre sidebar, mais il faudra auparavant ajouter ce petit bout de code pour que le shortcode soit interprété :

add_filter('widget_text', 'do_shortcode');

Ce shortcode est vraiment basique, mais la logique est là !
Jetez un oeil à la doc de get_posts pour plus de détails.

Si vous voulez allez beaucoup plus loin, et insérer n’importe quoi (articles, pages, images, custom post type, …), n’importe où (une page, un widget, un template php, …) directement depuis l’admin de WordPress, allez voir le super plugin inject (c’est nous qu’on l’a fait :) )

0 Flares Twitter 0 Facebook 0 Google+ 0 Buffer 0 0 Flares ×

« »

21 commentaires sur “Afficher les articles d’une catégorie

  1. Ines

    Merci pour le tuto, mais si on veut afficher un extrait des articles d’une catégorie,non pas une liste comment on peut procéder?
    merci d’avance

  2. Bibichette Auteur

    Avec la fonction get_the_excerpt on peut récupérer l’extrait d’un article. La fonction pourrait être modifiée ainsi :

    foreach($myposts as $post){
        $out .= '<li><a href="'.get_permalink().'">'.the_title("","",false).'</a>';
        $out .= get_the_excerpt();
        $out .= '</li>';
    }
    

    Pour plus d’infos sur la fonction get_the_excerpt

  3. Simon Frédéric

    Bonjour,
    J’ai intégré la portion de code et placé un widget texte dans la page sur les champignons.
    Voir ici : http://www.smsgl.fr/wp/?page_id=1248
    En fait, que faut-il modifier pour qu’à la place de 19 dans
    [post-by-category category="19"] du widget texte,
    la requête permette d’afficher la liste des articles de la catégorie sélectionnée dans la liste des catégories, et non toujours celle de la n° 19 ?
    C’est peut-être basique, mais j’ai de plus en plus de mal à passer des heures pour essayer de comprendre ;-)

  4. Bibichette Auteur

    En il faut « juste » changer category="19" par category="10" par exemple.

    Le problème est peut-être plus pour arriver à obtenir le bon ID pour la catégorie, qui n’est pas afficher par défaut dans WordPress.
    Un moyen pour trouver cette ID est de se rendre dans l’admin de WordPress et aller dans la modification de la catégorie. Ensuite on peut retrouver l’ID en regardant l’URL de la page : http://www.bibichette.com/.../edit-tags.php?action=edit&taxonomy=category&tag_ID=3&post_type=post
    L’ID de la catégorie correspond au chiffre juste après tag_ID=. Ici c’est 3.

    On pourrait modifier la fonction pour que cela fonctionne avec le slug (identifiant, pas le nom) de la catégorie :

    function jc_post_by_category($atts, $content = null) {
        extract(shortcode_atts(array(
            "nb" => '5',
            "orderby" => 'post_date',
            "order" => 'DESC',
            "category_name" => ''
        ), $atts));
        global $post;
        $tmp_post = $post;
        $myposts = get_posts('showposts='.$nb.'&orderby='.$orderby.'&category_name='.$category_name);
        $out = '<ul>';
        foreach($myposts as $post){
            $out .= '<li><a href="'.get_permalink().'">'.the_title("","",false).'</a></li>';
        }
        $out .= '</ul>';
        $post = $tmp_post;
        return $out;
    }
    add_shortcode("post-by-category", "jc_post_by_category");
    

    pour l’appeler dans une page :

    [post-by-category category_name="champignon"]

    ou

    [post-by-category category_name="champignon,cle-de-determination"]

    voila.
    J’ai l’impression d’avoir compliqué le truc :)

  5. math

    Salut ! Merci beaucoup pour ce code qui m’a bien aidé !

    Je voudrais savoir s’il est possible d’afficher le contenu entier de l’article en dessous du titre ?

    Merci encore !

  6. Bibichette Auteur

    Pour avoir le contenu entier de l’article il faudra utiliser la fonction get_the_content() à la place de get_the_excerpt() :

    foreach($myposts as $post){
        $out .= '<li><a href="'.get_permalink().'">'.the_title("","",false).'</a>';
        $out .= get_the_content();
        $out .= '</li>';
    }
    
  7. Moureuse

    Bonjour,

    Un grand merci pour cette explication qui tombe juste au bon moment!
    Cependant en rajoutant get_the_excerpt(); ou get_the_content(); c’est le contenu de la page sur laquelle est le shortcode qui s’affiche et non les articles de la catégorie choisie. Par contre, j’ai bien le titre de ma catégorie.

  8. Simon Frédéric

    Bonsoir,
    je reviens à propos de ma page sur les champignons.
    En fait je cherche à récupérer le n° de la catégorie demandée par un clic lambda d’un internaute, pour afficher les articles de la catégorie sélectionnée.
    Par exemple, pour la catégorie Ascomycètes, le n° est 22; Il faudrait que la fonction récupère ce numéro, et qu’elle l’affecte dans le widget texte juste en-dessous, et donc permette d’afficher les deux posts dans ce widget.
    Cela permettrait de créer un sous-menu en quelque sorte.
    Merci beaucoup pour votre aide.

  9. Claude

    Bonjour et merci pour le partage.

    J’ai testé l’afficher les articles d’une catégorie avec l’affichage de l’extrait or je constate que lorsque l’article n’a pas d’extrait, c’est le contenu de la page où on utilise le shortcode qui s’affiche.
    Etrange non ?

  10. Bibichette Auteur

    En fait j’ai peut-être oublié un bout de code permettant, suivant le contexte dans lequel est appelé le shortcode (par ex. si le shortcode est appelé à l’intérieur d’une autre boucle), d’initialiser certaines variables globales pour justement pouvoir appeler des fonctions comme get_the_excerpt en utilisant le post en cours.
    j’ai rajouté au début de ma boucle setup_postdata( $post ); et à la fin de ma boucle wp_reset_postdata();

    Je n’ai pas testé mais ça doit être ça :)

  11. jumpinsteph

    bonjour,

    merci pour ce code.
    j’ai par contre le même souci que Moureuse ou Claude, par rapport à l’affichage du contenu de l’article.
    je ne vois pas où il faut placer setup_postdata( $post ) et wp_reset_postdata();

    j’ai essayé différents endroits, mais pas vraiment concluant… est-ce qu’il serait possible de donner plus de précision ? merci bcp

  12. Pierre

    Bonjour,

    excellent tuto, ça marche parfaitement à partir du moment où, en effet, on réinitialise le « postdata ».
    Merci, merci et merci. :)

    Par contre, une petite question :

    - dans mon code-source, ma liste d’article est entourée par les balises et , est-ce normal ? Est-il possible de les supprimer ? Et si oui, comment ?

    Car point de vue sémantique elle ne m'apporte rien bien au contraire, et point de vue mise en forme de ma page, je me retrouve à devoir les neutraliser en CSS... Bref c'est pas très propre :(

    Merci d'avance pour votre réponse.

  13. Pierre

    désolé pour le message précédent, forcément le html est activé… donc je disais :

    dans mon code-source, ma liste d’article est entourée par les balises et « pre » et « code »

  14. Bibichette Auteur

    Bonjour,

    tout d’abord il faut bien définir dans votre fonction global $post;
    ensuite dans votre boucle sur les posts faire un setup_postdata( $post );
    et après la boucle un wp_reset_postdata();

  15. Bibichette Auteur

    Bonjour,

    dans WordPress, il y a une fonction automatique plutôt agaçante qui corrige et créée des balises HTML à l’affichage des pages. Je comprend vraiment pas l’intérêt de cette fonction, car on ne maitrise plus du tout le code généré. La fonctione s’appelle wpautop

    Bref, c’est cette fonction qui doit mettre la grouille. Il existe des solutions :

    • désactiver wpautop, mais ça va être plutôt gênant à pleins d’autres endroits
    • modifier l’ordre d’appel du filtre wpautop et do_shortcode
    • utiliser un plugin qui fait ça comme il faut
    • optimiser le code de votre fonction, pour coller toutes les balises sans espace ni saut de ligne entre elles
    • ...

    Google vous aidera à trouver une solution efficace.

    C'est quand même bizarre qu'il génère une balise pre et code quand même !
    N'avez vous pas inséré votre shortcode dans du contenu qui contient ces balises ? ou peut-être que le code que vous généré n'est pas bon : balise non fermée, mauvais nom de balise, ...

  16. matt

    Bonjour,

    Je ne saisi toujours pas ou mettre un setup_postdata( $post ); et un wp_reset_postdata();
    S’agit il du fichier function ?

  17. Bibichette Auteur

    C’est comme dans l’exemple de l’article. setup_postdata et wp_reset_postdata sont bien inclus dans la fonction. et cette fonction est incluse dans le fichier functions.php.