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

Articles relatifs

43 réflexions au sujet de « Créer des custom post types avec WordPress »

  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

  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

  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.

  6. Ping : 30 hacks PHP pour WordPress 3 | WordPress Channel

  7. Ping : WordPress 3.1 à télécharger en version française | WordPress Channel

  8. Ping : WordPress 3 un CMS pour créer votre site Web disponible chez Eni | WordPress Channel

  9. 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. Ping : Jigoshop, créez votre boutique e-commerce avec WordPress | WordPress Channel

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

  12. 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…

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

  14. Ping : Vos « custom post type » dans votre flux RSS | itineraire photographique

  15. 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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>