Les custom post types de WordPress vont nous permettre de créer des types de contenu sur-mesure associant une taxonomie particulière. Différent d’un modèle d’article – bientôt implémentés dans WordPress 3.1, l’usage des custom post types est de plus en plus répandus pour des sites professionnels.

Types de contenu par défaut VS types de contenu personnalisé

Par défaut, WordPress est fourni avec 2 default post types – autrement dit 2 types de contenus que sont les articles et les pages.

Et bien, sachez qu’il est possible de créer vos propres types – à ne pas confondre avec les modèles de pages WordPress.

Ce système est très utile pour des sites qui ont besoin de lister du contenu : les agences immobilières pour vendre leur biens, les sites de e-commerce pour vendre leurs produits ou encore les bases de livres / cinéma pour lesquels on pourra imaginer des classements par genre ou réalisateur par exemple.

Capture d'écran - Custom Post type pour des produits dans WordPress
Un exemple de contenu personnalisé avec des produits

On retrouvera le même type de présentation du contenu que pour les pages ou les articles.

Capture d'écran - Liste du contenu 'Produits'
Votre liste de produits au même niveau que les pages ou les articles

Créer un custom post type manuellement

Localisez le fichier functions.php présent dans le dossier /wp-content/themes/NOM_DU_THEME/ ou passez par le menu Apparence puis Éditeur.

Arguments par défaut

<?php add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'produit',
    array(
      'labels' => array(
        'name' => __( 'Produits' ),
        'singular_name' => __( 'Produit' )
      ),
      'public' => true
    )
  );
}
?>

Taxonomie personnalisée

Dans les articles de WordPress, la taxonomie est basée sur les catégories et les mots-clefs – tags en anglais.

Il est possible de choisir vos propres termes comme « Genre »,  « Type », « Pays » pour couvrir les besoins de votre projet.

Pour cela, ajoutez les lignes de code suivantes avant la fermeture de la balise PHP du code précédent :

register_taxonomy( 'couleur', 'produit', array( 'hierarchical' => true, 'label' => 'Couleur', 'query_var' => true, 'rewrite' => true ) )

Voici la liste des paramètres autorisés, présentés dans l’ordre d’utilisation :

  • Le nom de la taxonomie : il s’agit de couleur dans l’exemple ;
  • Le type de contenu qui va disposer de la taxonomie : indiquez ici votre intitulé de custom post type, en l’occurrence, produit ;
  • hierarchical : indique s’il y a une relation parent / enfant, de la même manière que pour les catégories. Choisissez entre True ou False selon vos besoins ;
  • label : c’est le nom plus descriptif qui s’affichera dans l’administration de WordPress ;
  • query_var : laissez obligatoirement sur True de sorte qu’on puisse effectuer des requêtes d’affichage du contenu ;
  • rewrite : indiquez True pour utiliser les permaliens basés sur votre custom post type ;

Au final, en combinant le tout, votre code doit ressembler à cela :

<?php add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'produit',
    array(
      'labels' => array(
        'name' => __( 'Produits' ),
        'singular_name' => __( 'Produit' )
      ),
      'public' => true
    )
  );
register_taxonomy( 'couleur', 'produit', array( 'hierarchical' => true, 'label' => 'Couleur', 'query_var' => true, 'rewrite' => true ) );
}
?>
Capture d'écran - Modification du fichier functions.php
Insérez le code en début de fichier avant les fonctions du thème TwentyTen

Afficher votre custom post type

Sur la page d’accueil

Il vous suffit d’ajouter ces lignes de code, en-dessous des précédentes, dans le fichier functions.php :

