Les Custom Post Types de WordPress vont nous permettre de créer des types de contenu sur-mesure associant ou non une taxonomie particulière. L'usage des Custom Post Types constitue le fer de lance d'une architecture de site efficace sous WordPress.

Vous recherchez un développeur WordPress capable de vous créer un thème sur-mesure ? C'est mon métier depuis plus de 8 ans, prenez contact et discutons de votre projet.

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

Par défaut, WordPress est fourni avec deux types de contenus par défaut 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 de manière à créer votre propre architecture. Des années après l’écriture initiale de ce tutoriel, ces aspects fondamentaux que sont les types de contenus personnalisés, les taxonomies personnalisées et les champs personnalisés – ce que j’appelle le triptyque architectural, reste méconnu de nombreux prestataires de services.

Ce système est très utile pour des sites qui ont besoin de lister du contenu qui ne sont pas des articles ou des pages au sens sémantique du terme… autrement dit la plupart des sites Web dont voici quelques exemples récurrents :

  • Les sites de e-commerce pour vendre leurs produits ;
  • Les agences immobilières pour vendre leur biens ;
  • Les concessions automobiles pour vendre des voitures ;

Il n’est pas rare par ailleurs de se retrouver avec plusieurs types de contenu personnalisé au sein d’un même site. L’important est que vos données reste bien classées pour permettre un traitement efficace tant d’un point de vue référencement que web-design.

Enfin, sachez qu’aussi bien votre thème que les plugins que vous installez peuvent générer de nouveaux types de contenu personnalisé – visibles ou invisibles dans votre administration.

On retrouvera le même type de présentation du contenu que pour les pages ou les articles. Un exemple ci-dessous avec des petites annonces :

La vue liste est donc similaire à celles que vous connaissez déjà pour les articles et les pages. Les colonnes pourront éventuellement varier selon les projets et vos besoins via une extension comme Admin Columns que j’affectionne tout particulièrement dans sa version professionnelle.

Créer un Custom Post Type par le code (type de contenu personnalisé)

Intégration dans le thème ou dans une extension ?

Avant même de générer le code de notre type de contenu personnalisé se pose la question de son intégration : dois-je l’injecter dans mon thème ou bien dans une extension ?

J’ai souvent eu à débattre de cette question avec des membres de la communauté WordPress mais selon moi c’est dans le thème que vous devriez le laisser et ce, pour les raisons suivantes :

  1. Le thème est responsable de l’affichage de vos données et donc des structures propres à votre type de contenu personnalisé : si vous changez de thème, les données s’afficheront comme le gabarit par défaut ;
  2. On ne change pas de thème comme on installe ou on désinstalle une extension ce qui me fait délaisser l’argument de séparation entre le contenant et le contenu souvent avancé. Le placement du code dans une extension conservera l’accès aux données mais brisera le point précédent. Notez par ailleurs que la suppression des lignes de code n’efface pas les contenus créés, ils sont toujours stockés en base de données ;

Partant de cette analyse, le tutoriel présenté optera pour le placement dans le thème comme stipulé dans le Codex.

Recours à un générateur en ligne

Nous allons utiliser la fonction register_post_type de WordPress afin d’ajouter cet élément d’architecture. Pour vous faciliter la vie, je vous recommande ce générateur en ligne gratuit de chez GenerateWP bien qu’imparfait sur deux points :

  1. La priorité sur le hook devrait être fixée à 10 et non 0 (c’est la dernière ligne du code d’exemple ci-dessous) ;
  2. La réécriture d’URL pour avoir le mot-clé dans l’URL n’est pas i18n-friendly autrement dit compatible multilingue ;

Vous pouvez donc le mettre à jour à partir du code que je vous propose.

Localisez ensuite le fichier functions.php présent dans le dossier /wp-content/themes/NOM_DU_THEME/ à l’aide de votre client FTP favori. Je vous déconseille fortement de passer par le menu Apparence puis Éditeur, vous risqueriez de casser votre site à la moindre erreur de virgule.

Si vous utilisez un thème premium, il est impératif de créer un thème enfant sinon vos modifications seront écrasées à la prochaine mise à jour.

