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.

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.

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

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
Podcast: Télécharger (Durée: 5:30 — 147.5MB)

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
Un tutoriel se doit de rester généraliste pour toucher le plus grand monde. Dans le cadre d’un développement spécifique, il vaut mieux faire appel à un spécialiste ou passer par un forum.
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
C’est sans doute une erreur de configuration de permaliens. Peut-être que ton serveur local ne gère pas la réécriture des URLs.
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.
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 !
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
J’utilise le logiciel Coda pour MacOS X mais n’importe quel éditeur de texte conviendra.
Moi j’utilise un gratuiciel équivalent sous windows : PSPad il édite aussi les fichiers en FTP.
Merci de l’info !
Merci de l’info !
Cela dit, la plupart des clients FTP classiques le font aussi mais c’est une option méconnue…
merci pour votre tutoriel
est-il possible d’insérer des shorts codes
dans les champs personnalisés ?
Non je ne pense pas…
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
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…
Merci pour ta réponse même si ça ne m’avance guère
Désolé mais je ne fais plus de support approfondi au cas par cas… ça me prend trop de temps ! :p
Pour cela, rendez-vous sur le forum de WordPress francophone.
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
As-tu un plugin qui propose le même genre de fonctions pour gérer les custom post types ?
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.
meme desactiver j’ai toujours ce probleme… Que signifie ce message d’erreur?
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.
Merci, je vais essayer de me débrouiller.
Même souci que Vivien, simplement résolu en fermant correctement les balises php du fichier functions.php
Ping : 30 hacks PHP pour WordPress 3 | WordPress Channel
Ping : WordPress 3.1 à télécharger en version française | WordPress Channel
Ping : WordPress 3 un CMS pour créer votre site Web disponible chez Eni | WordPress Channel
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.
Ping : Jigoshop, créez votre boutique e-commerce avec WordPress | WordPress Channel
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 ?
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…
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?
Ping : Vos « custom post type » dans votre flux RSS | itineraire photographique
Et Si j’ai deux custom post type comment les afficher sur la page index ??
En créant une 2e boucle avec la fonction get_posts (cf. codex).
Voila un très bon tuto sur la manipulation de $query :
http://www.billerickson.net/customize-the-wordpress-query/
Merci du partage !
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.
Le plugin Posts 2 Posts fait exactement ce que tu me décrits là.
Merci pour l’info. As tu un lien vers une vidéo explorant les fonctionnalités de ce plug-in ?
Non désolé ! Peut-être sur YouTube…
Avec l’extension « Custom Content Type Manager » tu peux lier les différents CPT !