Créer des custom post types avec WordPress

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

Aurélien Denis est le fondateur du projet WordPress Channel proposant tutoriels et podcasts librement téléchargeables. En 2010, il fonde Neticpro, une agence Web spécialisée WordPress. Il est aussi co-fondateur du site Protuts.net (tutoriels PC/Mac/Linux) et community manager pour l’Imagine Cup 2011/2012, une compétition mondiale organisée par Microsoft.

61 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. Tendance Geek

    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

  3. Merci pour cette news qui me sera très utile.

    Pouvez vous m’indiquer quel logiciel pour mac vous utiliser dans l’un des screnshots pour éditer du code

  4. truc

    merci pour votre tutoriel

    est-il possible d’insérer des shorts codes
    dans les champs personnalisés ?

  5. Hassen

    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

  6. vivien

    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

  7. vivien

    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.

  8. Même souci que Vivien, simplement résolu en fermant correctement les balises php du fichier functions.php

  9. cayoul

    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.

  10. 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 ?

  11. Co_oD

    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 ;)

    • 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…

  12. Giova

    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?

  13. BlacksAngel

    Et Si j’ai deux custom post type comment les afficher sur la page index ??

  14. jonakangou

    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.

  15. Kayl

    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

    • Les menus disposent de nombreux paramètres (cf. Codex) qui permettent de gérer les ID et les classes CSS facilement. ;)

      • Kayl

        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…

        • Kayl

          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). :)

  16. Dém

    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!

  17. Jeudy

    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

    • Rajoutes ‘posts’ dans ton array(‘dossier’,'posts’) ça affichera aussi les articles en principe.

      • jeudy

        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 ?

  18. 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!

    • 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. ;)

      • 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 !

  19. cou

    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?

  20. Bonjour Aurélien

    Le lien vers bbx design ( Introduction à WordPress 3 : custom post type et custom taxonomy.) n’est plus le bon : il faut cliquer maintenant sur
    http://wordpress.bbxdesign.com/custom-post-type-custom-taxonomy

    Merci de ce tuto !

Rétrolien pour cet article

  1. 30 hacks PHP pour WordPress 3 | WordPress Channel
  2. WordPress 3.1 à télécharger en version française | WordPress Channel
  3. WordPress 3 un CMS pour créer votre site Web disponible chez Eni | WordPress Channel
  4. Jigoshop, créez votre boutique e-commerce avec WordPress | WordPress Channel
  5. Vos « custom post type » dans votre flux RSS | itineraire photographique
  6. Custom post, post, categories et pagination - Le journal de Saharnava
  7. Nouveau design pour Transat : le refondeur refondu - Transat Creative Design

Laisser un commentaire