Prenez soin de ne jamais rédiger du texte en français dans le code, cela posera des soucis d’affichage avec les caractères accentués. Restez en anglais afin de faciliter le travail de traduction du thème et pour être raccord avec le reste de votre installation WordPress.

Pour les utilisateurs avancés, vous pouvez créer un fichier de fonctions dédié à votre architecture personnalisée. Cela permet de segmenter les fichiers au sein du thème et de faciliter la maintenance au fil des années. Ainsi, mon fichier functions.php occupe une dizaine de lignes que je divise en plusieurs fichiers comme ceci :

<?php if (!defined('ABSPATH')) die('Restricted Area');


require_once(get_template_directory() . '/inc/theme-scripts.php');
require_once(get_template_directory() . '/inc/theme-functions.php');
require_once(get_template_directory() . '/inc/theme-content.php');
require_once(get_template_directory() . '/inc/theme-ajax.php');
require_once(get_template_directory() . '/inc/theme-woocommerce.php');


?>

Il va de soi c’est une pratique personnelle et que les dénominations de fichiers ne suivent aucune logique spécifique à WordPress.

Prenons l’exemple d’un site d’annonces immobilières pour lequel nous souhaitons créer un type de contenu Propriétés. C’est un nom court capable d’englober tout type de biens.

function wpc_cpt() {

	/* Property */
	$labels = array(
		'name'                => _x('Properties', 'Post Type General Name', 'textdomain'),
		'singular_name'       => _x('Property', 'Post Type Singular Name', 'textdomain'),
		'menu_name'           => __('Properties', 'textdomain'),
		'name_admin_bar'      => __('Properties', 'textdomain'),
		'parent_item_colon'   => __('Parent Item:', 'textdomain'),
		'all_items'           => __('All Items', 'textdomain'),
		'add_new_item'        => __('Add New Item', 'textdomain'),
		'add_new'             => __('Add New', 'textdomain'),
		'new_item'            => __('New Item', 'textdomain' ),
		'edit_item'           => __('Edit Item', 'textdomain'),
		'update_item'         => __('Update Item', 'textdomain'),
		'view_item'           => __('View Item', 'textdomain'),
		'search_items'        => __('Search Item', 'textdomain'),
		'not_found'           => __('Not found', 'textdomain'),
		'not_found_in_trash'  => __('Not found in Trash', 'textdomain'),
	);
	$rewrite = array(
		'slug'                => _x('property', 'property', 'textdomain'),
		'with_front'          => true,
		'pages'               => true,
		'feeds'               => false,
	);
	$args = array(
		'label'               => __('property', 'textdomain'),
		'description'         => __('Properties', 'textdomain'),
		'labels'              => $labels,
		'supports'            => array('title', 'editor', 'thumbnail', 'comments', 'revisions', 'custom-fields'),
		'taxonomies'          => array('property_type'),
		'hierarchical'        => false,
		'public'              => true,
		'show_ui'             => true,
		'show_in_menu'        => true,
		'menu_position'       => 5,
		'menu_icon'           => 'dashicons-admin-home',
		'show_in_admin_bar'   => true,
		'show_in_nav_menus'   => true,
		'can_export'          => true,
		'has_archive'         => false,
		'exclude_from_search' => false,
		'publicly_queryable'  => true,
		'query_var'           => 'property',
		'rewrite'             => $rewrite,
		'capability_type'     => 'page',
	);
	register_post_type('property', $args);	
}

add_action('init', 'wpc_cpt', 10);

Vous devez remplacer le textdomain par celui de votre thème en l’identifiant dans une chaine de traduction.

Notez également la présence de l’argument taxonomies à la ligne 32. Il permet de faire le lien entre mon type de contenu personnalisé et ma taxonomie personnalisée.

Voici la liste des paramètres autorisés par la fonction register_post_type.

Créer une Custom Taxonomy par le code (taxonomie personnalisée)

Les taxonomies sont aux catégories et aux étiquettes ce que les types de contenu sont aux articles et aux pages. Par analogie, il est donc possible de générer vos propres taxonomies personnalisées. Là encore, le générateur en ligne de chez GenerateWP va nous mâcher le travail bien que la compréhension des différents arguments disponibles reste essentielle.