<?php add_filter( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {
 if ( is_home() )
 $query->set( 'post_type', array( 'produit' ) );

 return $query;
}
?>

Autre part dans le template WordPress

Pour information, WordPress utilise une boucle PHP qui permet d’afficher les derniers articles. La même chose est faisable par une requête SQL.

Avec les custom post types, il nous faut créer soit une boucle personnalisée, soit passé par une requête de type query_posts.

Requête SQL (boucle)

Pour effectuer une requête, utilisez les lignes de code suivante dans le fichier du thème sensé lister le custom post type – en général, index.php :

$loop = new WP_Query( array( 'post_type' => 'produit', 'posts_per_page' => 10 ) );
while ( $loop->have_posts() ) : $loop->the_post();
  the_title();
  echo '<div>';
  the_content();
  echo '</div>';
endwhile;

Requête query_posts

query_posts(array('post_type' => array('post', 'produits')));

En savoir plus

Pour les utilisateurs les plus curieux, je vous recommande la lecture de cet excellent article écrit en français (il faut le souligner) : Introduction à WordPress 3 : custom post type et custom taxonomy.

Vous apprendrez les nombreuses possibilités offertes par les custom post types.

L’objectif de ce tutoriel est d’être le plus simple possible pour ne pas décourager les utilisateurs pour qui les lignes de code sont l’horreur absolue… les plus aventureux trouveront facilement des compléments sur le Web pour approfondir sur ce concept de contenu sur-mesure. Pour information, WordPress 3.1 incorporera les modèles d’articles que vous pourrez donc utiliser dans vos custom post types !

Crédits photo : kentbrew

66 commentaires

  1. Bonjour et merci pour cet article.

    Justement je ne trouve pas ce que je cherche concernant ces CPT.

    Comment faire en sorte que l’on puisse cliquer sur les données affichées par ce moyen, comme sur ma homepage (code postal, pays) et n’afficher que les posts ayant les mêmes valeurs.

    Merci de votre attention

  2. J’ai voulu tester sur un site en local avec WAMP, je n’ai aucun problème avec l’ensemble du blog. Avec cette fonction, je peux créer, pour garder ton exemple, une couleur, l’associer à un produit (articule créé) etc. Par contre, je ne peux pas afficher le dit produit, j’ai une erreur 404, or, si je regarde mes archives, il apparaît bien et il peut même récupérer le contenu de l’article. C’est seulement si je vais sur le permalien en fait.

    A défaut d’idée, je testerai sur mon site directement mais c’est quand même bien embêtant de travailler un si formidable outil directement sur son site, toucher le functions.php en direct, c’est pas franchement le truc que je conseillerai à tout le monde… Du moins si l’on veut que nos lecteurs se sentent bien :p

      1. C’est ce que je me suis aussi dit, c’est amusant ceci dit que je n’ai aucun problème de permaliens avec les articles et les pages.

        1. Bonjour,

          Parfois il suffit de re-enregistrer le réglage des permaliens dans l’admin. de WordPress et tout rentre dans l’ordre …

          Merci pour le tuto !
          ça vas bien m’être utile !

  3. Salut Aurélien,

    Super Tutoriel, bravo pour l’effort de pédagogie
    ma config : wp 3.0.3, Thème: Regulus, en Local

    1 – Je voudrais afficher mon Custom Post dans une page que j’ai créé spécialement. Je m’excuse, mais je ne sais toujours pas comment faire…
    2 – Les Post s’affichent sur ma Home page sans problème mais au niveau des Meta, les catégories créées ne s’affichent pas.
    j’ai juste ceci :
    « Publié par NomAuteur in : , commentaires fermés , éditer le billet »

    PS: Sereait-il possible que notre hôte nous communique le nom du plugin qu’il utilise pour les commentaires ?
    Merci

    1. Bonjour !

      Pour répondre à ta première question, as-tu tenté d’utiliser les codes fournies dans l’article ? Ce sont ceux du codex WordPress, ils doivent fonctionner.

      Pour la seconde question, sans doute une erreur dans le code.

      Pour ton P.S : je n’utilise pas de plugins pour les commentaires…

  4. Tout d’abord merci pour ces inforamtions, à priori cela fonctionne chez moi mais à chaque fois que je mets à jour où que je publie un de ces posts j’obtiens le message d’erreur suivant (qui n’empeche pas la publication)

    Warning: Cannot modify header information – headers already sent by (output started at /home/vivienur/public_html/ADF/wp-content/themes/ADF2/functions.php:6) in /home/vivienur/public_html/ADF/wp-includes/pluggable.php on line 890

    D’où cela peut-il venir? Merci

  5. a priori non, j’utilise category order (pour modifier l’ordre des categories), portfolio slideshow (un slideshow pour les img du post) et WP dTree (menu deroulant).
    Je vais essayer de desactiver les plugin.

      1. Généralement, ce genre de messages signifie qu’il y a un doublon de fonctions PHP.

        Je ne suis pas spécialiste PHP mais comme indiqué les informations ont déjà été envoyées dans pluggable.php qui est donc relatif aux plugins.

        Ton fichier functions.php contient également peut-être un doublon de fonctions.

  6. Afin d’éviter d’avoir un problème de headers already sent, il faut éviter de faire suivre une balise fermante et une balise ouvrant de php. Si vous fermez une balise pour la rouvrir derrière, autant ne pas la fermer.

  7. Je voudrais qu’on puisse lors de l’édition d’un post distribuer les textes dans differents parties/paragraphes, du style « Où », « Quoi », « Comment ». Les custom-post-types sont-ils recommandés ou l’application de style suffit ?

  8. Bonjour et merci pour ce tuto très instructif !!

    J’ai une petite question à poser… J’espère que quelqu’un pourra m’aider.
    Est-il possible d’insérer un CPT sur la page d’accueil, et de lister les « posts conventionnels » ensuite…
    Je souhaite en fait insérer un « contenu » éditable qui reste toujours en 1ère position et sur lequel je n’aurai pas d’excerpt..

    Voilà le truc bien complexe… à moins qu’un plugin le fasse déjà ?
    Merci à vous

    1. Oui on peut afficher les custom post types de la même manière que les articles ou les pages via la boucle de WordPress. Tout ceci fonctionne de façon identique à la différence que les types de contenus sont différents.

      Maintenant, je n’ai pas de solutions via un plugin et il va falloir mettre les mains dans le code… en créant une première boucle pour ton CPT et une seconde pour tes articles. Je n’ai pas de tutoriel là-dessus par contre…

  9. Bonjour.

    Tout d’abord merci pour ce site, on y trouve plein d’infos interressante, un vrai plaisir !

    Durant votre vidéo, vous dite qu’il est possible de modifier la page d’édition de notre custom type, et que vous donnerez un lien en fin de tutoriel.

    Je ne vois qu’un lien qui reprend le contenu de votre tuto, mais rien sur la modification des pages d’édition. Où ce trouve ce fameux lien svp?

  10. bonjour,

    intéressant les custom post type (CPT) mais comment lier ces CPT entre eux et ensuite à des post classique ?

    Exemple : on créer un site sur le cinéma dans ce site il y a trois CPT : film, acteur et réalisateur. Comment faire le lien pour dire « Star Wars épisode 1 « (CPT film) a comme acteur « truc » « machin » et « bidule » (plusieurs CPT acteur) ainsi que Speilberg comme réalisateur (CPT réalisateur) .

    Ensuite en supposant que l’on fasse une section « news », ça peut être intéressant dans le back office de faire des liens. Quand on crée une news sur « Star wars » de lier cette news au CPT Film pour dans le front office afficher des liens vers le film, les acteurs et le réalisateur en bas de la news. Sous réserve bien sûr que une fois lié au CPT film de base le lien avec les différents custom post type -> CPT acteur et le CPT réalisateur se fasse automatiquement.

    J’ai pris le cas d’un site de film mais le mécanisme est valable pour bien des sujets.

    J’ai cherché parmi des plug-in wordpress. Certains s’en approche mais aucun ne fait un lien de cette nature pourtant si simple d’un point de vue conceptuel. Plus complexe niveau programmation j’en conviens.

    Si un de vous à une piste à fournir, je suis sûr que je ne dois pas être le seul à avoir ce genre de réflexion sur les CPT.

  11. Bonjour, merci tout d’abord pour cet article de qualité.

    J’aurais une question. J’ai crée des custom post types grâce à votre article et ajouter le code demandé dans functions.php afin de pouvoir lister mes custom post type sur mon blog. Une fois fait, cela s’est en effet listé mais il y a une interaction avec mon menu: il perd son style.

    J’ai remarqué que mon ul menu perdait son id etc c’est pourquoi il perd son style. Je précise que j’utilise le menu wordpress et la ligne de code qui me sert à afficher mon menu est celle-ci ::

    Si quelqu’un sait pourquoi cela fait bugger l’affichage de mon menu, ca serait très gentil de m’en faire part !
    Merci

      1. oui bien sûr et j’avais mis une ID à mon menu, il était stylisé, tout se passait bien jusqu’à ce que je mette dans mon fichier functions.php le bout de code qui permet d’afficher le contenu de mon custom post type sur mon blog, mais je ne sais vraiment pas pourquoi ca ne fonctionne plus depuis, c’est essentiel que je trouve…

        1. Hum jai reglé mon problème en définissant ma page d’accoeuil dans les réglages WordPress (j’avais remarqué que le menu s’affichait correctement sauf sur la première page du site).

  12. Bonjour, en voila une fonction interessante.

    J’ai déclaré dans mon function.php 2 CPT différents et cela fonctionne parfaitement dans l’interface d’admin mais j’ai du mal à les lister.

    En effet la ou je voudrais ne lister qu’un seul CPT j’ai chaque fois le contenu de mes 2 CPT qui s’affichent sur le site.

    J’ai utilisé cette query:
    query_posts(‘post_type = news’);

    news étant le nom d’un de mes 2 CPT, comment ne lister que celle-ci?

    Merci!

  13. Bonjour j’ai suivi le tuto mais après avoir ajouté

    add_filter( ‘pre_get_posts’, ‘my_get_posts’ );

    function my_get_posts( $query ) {
    if ( is_home() )
    $query->set( ‘post_type’, array( ‘dossier’ ) );

    return $query;
    }

    sur ma page d’accueil il n’y a plus que mon custom post type , il n’y a plus mes articles :s

      1. effectivement ça marche mais c’est pas(‘dossier’posts’) mais ‘post’ merci beaucoup. j’ai une question c’est possible de lier les category des custom posts avec un article ou vis versa ?

  14. Bonjour, je découvre de plus en plus de technique pour améliorer mes prochains sites, j’aurai une question, j’ai fais pas mal de recherche mais je ne trouve pas ma réponse. J’explique:
    J’ai créé des customs post type et des taxonomy associé, toutes mes pages fonctionnent impeccablement bien, mais pour améliorer certaines de ces pages, je cherche à mettre sur un custom post d’une certaines taxonomy, les 4 derniers posts de cette taxonomy en bas du post. Connaissez vous le moyen de le faire ?
    je m’explique un peu mieux:

    Posttype1
    Taxo1
    Taxo2
    Taxo3

    Posttype2
    Taxo1
    Taxo2

    Posttype3
    Taxo1
    Taxo2

    quand je regarde un post de posttype3 qui a pr taxo, le n°1 et le n°2, j’aimerai qu’a la fin de ce post, il y est un résumé des 3 ou 4 derniers posts présent dans la taxo1 ou taxo2.

    J’espere que je me suis fais comprendre
    Merci d’avance!

    1. En gros afficher les derniers contenu d’un Custom Post Type (commun avec la page en cours de visite) et en filtrant par taxonomie selon que l’on est dans Custom Post Type 1 / 2 / 3 ? Si oui, faut créer 3 boucles PHP pour les afficher et gérer le tout avec des conditions ou avec 3 fichiers de template : single-cpt1.php / single-cpt2.php / single-cpt3.php.

      1. Merci pour votre réponse, en fait, ce que je cherche, c’est d’avoir des articles en rapport avec les custom taxonomy, et non pas avec les custom post type.
        dans une boucle query_post par exemple, je vais avoir query_posts(‘post_type=musique&showposts=8&PROBLEME=top-50′); while (have_posts()) : the_post();

        je cherche à savoir quel est l’expression qu’il faut mettre au niveau du PROBLEME, j’ai essayé category,tag,tag__in,tag_id (en changeant top-50 par l’id) mais rien n’y fait.
        Avez vous la solution ?
        merci d’avance !

  15. Bonjour, merci pour ce tuto très instructif !
    Cependant j’ai un petit soucis: J’ai créé un custom post ‘emplois’ et j’aimerais grace au plugin ‘wp user fronted’ permettre a mes utilisateurs de poster directement des articles dedans. Mais impossible, quand quelqu’un créé un article ca le place directement dans les articles normaux et non dans ‘emplois’ … Pouvez vous me renseigner la dessus?

  16. Merci pour cet article intéressant, la puissant des CPT permet vraiment de grandes choses. Mais je crois avoir trouver une de ses limites.
    Dans mon fichier functions.php, je créer un input pour mon CPT, qui donne des informations annexes. Tout marche très bien dans la page dédié au CPT, car l’URL affiche l’ID du CPT en question.
    Mais lorsque je souhaite utiliser la valeur de l’input (une URL externe) dans le listing des CPT (en l’occurence mes projets), c’est l’URL sur laquelle je me trouve qui est pris en compte. Je n’arrive pas à utiliser des valeurs sans avoir l’ID du CPT.

    Je cherche la réponse à ce problème, et après avoir consulté différents tutos sur les CPT, je me suis dis que je ne risquait rien à poser la question à quelqu’un qui m’a l’air de maitriser les CPT ;).

    PS: J’ai créer 2 snippets pour montrer mon code.
    1 – functions.php : http://snippi.com/s/wz9e0h4
    2 – portfolio.php : http://snippi.com/s/7hnriu0

    Merci d’avance pour ta réponse.

    1. Le template du portfolio est constitué d’erreur. Pas de reset postdata à faire en début de fichier et pas forcément utile de créer un modèle de page.

      Par défaut, il faut créer un archive-cpt.php puis faire un lien personnalisé dans le menu. Le slug dépend du code du Custom Post Type selon que l’on utilise des règles de réécriture ou pas.

      Pour ajouter des champs, utilises le plugin ACF qui fait ça très bien !

  17. Bonjour,

    Super ce tuto ! J’ai enfin pu créer les types que je voulais.

    Cependant j’ai une petite question:
    Est-ce possible de créer un custom post type ayant un TITLE, un petit texte EXCERPT et plusieurs attributs INT ?
    Car je souhaite créer plusieurs produits, et les internautes pourront remplir un formulaire pour chaque produit, par exemple : facilité d’utilisation, rapport qualité prix, etc.
    Je souhaite donc que chaque produit possède un attribut rapport qualité prix qui serai une note sur 3, un attribut facilité d’utilisation (une note sur 3) et enfin une note générale.

    Merci d’avance et encore bravo !

  18. Bonjour, Je sais pas si je suis a la bonne place je recherche comment faire un Filtre de recherche Proprieté ID ( Seach ID Propriety ) pour un site web d’une agence immobiliere.

    Je veut rechercher ID de la page consernant l’annonce immobiliere avec un filtre de recherche ID sur la page d’accueil.

    Example: Je entre 125 dans la case recherche et sa me donne la page de l’annonce que le client a inserer.

    Ma question est comment faire ce filtre de recherche ?

    Je fonctionne avec wordpress la derniere version et un theme immobilliere.

    Merci !

  19. Bonjour,

    Je cherche à créer un post type qui aurait, dans la partie contenu, du texte statique (que l’on retrouverait sur tous les articles). L’idée étant de pouvoir spécifier des champs, dans le contenu de l’article et dans le titre qui viendrait recevoir les informations contenus dans un tableau excel *.csv. (importé via Ultimate CSV importer).

    Grosso modo, je souhaiterais que chaque article que je crée contienne le texte suivant avec des champs qui correspondent à plusieurs lignes du tableau excel.

    C’est difficile à expliquer. Voici un ex :

    « L’article n° [colonne 1 du tableau excel], est conforme suivant l’odre [colone 2 du tableau excel], [colone 3 du tableau excel] datée du [colonne 4 du tableau excel].

    Vers quoi dois-je me diriger, un plug in en particulier ?

    Merci infinement

    1. Bonjour,

      Je recherche depuis de nombreux jours à cibler mon problèmes et peut être que les CPT sont la solution que je recherche…

      Je voudrais savoir comment faire pour relier une catégorie à des posts ( rien de très compliqué vous allez me dire), mais je veux faire quelque chose de précis, voir l’exemple :

      http://www.mojo-themes.com/item/wiksi-responsive-magazine-wordpress-theme/demo/?r=wpthemesspot

      Juste en dessous du slider, la catégorie « Nature » rassemble les 5 derniers articles de cette dernière. Je voudrais simplement faire la même chose.

      Merci par avance de vos réponses

  20. Bonjour,
    Je suis face à un problème sur mon site internet, je souhaite faire un site de petites annonces , je souhaite que mes membres déposent des annonces mais je vois que sur wordpress on peut poster des articles en choisissant une catégorie mais je souhaite que mes membres puissent poster des annonces avec deux catégories à la fois. Je ne vois pas comment faire, sur wordpress on peut créer plusieurs catégories mais on peut qu’en choisir une lors de la création du post par le membre, je souhaite que le membre puisse en choisir une et une autre a la fois. Par exemple un site de petites annonces immo avec une annonce type de bien (catégories maison/appartement/terrain…) et localisation (catégories Paris/Lyon/Marseille..)

    Je ne sais pas comment faire pouvez vous m’aider?
    Cordialement

    1. On peut très bien créer un site de petites annonces avec WordPress mais il faut connaitre les notions de custom post type et de custom taxonomies ainsi que les procédures de soumission en front par les membres. Bref, du développement à prévoir !

Laisser un commentaire