Utiliser les tags / catégories pour vos Custom Post Types sous WordPress

51 commentaires
Utiliser les tags / catégories pour vos Custom Post Types sous WordPress
Les taxonomies par défaut de WordPress - que sont les catégories et les mots-clés (tags), peuvent être associées à n'importe quel type de contenu personnalisé.

Une technique que l’on peut également appliquer pour toutes les taxonomies personnalisés. De quoi satisfaire n’importe quel type classement pour vos contenus dans le back-office de WordPress.

Je pars du principe que vous disposez déjà d’un type de contenu personnalisé. Dans cet exemple, il s’agit de Produits dont voici le code à réutiliser dans un thème ou un plugin de fonctions globales :

function register_cpt_produit() {

    $labels = array(
        'name' => _x('Produits', 'produit'),
        'singular_name' => _x('Produit', 'produit'),
        'add_new' => _x('Ajouter', 'produit'),
        'add_new_item' => _x('Ajouter un produit', 'produit'),
        'edit_item' => _x('Editer un produit', 'produit'),
        'new_item' => _x('Nouveau produit', 'produit'),
        'view_item' => _x('Voir le produit', 'produit'),
        'search_items' => _x('Rechercher un produit', 'produit'),
        'not_found' => _x('Aucun produit trouvé', 'produit'),
        'not_found_in_trash' => _x('Aucun produit dans la corbeille', 'produit'),
        'parent_item_colon' => _x('Produit parent :', 'produit'),
        'menu_name' => _x('Produits', 'produit'),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Les produits de ma boutique.',
        'supports' => array('title', 'editor', 'thumbnail', 'custom-fields', 'revisions'),
        'taxonomies' => array('category', 'post_tag'),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_position' => 5,
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'has_archive' => true,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => true,
        'capability_type' => 'post'
    );

    register_post_type('produit', $args);
}
add_action('init', 'register_cpt_produit', 10);

Par défaut, un type de contenu ne dispose pas forcément d’une ou plusieurs taxonomies. C’est le cas des Pages qui constituent un type de contenu par défaut sous WordPress, à la différence des articles donc.

Pour associer les catégories et les mots-clés au custom post type Produits, remarquez la présence de la ligne 23 qui opère cette liaison.

Capture d'écran - Des catégories dans un type de contenu WordPress
Des catégories dans un type de contenu WordPress

Rendez-vous ensuite dans l’administration de WordPress puis remarquez l’association effective à la fois pour vos Articles (le cas par défaut) et vos Produits. Intéressant, non ?

Par Aurélien Denis

Consultant & Développeur WordPress / WooCommerce. Un site à créer, à maintenir ou à débuguer ? Contactez-moi.