Je reprends donc mon exemple avec mes biens immobiliers que je souhaite à présent classer par type (appartements, villas, maisons, châteaux, etc.). On parlera de terme pour évoquer chaque type créé au sein de votre administration.

function wpc_ct() {

	/* Property Type */
	$labels = array(
		'name'                       => _x('Types', 'Taxonomy General Name', 'textdomain'),
		'singular_name'              => _x('Type', 'Taxonomy Singular Name', 'textdomain'),
		'menu_name'                  => __('Types', 'textdomain'),
		'all_items'                  => __('All Types', 'textdomain'),
		'parent_item'                => __('Parent Type', 'textdomain'),
		'parent_item_colon'          => __('Parent Type:', 'textdomain'),
		'new_item_name'              => __('New Type Name', 'textdomain'),
		'add_new_item'               => __('Add New Type', 'textdomain'),
		'edit_item'                  => __('Edit Type', 'textdomain'),
		'update_item'                => __('Update Type', 'textdomain'),
		'view_item'                  => __('View Type', 'textdomain'),
		'separate_items_with_commas' => __('Separate types with commas', 'textdomain'),
		'add_or_remove_items'        => __('Add or remove types', 'textdomain'),
		'choose_from_most_used'      => __('Choose from the most used', 'textdomain'),
		'popular_items'              => __('Popular Types', 'textdomain'),
		'search_items'               => __('Search Types', 'textdomain'),
		'not_found'                  => __('Not Found', 'textdomain'),
		'no_terms'                   => __('No types', 'textdomain'),
		'items_list'                 => __('Types list', 'textdomain'),
		'items_list_navigation'      => __('Types list navigation', 'textdomain'),
	);
	$rewrite = array(
		'slug'                       => _x('type', 'property_type', 'textdomain'),
		'with_front'                 => true,
		'hierarchical'               => false,
	);
	$args = array(
		'labels'                     => $labels,
		'hierarchical'               => true,
		'public'                     => true,
		'show_ui'                    => true,
		'show_admin_column'          => true,
		'show_in_nav_menus'          => true,
		'show_tagcloud'              => false,
		'rewrite'                    => $rewrite,
		'show_in_rest'               => false,
	);
	register_taxonomy('property_type', array('property'), $args);
}
add_action('init', 'wpc_ct', 10);

Voici la liste des paramètres autorisés par la fonction register_taxonomy.

Corriger l’erreur 404

Vous devez obligatoirement mettre à jour vos permaliens via Réglages puis Permaliens dans votre back-office à chaque modification de votre architecture. Si vous oubliez cette étape, vous obtiendrez une page d’erreur 404.

Requêtes pour afficher vos Custom Post Types

Utiliser la template hierarchy de WordPress

Le système de modèles hiérarchique propre à WordPress s’appliquera de la manière suivante pour vos types de contenu personnalisé.

Nom du fichierExempleDescriptionURL
archive-CPT.phparchive-property.phpGénère la page d’archive reprenant les derniers contenus.https://example.com/property/
single-CPT.phpsingle-property.phpGénère la page du contenu unique.https://example.com/property/white-house-biarritz/

Et un tableau similaire pour les taxonomies personnalisées :

Nom du fichierExempleDescriptionURL
taxonomy-CPT.phptaxonomy-property_type.phpGénère la page d’archive reprenant les derniers contenus classés dans le terme concerné.https://example.com/type/villas/

Il vous faut donc créer le fichier correspondant selon vos besoins (présence ou non d’une page d’archive, liaison ou non avec une taxonomie).

Inclure les Custom Post Types 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 :

function wpc_cpt_in_home($query) {
  if (! is_admin() && $query->is_main_query()) {
    if ($query->is_home) {
      $query->set('post_type', array('post', 'property'));
    }
  }
}

add_action('pre_get_posts','wpc_cpt_in_home');

Inclure les Custom Post Types dans les résultats de recherche

Copiez ces lignes de code dans votre fichier functions.php de sorte que WordPress intègre vos différents contenus dans les résultats de recherche de votre site et pas uniquement les articles. Le type de contenu est à spécifier à la ligne 4 en ajoutant 'post' pour les articles. Vous pouvez également ajouter 'page' pour les pages standards si nécessaire.

function wpc_cpt_in_search($query) {
  if (! is_admin() && $query->is_main_query()) {
    if ($query->is_search) {
      $query->set('post_type', array('post', 'property'));
    }
  }
}

add_action('pre_get_posts','wpc_cpt_in_search');

Récupérer les contenus via WP_Query

Si vous souhaitez récupérer les contenus n’importe où dans votre thème, il nous faut créer une boucle personnalisée de type WP_Query.

Pour effectuer une telle requête, utilisez les lignes de code suivante dans le fichier du thème responsable de l’affichage de la donnée. Cette technique est réservée aux développeurs.

<?php
	$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

	$args = array(
		'paged'		=> $paged,
		'post_type' => 'property'
		),
	);

	$the_query = new WP_Query($args);
?>

	<?php if ($the_query->have_posts()) : ?>
		<?php while ($the_query->have_posts()) : $the_query->the_post(); ?>
			<?php get_template_part('template-parts/content', 'property'); ?>
		<?php endwhile; ?>
	<?php wp_reset_postdata(); ?>
<?php endif; ?>

La ligne 6 doit être modifiée pour correspondre à l’identifiant de votre type de contenu personnalisé.

Un site WordPress bien optimisé disposera de cette architecture personnalisée avec les types de contenu et les taxonomies personnalisés. Bien maitrisé, ce concept vous permettra d’aller très loin dans l’utilisation du système de gestion de contenu qu’est WordPress, notamment sur la partie Search Engine Optimization (SEO). A cela, nous ajouterons les champs personnalisés non évoqués dans ce tutoriel.