51 commentaires
  1. MOREAU

    Bonjour,

    Je souhaite créer une page B (CPT B) à partir d’un formulaire (Formidable Form) sur une page A (CPT A).

    Je souhaite que la “catégorie” (taxonomie) de la page A soit automatiquement associée à la page B.

    Comment faire, svp ?

    Merci.

    Cdlt,

    Fabien

    1. Aurélien Denis auteur de l’article

      Faisable je dirais, mais il va falloir coder… pas possible de vous donner une réponse simple.

  2. mouzaia

    Bonjour, très intéressant en effet, mais je cherche un truc et je ne trouve pas. Je voudrais utiliser tant dans mes posts que mes pages que mes liens les même catégories, et je ne trouve pas, du moins pour les liens. Si je regarde dans mon wp_term, je vois bien toutes mes categories, mais aussi le descripteur “category” ou “link_category”. Que faire ?
    Merci

  3. Lythande

    Merci !
    J’ai une question : est-ce que c’est possible de rajouter une taxonomie (catégorie) dans le thème enfant ?

    1. Aurélien Denis auteur de l’article

      Bien sûr, il suffit de faire un register_taxonomy.

  4. Francois

    Bonjour
    j’ai pris un wordpress 4.1, mis le thème Twenty Fifteen et ajouter dans fonction.php votre cpt produit. J’ai créé un produit bidon avec un mot-clé. (toto)
    J’essaye d’afficher en cliquant sur produit/mot-clé puis afficher, cela m’affiche une belle page blanche.
    Je rajoute un article (dans Article) avec le même mot-clé que celui de produit et si je refais la manip pour afficher les mots clé je n’obtiens que l’article créé dans Article et non l’autre créé dans Votre CPT produit..

    J’ai du rater un truc parce que je ne vois pas pourquoi il ne veut pas m’afficher dans la boucle des tags l’article créé dans votre CPT.
    Cordialement

    1. Aurélien Denis auteur de l’article

      Bonsoir,

      il n’y a pas de raisons d’obtenir une page blanche. Peut être un problème d’hébergement qui manque de mémoire (cf. tutoriel pour augmenter la limite mémoire).

      La boucle des mots-clés n’affichera par défaut que les articles. Il faut utiliser une fonction comme pre_get_posts pour personnaliser cela.

  5. Olivier

    Bonjour,
    Est-il possible de créer par la suite des filtres sur ces catégories ?

    J’aimerai pouvoir créer des custom types pour des annonces auto, puis ensuite créer des filtres pour trier par modèles, années, etc…

    Merci ! 🙂

    1. Aurélien Denis auteur de l’article

      C’est tout le principe des custom taxonomies…

  6. jean

    Merci vous m’avez beaucoup aidé, car ça fait longtemps que je cherche cette solution pour mes tags et catégories.

  7. Hervé

    Bonjour,
    Bon ok je n’ai pas été clair.
    Je cherche à faire plusieurs listes/ annuaires (sites web, livres ….) en me basant sur les CPT et les articles de WP.
    Les catégories sont différentes pour chaque annuaire mais pas les tags. Je cherche donc un moyen d’avoir une seule base de mots clés qui soient réutilisables par tous les annuaires.

    J’ai testé plusieurs plugins (ACF …) et maintenant http://wordpress.org/plugins/pods/
    Cela me parait possible mais je n’y suis pas encore arrivé (pour avoir 1 seule taxonomie tags et des liens dans le menu pour chaque pods/annuaire)
    Voilà j’espère avoir été lus clair

    1. Aurélien Denis auteur de l’article

      Lors de la création des différents CPT, il te suffit d’indiquer les taxonomies à utiliser. Soient celles que WordPress créé par défaut (catégories et mots-clés), soient des nouvelles que tu ajoutes. Tout simplement ! 😉

  8. Hervé

    Bonjour,
    Je voudrai utiliser les tags de base (article) de WP dans d’autres CPT : annuaires (livres, vidéo, sites web …).
    Il me semble important d’unifier les tags pour une recherche unifié.
    Est-ce possible ?
    @+

    1. Aurélien Denis auteur de l’article

      N’est-ce pas l’objectif de ce tutoriel ?

  9. sylvainbr

    Normalement les catégories et les mots-clés existants ne doivent pas se mélanger.

    Sans en avoir rentré de nouvelles dans ce nouveau menu, je vois celles déjà rentrés par le biais de mes articles.

    Voici mon code (tiré de votre code):

    add_action( ‘init’, ‘register_cpt_documentation’ );

    function register_cpt_documentation() {

    $labels = array(
    ‘name’ => _x( ‘Documentations’, ‘documentation’ ),
    ‘singular_name’ => _x( ‘Documentation’, ‘documentation’ ),
    ‘add_new’ => _x( ‘Ajouter’, ‘documentation’ ),
    ‘add_new_item’ => _x( ‘Ajouter un document’, ‘documentation’ ),
    ‘edit_item’ => _x( ‘Editer un document’, ‘documentation’ ),
    ‘new_item’ => _x( ‘Nouveau document’, ‘documentation’ ),
    ‘view_item’ => _x( ‘Voir le document’, ‘documentation’ ),
    ‘search_items’ => _x( ‘Rechercher un document’, ‘documentation’ ),
    ‘not_found’ => _x( ‘Aucun document trouvé’, ‘documentation’ ),
    ‘not_found_in_trash’ => _x( ‘Aucun document dans la corbeille’, ‘documentation’ ),
    ‘parent_item_colon’ => _x( ‘Documentation parent :’, ‘documentation’ ),
    ‘menu_name’ => _x( ‘Documentations’, ‘documentation’ ),
    );

    $args = array(
    ‘labels’ => $labels,
    ‘hierarchical’ => false,
    ‘description’ => ‘Les documents dans l espace documentation.’,
    ‘supports’ => array( ‘title’, ‘editor’, ‘thumbnail’, ‘custom-fields’, ‘revisions’ ),
    ‘taxonomies’ => array( ‘category’, ‘post_tag’ ),
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘show_in_menu’ => true,
    ‘menu_position’ => 5,

    ‘show_in_nav_menus’ => true,
    ‘publicly_queryable’ => true,
    ‘exclude_from_search’ => false,
    ‘has_archive’ => true,
    ‘query_var’ => true,
    ‘can_export’ => true,
    ‘rewrite’ => true,
    ‘capability_type’ => ‘post’
    );

    register_post_type( ‘documentation’, $args );

    Si vous pouviez m’expliquer le dysfonctionnement, Merci

    1. Aurélien Denis auteur de l’article

      Quel est le problème précisément ?

  10. Nadege

    Bonjour
    Je viens de tenter le tuto qui es très intéressant merci
    J’aurais néanmoins une question
    Comment fait on pour afficher les post juste par catégorie
    Exemple dans catégorie j’ai cat1, cat2, cat3
    Je voudrais afficher juste les post de cat2 par exemple
    Merci
    Nadège

    1. Guillaume

      Bonjour et merci pour le tuto pour moi tout fonctionne sauf que comme Nadege je ne peux pas afficher par catégorie.
      As-tu trouvé une solution pour afficher les articles d’un custom post type par catégorie ?
      Si je clique sur une catégorie j’ai une erreur 404. As-tu le même problème ?

  11. JM

    Bonjour,

    Bravo pour le tuto, qui confirme ce que je pensais pour rattacher des tags / mots clés, mais je n’obtiens pas les CPT lorsque je clique sur un tag, en Front office, ni quand je fait une recherche sur un de ces tags => pas de renvoi au CP auquel a été rattaché le dit tag:
    – J’ai bien la ligne ” ‘exclude_from_search’ => false,” dans la création de mon CP ;
    – J’ai bien créée un tag et utilisé ce tag (ou d’autres..) attaché à un CP;
    -NB : j’utilise la version 3.7, le theme twentythirteen, et j’ai utilisé ACF pour creer des champs personnalisé sur les CP…

    Merci bcp pour un avis ou une solution,
    Cdt,
    JMB

    1. Aurélien Denis auteur de l’article

      Oui il faut faire un pre_get_posts pour filter en amont les résultats et inclure les différents types de contenu je pense… je n’ai pas de tutoriel sous la main par contre.

  12. Aurore dugaussy

    Bonjour Aurélien, félicitation pour ton site : une vrai niche de bonnes idées !!
    question : est-il possible d’avoir un menu horizontal uniquement constitué des tags qui permettrait de naviguer à travers les articles à conditions que les articles soient tous associés à des mots clés.
    ?
    Merci d’avance.
    Aurore

    1. Aurélien Denis auteur de l’article

      Dans Apparence > Menus du back-office de WordPress, il est possible de constituer un menu avec des mots-clés. Je ne pense pas que cela soit très SEO-friendly mais à voir. Sinon, le widget nuage de mots-clés fera l’affaire.

      Merci pour les compliments ! 😉

  13. Phoenix

    Bonjour Aurélien,

    J’utilise les custom post type (de type article), et tout fonctionne parfaitement bien.
    Lorsque je suis dans une archive de catégorie (celles de base de WP) sur le front office, j’affiche la description de cette catégorie (couplé avec le pluging “categorytinymce”).

    Par contre, quand je vais sur l’archive d’une catégorie de mes custom post type, la description ne s’affiche pas. Aurais-tu une idée de pourquoi ? Faut-il ajouter une ligne dans category.php ?

    J’utilise la dernière version de WP.

    Merci d’avance pour ton éventuelle réponse.

    1. Phoenix

      Merci mais je ne vois pas vraiment le rapport… je ne veux pas modifier l’affichage de la description de la catégorie, je veux qu’elle s’affiche pour les categories de mes custom post type.

      Pour le moment j’ai ceci pour définir cette catégorie (nommé “gamme”) :

      register_taxonomy( ‘gamme’, ‘product’, array( ‘hierarchical’ => true, ‘label’ => ‘Gamme’, ‘query_var’ => true, ‘rewrite’ => true ) );

      1. Aurélien Denis auteur de l’article

        En fait, tu veux afficher les descriptions des termes de ta taxonomie ? Dans ce cas, dans le codex tu trouveras la fonction term_description.

      2. Phoenix

        J’ai toutefois accès à la zone de texte pour écrire la description de la catégorie (la gamme) mais elle ne s’affiche pas sur le front.

        1. Phoenix

          Je vais regarder ça, merci.

        2. Phoenix

          J’ai trouvé, en fait tout ceci s’affiche dans archive.php et non dans category.php. Merci tout de même pour ton aide !

  14. xrainz

    Bonjour,
    Je viens juste de commencer à prendre en main wordpress et ses tutoriels.

    je me permets de réagir à ce post surtout pour poser une question.

    Je souhaite créér un formulaire par défaut dans la partie admin (éditeur ) (à la place de ajout article ) qui me permettre lorsque je clique sur nouveau formulaire, il s’affiche, mon éditeur (celui qui renseigne les articles) remplit les différents champs, et lorsque il clique sur submit, les différents champs renseignés sont enregistrés dans la bdd. ces éléments renseignés sont par la suite affchés en tant qu’article sur le site online grâce à une fonction
    suivant le template que j’ai crée pour l’affichage d’un article.

    Est ce grace aux custom post type, que l’on peux créer celà? j’espere que je me suis assez bien expliqué!.

    merci beaucoup.

    1. Aurélien Denis auteur de l’article

      Euh je ne suis pas sûr d’avoir compris. Je vous recommande la lecture du codex de WordPress pour étudier son fonctionnement général et sa philosophie. 😉

  15. Christophe Certain

    Post très intéressant, ça fonctionne effectivement très bien, par contre je n’arrive pas à trouver le contenu à mettre dans la page tag.php pour que ça fonctionne…

  16. Florent

    Merci pour ce tutoriel et en effet cela fonctionne bien avec les codes donnés…

    Par contre est-ce possible d’implémenter ce post_type dans un sous menu ?

    Après avoir créer mon menu :
    add_menu_page(__(‘SponsorPress Dashboard’,’sponsorpress’), __(‘SponsorPress’,’sponsorpress’), ‘activate_plugins’, ‘sponsor-dashboard’, ‘wpspo_dashboard’, WP_CONTENT_URL.’/plugins/sponsorpress/images/sponsor-menu-icon.png’ );

    Je tente de basculer le post-type créer ensuite dans ce menu avec ce code dans le post_type :
    ‘show_in_menu’ => ‘sponsor-dashboard’,

    Mais cela ne fonctionne pas !

    Merci

    1. Aurélien Denis auteur de l’article

      Hum aucune idée là par contre… je ne pense pas.

      1. Florent

        Re…

        Ben en fait j’ai réussi mais en le déclarant 2 fois. 1 fois avec add_action(“admin_menu”) et 1 autre avec add_action( ‘init’, ‘register_wpspo_projets’ ).

        Bon je pense que c’est très très très très moche mais ca marche et ca fait exactement ce que je veux…

  17. matthieu

    AH je viens de trouver une solution pour arriver à mettre catégory et post_tag.

    une fois enregistré notre custom post type, j’ai mis ceci à la suite:

    register_taxonomy_for_object_type(‘post_tag’, ‘formation’,’show_tagcloud=1&hierarchical=true’); // ajout des mots clés pour notre custom post type

    register_taxonomy_for_object_type(‘category’, ‘formation’,’show_tagcloud=1&hierarchical=true’); // ajout des catégories pour notre custom post type

  18. matthieu

    C’est étrange… Surtout que je viens deux créer un deuxième custom post type. Impossible de lier avec les taxo category et post_tag, par contre ma custom taxo se retrouve dans articles et les deux autres types créés…

    Je précise que j’ai la dernière version de wordpress (3.5.1) mais bon ça change rien….

  19. matthieu

    Bonjour Aurélien,

    C’est étrange je n’arrive pas à afficher les catégories et les mots-clefs, j’ai pourtant copié-collé ton code tout à la fin du fichier functions.php de mon thème.

    Je confirme que le custom post type “produits” est bien en back office lui.

    1. Aurélien Denis auteur de l’article

      Il ne faut pas reprendre tout le code long mais uniquement la ligne concernant les taxonomies à insérer dans le code de ton Custom Post Type. 😉

      1. matthieu

        Oui mais je n’avais pas mis de custom post type avant de voir ton code. Du coup je l’ai ajouté. Y compris avec la ligne précisant les taxonomies à utiliser. Je suis partie de 0 donc. Mais peut être que j’ai sauté une étape et qu’il y’avait autre chose à faire avant le code de cette page?

        En gros voici ce qu’il y’a tout à la fin de mon function.php :::

        $labels = array(
        ‘name’ => _x( ‘Produits’, ‘produit’ ),
        ‘singular_name’ => _x( ‘Produit’, ‘produit’ ),
        ‘add_new’ => _x( ‘Ajouter’, ‘produit’ ),
        ‘add_new_item’ => _x( ‘Ajouter un produit’, ‘produit’ ),
        ‘edit_item’ => _x( ‘Editer un produit’, ‘produit’ ),
        ‘new_item’ => _x( ‘Nouveau produit’, ‘produit’ ),
        ‘view_item’ => _x( ‘Voir le produit’, ‘produit’ ),
        ‘search_items’ => _x( ‘Rechercher un produit’, ‘produit’ ),
        ‘not_found’ => _x( ‘Aucun produit trouvé’, ‘produit’ ),
        ‘not_found_in_trash’ => _x( ‘Aucun produit dans la corbeille’, ‘produit’ ),
        ‘parent_item_colon’ => _x( ‘Produit parent :’, ‘produit’ ),
        ‘menu_name’ => _x( ‘Produits’, ‘produit’ ),
        );

        $args = array(
        ‘labels’ => $labels,
        ‘hierarchical’ => false,
        ‘description’ => ‘Les produits de ma boutique.’,
        ‘supports’ => array( ‘title’, ‘editor’, ‘thumbnail’, ‘custom-fields’, ‘revisions’ ),
        ‘taxonomies’ => array(‘category’, ‘post_tag’),
        ‘public’ => true,
        ‘show_ui’ => true,
        ‘show_in_menu’ => true,
        ‘menu_position’ => 5,

        ‘show_in_nav_menus’ => true,
        ‘publicly_queryable’ => true,
        ‘exclude_from_search’ => false,
        ‘has_archive’ => true,
        ‘query_var’ => true,
        ‘can_export’ => true,
        ‘rewrite’ => true,
        ‘capability_type’ => ‘post’
        );

        register_post_type( ‘produit’, $args );

        je n’ai donc rien changé. Et je n’ai que ce custom post type (enfin d’inséré manuellement)

        1. matthieu

          Par contre là je viens de créer rapidement une taxonomie personnalisée, et je peux la lier à “articles” et à “Produits” sans soucis

          1. Aurélien Denis auteur de l’article

            Je viens de copier tel quel le code fourni dans l’article et tout fonctionne : les catégories et les tags apparaissent bien dans un type de contenu ‘Produits’…

  20. Daniel R.

    Petite question con : la page de catégorie et de tag va bien afficher à la fois les articles et les custom-post-type ?

    Si oui, il faudra juste faire attention avec cette astuce car l’utilisateur pourrait souhaiter utiliser un système de catégories et de tags, sans pour autant que tout soit mélangé.

    1. Aurélien Denis auteur de l’article

      Oui c’est tout le principe… sinon je ne vois pas bien à quoi ça sert. 🙂

      Mais précision importante.

      1. Ekho

        Bonsoir,

        J’ai précisément ce problème, pourtant !

        J’ai créé un custom post et de nouvelles taxonomies avec le plugin “Custom Post Type UI”. Mais mes custom post n’apparaissent pas dans ma home, ni dans les catégories… Seuls les articles standards apparaissent.

        Sauriez-vous me dire pourquoi ?

        Merci d’avance,

        1. Aurélien Denis auteur de l’article

          Il faut afficher dans le menu les pages d’archives des custom post type. Si vous cherchez à les intégrer dans la boucle principale, il faudrait faire une modification du code via un pre_get_posts.

  21. Emmanuel GrosManu

    Article très intéressant. Une question cependant, comment gérer des cutom fields sur des custom post types pour les données qui n’ont pas vocation à être gérées par taxonomie (champs de texte libre) ?
    Idéalement sans passer par un plugin…

    1. Aurélien Denis auteur de l’article

      Question plutôt hors sujet… soit par un plugin, soit par le code pour générer des meta-boxes.

  22. Thomas

    En effet intéressant j’ai essayé sur mon nouveau site pour présenter mes références que j’ai développé sous wordpress.
    Connais tu l’impact que peux avoir les pages liées au tag au niveau référencement ?
    Exemple dans mon site j’utilise les lieux et créer une page taxonomy-lieu pour créer une page automatiquement sur les lieux de mes créations.

    1. Aurélien Denis auteur de l’article

      Tout dépend de la qualité du contenu…