103 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

    1. Aurélien Denis auteur de l’article

      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.

  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

    1. Aurélien Denis auteur de l’article

      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.

      1. Tendance Geek

        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. Pierre Mouret

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

    1. Aurélien Denis auteur de l’article

      J’utilise le logiciel Coda pour MacOS X mais n’importe quel éditeur de texte conviendra.

      1. Pierre Mouret

        Moi j’utilise un gratuiciel équivalent sous windows : PSPad il édite aussi les fichiers en FTP.

        1. Aurélien Denis auteur de l’article

          Merci de l’info !

          Cela dit, la plupart des clients FTP classiques le font aussi mais c’est une option méconnue…

  4. merci pour votre tutoriel

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

  5. 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. Aurélien Denis auteur de l’article

      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…

        1. Aurélien Denis auteur de l’article

          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.

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

    1. Aurélien Denis auteur de l’article

      As-tu un plugin qui propose le même genre de fonctions pour gérer les custom post types ?

  7. 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. Aurélien Denis auteur de l’article

        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.

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

  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. 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. 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. Aurélien Denis auteur de l’article

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

    1. Aurélien Denis auteur de l’article

      En créant une 2e boucle avec la fonction get_posts (cf. codex).

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

      1. Jonakangou

        Merci pour l’info. As tu un lien vers une vidéo explorant les fonctionnalités de ce plug-in ?

  14. 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. Aurélien Denis auteur de l’article

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

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

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

  16. 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. Aurélien Denis auteur de l’article

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

      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 ?

  17. 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. Aurélien Denis auteur de l’article

      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 !

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

    1. Aurélien Denis auteur de l’article

      Je ne connais pas ce plugin… mais je sais qu’un plugin premium comme Gravity Forms le fait très bien en le couplant à d’autres plugins spécialisés.

  19. 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. Aurélien Denis auteur de l’article

      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 !

  20. Dave Portois

    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 !

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

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

  23. Novakissime

    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. Aurélien Denis auteur de l’article

      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 !

      1. Novakissime

        Merci pour votre réponse, existe il un tutoriel pour faire cela? Notamment pour le soumission d’un formulaire en front?

        1. Aurélien Denis auteur de l’article

          Pas sur ce blog, mais sur des sites anglo-saxons ça doit se trouver. Plusieurs solutions existent dont certaines en payant.

  24. Bonjour !
    Je n’ai pas encore mis les mains dans le cambouis WordPress au-delà de l’installation sur un serveur local, et pour le moment je réfléchis encore à ce que je veux faire / ce qu’il est possible de faire avant de me lancer. Aussi, j’ai une question de faisabilité : je souhaite créer essentiellement un blog de cuisine, et publier les recettes à la fois en anglais et en français. Est-il possible, à l’aide d’un Custom Post Type qui correspondrait aux posts en anglais, d’afficher uniquement les articles en français sur la page d’accueil et dans les résultats de recherche (par catégorie, date ou mot-clef) et d’afficher les articles en anglais sur une Page dédiée ?
    Merci !

  25. Bonjour,

    Merci pour ce tuto très clair cependant si je souhaite créer deux Custom Post différents il semble y avoir un conflit au niveau du fichier function.php (syntax error, unexpected ‘add_action’ (T_STRING))

    Une solution?

    Merci.

  26. Bonjour,

    J’ai deux questions :
    Aprés ma boucle CPT dans la boucle de ma page
    $loop = new WP_Query( array( ‘post_type’ => ‘movie’, ‘posts_per_page’ => 10 ) );
    while ( $loop->have_posts() ) : $loop->the_post();
    the_title();
    echo  »;
    the_content();
    echo  »;
    endwhile;

    Le contenu de la première boucle ne s’affiche plus. Par exemple :

    Ma deuxième question est d’avantage sur un foreach avec un CPT, le code suivant ne donne rien :
    $post_types = get_post_meta( get_the_ID() , ‘movie’ );

    foreach ( $post_types as $post_type ) {

    echo  » . $post_type .  »;
    the_title();

    Merci par avance

    1. Aurélien Denis auteur de l’article

      Il ne faut pas oublier le wp_reset_postdata pour ta boucle.

      Pour le second je ne sais pas comme cela, il faudrait que j’y passe du temps que je n’ai pas…

  27. Bonjour, Je viens tard sur le sujet mais je te remercie pour cet article.

    Alors je suis tombé non pas sur une erreur de code mais sur un problème de lien 404
    En fait j’ai créé mon custom post « concert » et lors de la création d’un article, le lien me donne http://localhost/concert/mon-article-que-jai
    et paf Erreur 404 !

    le lien court fonctionne mais pas l’adresse complète.

    En cherchant un peu, j’ai vu qu’il fallait ajouter la ligne de code « flush_rewrite_rules(); » juste après register_post_type(…) et là plus d’erreur 404

    Cela donne :

    add_action( ‘init’, ‘create_post_type’ );
    function create_post_type() {
    register_post_type( ‘concert’,
    array(
    ‘labels’ => array(
    ‘name’ => __( ‘Concerts’ ),
    ‘singular_name’ => __( ‘Concert’ )
    ),
    ‘public’ => true
    )
    );
    flush_rewrite_rules();
    }

    Voilà, c’est mon retour de l’utilisation de ce tips sur un wp 4
    Si cela peut aider

    x

    1. Aurélien Denis auteur de l’article

      Le bug de 404 à la création d’un CPT est normale : il faut toujours mettre à jour ses permaliens depuis le back-office. L’astuce que vous indiquée n’est pas conseillée dans la mesure où cela va mettre à jour les permaliens à chaque exécution…

      1. Tu as raison. Je ne connais pas trop wp alors j’apprends
        Dans l’article tu aurais quand même dû en parler car effectivement n’étant pas expert, je suis tombé sur ce cas et j’ai dû trouver une solution qui n’était pas idéal (je lirai mieux la prochaine fois)

        X

        1. Aurélien Denis auteur de l’article

          C’est une bonne remarque d’autant plus que cet article est partiellement obsolète ou du moins incomplet depuis sa date de création.

  28. Bonjour, j’ai mis en place des customs post type et des taxonomies supplémentaire sur un site wordpress en local. Je cherche une solution pour pouvoir régler indépendamment le nombre à afficher par page pour chacune d’elle. Car par défaut l’affiche du nombre dépend de « réglage » -> « lecture » -> »nombre d’article à afficher par page ».
    Merci d’avance si vous avez une solution et merci pour votre travail que vous partagez avec nous.
    Cordialement.
    Fabien.

  29. Merci pour cet article qui m’a aidé à créer et surtout à afficher mes CPT. Seulement, il me reste encore un truc que je trouve pas ici. Au fait, j’ai crée mon CPT sous forme d’un plugin (je dis bien sous forme d’un plugin, pas à l’aide d’un plugin), et du coup je me demande où mettre les deux fichiers archive-$cpt.php et single-$cpt.php.
    Merci de m’aider.

  30. LinusMinus

    Bonjour,

    Merci pour cet excellent article bien riche sur les CTP.

    Je travail actuellement sur un projet dans le theme du voyage et je développe sous WordPress, je souhaite afficher une liste d’articles avec quelques détails ( courte description, prix, situation, services) ainsi chaque aperçu de ces articles mène vers une page (le vrai article complet) avec plusieurs champs (description longue, situation sur la carte, adresse, mini galerie etc…).

    Ma question est : dois-je creuser dans cette piste des Custom post types et custom post fields ? Si ou y a t-il des tuto pour pouvoir réaliser ce que j’ai évoqué ci-dessus ?

    Merci encore une fois pour cette introduction et le lien de la section En savoir plus !

    1. Aurélien Denis auteur de l’article

      Les CPT et les champs personnalisés (custom fields) constituent la pierre angulaire de tout projet WordPress. Donc oui ! Regardez du côté de ACF PRO.

  31. Erwan Tanguy

    Bonjour !
    J’ai un problème avec une pagination sur des custom post types qui ne fonctionne que si les permaliens sont en numérique – ce qui ne m’intéresse pas pour les aujtres articles que je voudrais en /%postname%/ !
    Les pages des custums posts fonctionnent bien mais sur une page générée avec un template, une boucle affiche par ordre alphabétique toutes les entrées. Je veux qu’il y ait une pagination chiffrée pour le moment (alphabétique si je trouve la solution à cet autre problème). Celle-ci s’affiche bien mais ne fonctionne que si le permalink est en mode numérique.
    Si vous avez une solution et le temps, merci…

    1. Aurélien Denis auteur de l’article

      Si vous faites une WP_Query, alors regardez dans le codex à la section pagination.

      1. Erwan Tanguy

        J’ai testé aussi et ça ne fonctionnait pas. Le problème s’est régler que j’ai changer l’appellation de ma page (avant titre « Annuaire » et permalien « annuaire » et maintenant « Annuaire » et permaliens « annuaire-des-adherents »). Pour cette page, j’utilise query_posts( ‘post_type=annuaire&order=ASC&orderby=title&showposts=10&paged=’.$paged ); et ça fonctionne. Par contre pour les templates taxonomy, je passe par WP_Query car sinon la pagination m’affiche bien la première page puis un adhérent par page pour la suite…

        Merci pour votre article et votre réponse même si j’avais trouvé une solution juste avant.

  32. Bonjour ! alors j’ai suivi votre tuto donc tout fonctionne alors mes custom post s’affiche bien grace a la boucle mes impossible de les « stylisé »
    et j’aurai aimé les modifier mes impossible d’ajouté une « class » si vous pouvez m’aider merci

  33. Hey Aurélien,

    I was doing some research and looks like this articles is getting some good traffic so is a shame that you didn’t showed him some love since 2010 :). While you have focused on the coding part, we just wrote an article about different existing solutions : http://www.codeinwp.com/blog/top-custom-post-types-plugins-for-wordpress/ ( which is something that I saw in comments here that people are looking for ), let me know if you think those tools might be interesting for your audience.

    Thanks!

  34. olivierjp80om80

    Bonjour et merci pour l’article
    Mon site a un custom post types vidéo et je voudrais afficher le bloc Champs personnalisés qui apparaît dans articles et dans page mais pas dans ma section vidéo c’est possible?
    SI oui comment faire.
    Merci de m’aider.

    1. Aurélien Denis auteur de l’article

      En haut à droite, Options de l’écran puis cochez Champs personnalisés.

  35. BENJAMIN PIRON

    bonjour,
    tutoriel très utile,
    simple petite question:
    les cpt peuvent ils proposer une date dans les champs?
    voire meme plusieurs dates?
    j’ai besoin de lier des articles à un intervalle de date, comme pour indiquer que mon post, passé telle date, n’est plus valide, est périmé.
    je m’explique: j archive des textes de lois de façon chronologique.
    l amendement ‘xxx’ indique que la loi sur l’immobilier permet tel et tel type de chose, mais a compter de tel date, la loi change, et plus tard encore, a nouveau.
    l ‘article de loi subit donc des modifications avec le temps.
    donc j ai besoin que mon custom post type propose un intervalle de date pendant lequel mon amendement a été effectif.
    ainsi si je fais une recherche sur le site pour un amendement categorie: ‘loi sur l’immobilier’, de tel date a tel date, ma page de résultat affiche: uniquement les amendements qui et les modifications qui me disent qu’entre telle dat et telle date seule ces choses étaient légales. pas ce qui est hors date!
    merci de m’aider. j’ai un peu trifouillé d’autres solutions que cpt, mais je crois que je dois me trouner vers cette solution car l’enjeu de ce projet est de pouvoir insatller une barre de recherche multicritere qui puise dans ma base de donnée et sans erreur de résultat!
    bonne réception

    1. Aurélien Denis auteur de l’article

      Le CPT servira ici pour stocker les textes de lois. Ensuite, il vous faudra utiliser les champs personnalisés à l’intérieur des contenus (pour faire des liaisons par exemple) et des requêtes personnalisées de type WP_Query pour afficher cela dans votre thème.

  36. Bonjour,

    J’ai créé sur un site un custom post type qui regroupe des docs, photos, actus…
    Je voudrais que cet espace sur mon site soit privé : accès au différent contenu de ce custom post type via un identifiant et mot de passe unique.
    Est ce que c’est possible de réalisé un espace privé pour ce custom post type via un plugin ?
    Merci

  37. Bonjour,

    Merci pour ce tuto très utile!
    Maintenant comment mettre en forme ce custom post à l’affichage? En effet, cela ne rend pas forcément très esthétique.

    1. Aurélien Denis auteur de l’article

      Il vous faudra développer votre propre thème pour accomplir cela.

  38. Bertrand

    Bonjour,
    Tout d’abord merci pour votre blog, qui m’as permis d’aller vraiment plus loin dans l’appréhension des cpt.
    Mon problème est le suivant, j’ai créé mon cpt, avec différents termes de taxonomie et rajouté la fonction sticky sur ces derniers.
    Seul problème et pas des moindres je ne parviens pas à les afficher sur la page d’accueil.
    Celle-ci est une page d’accueil statique sur laquelle je souhaite afficher: 1 . les 5 derniers cpt, 2. les 5 derniers articles de blogs.
    J’ai ajouté :

    function affichage_cpt($query) {
    if ($query->is_home)
    $query->set( ‘post_type’, array(‘ficheproduit’,’posts’) );
    }
    add_action(‘pre_get_posts’, ‘affichage_cpt’);

    malheureusement ça remplace le contenu des articles de blogs, ce que je ne souhaite pas. Mon objectif est d’avoir le thumbnail + résumé des cpt puis dans une autre section ceux du blog, de manière bien distincte
    Du coup là je rame bien, je sais que le post est ancien mais si toutefois vous pouviez m’aider, merci d’avance

    1. Aurélien Denis auteur de l’article

      Bonjour Bertrand, il te faut utiliser une fonction de type WP_Query pour créer une boucle personnalisée distincte de la boucle principale qui affiche tes articles. Pour info, la fonction pre_get_posts filtre en amont la boucle principale (sauf mention contraire), le comportement obtenu est donc normal.

      Tu peux passer par un générateur en ligne : https://generatewp.com/wp_query/

      1. Bertrand

        Bonjour Aurélien, merci pour ta réponse.

        J’ai mis ce code avant l’affichage des posts et ça fonctionne (avant ça m’envoyait une boucle à l’infini), directement dans front-page.php. Maintenant il me reste à faire le tri dans les articles du blog (pour n’afficher que ceux là, puis à n’afficher que les sticky posts pour mes CPT (là à mon avis ça va être plus chaud)

        1. Bertrand

          le code :
          if ( post_type_exists(ficheproduit) ) :
          query_posts(‘cat=16,17&showposts=4’);
          while (have_posts()) : the_post();

          get_template_part( ‘template-parts/post/content’, ‘monformat’ );

          endwhile;
          endif;

Laisser un commentaire