Accueil » Snippets WordPress » Comment créer un custom post type dans WordPress

Comment créer un custom post type dans WordPress

Créer un custom post type sur WordPress

Les custom post types (ou types de contenus personnalisés) permettent de créer du contenu différent (et différencié) de ceux fournis par défaut par WordPress, à savoir les articles ou les pages.

Ils peuvent vous permettre par exemple de créer des contenus de type « bien immobilier », « livre », ou « film ». Autre exemple, ce que vous êtes en train de lire n’est pas un article mais un contenu de type « snippet ».

Pour vous montrer comment faire, nous allons créer un custom post type (CPT) pour lister des séries TV. Nous verrons ensuite comment y ajouter des taxonomies personnalisées pour classer ces contenus (à l’instar des catégories et des étiquettes).

1ère étape: la création de notre custom post type

Ouvrez le fichier functions.php de votre thème enfant et copiez-collez le code suivant à l’intérieur:

/*
* On utilise une fonction pour créer notre custom post type 'Séries TV'
*/

function wpm_custom_post_type() {

	// On rentre les différentes dénominations de notre custom post type qui seront affichées dans l'administration
	$labels = array(
		// Le nom au pluriel
		'name'                => _x( 'Séries TV', 'Post Type General Name'),
		// Le nom au singulier
		'singular_name'       => _x( 'Série TV', 'Post Type Singular Name'),
		// Le libellé affiché dans le menu
		'menu_name'           => __( 'Séries TV'),
		// Les différents libellés de l'administration
		'all_items'           => __( 'Toutes les séries TV'),
		'view_item'           => __( 'Voir les séries TV'),
		'add_new_item'        => __( 'Ajouter une nouvelle série TV'),
		'add_new'             => __( 'Ajouter'),
		'edit_item'           => __( 'Editer la séries TV'),
		'update_item'         => __( 'Modifier la séries TV'),
		'search_items'        => __( 'Rechercher une série TV'),
		'not_found'           => __( 'Non trouvée'),
		'not_found_in_trash'  => __( 'Non trouvée dans la corbeille'),
	);
	
	// On peut définir ici d'autres options pour notre custom post type
	
	$args = array(
		'label'               => __( 'Séries TV'),
		'description'         => __( 'Tous sur séries TV'),
		'labels'              => $labels,
		// On définit les options disponibles dans l'éditeur de notre custom post type ( un titre, un auteur...)
		'supports'            => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', ),
		/* 
		* Différentes options supplémentaires
		*/	
		'hierarchical'        => false,
		'public'              => true,
		'has_archive'         => true,
		'rewrite'			  => array( 'slug' => 'series-tv'),

	);
	
	// On enregistre notre custom post type qu'on nomme ici "serietv" et ses arguments
	register_post_type( 'seriestv', $args );

}

add_action( 'init', 'wpm_custom_post_type', 0 );

Attention aux accents et espaces dans la déclaration du nom du CPT dans la fonction register_post_type($nomduposttype,$args). Ils ne sont pas pris en compte et peuvent vous renvoyer des erreurs.

Cette valeur déterminera également l’URL de vos CPT si vous n’utilisez pas l’attribut ‘rewrite’. Ici ça aurait été monsite.fr/seriestv/masérie.

Je vous conseille donc d’écrire votre CPT le plus simplement, s’il est en plusieurs mots.

Si j’avais laissé ‘Séries TV’, cela aurait entraîné comme valeur de définition du nom ‘srietv’ alors que ‘seriestv’ est plus lisible et plus simple. Nous utiliserons cette valeur un peu plus loin lors de la création des templates.

Quelques exemples sur les options disponibles :

  • hierarchical : permet d’avoir une relation parent/enfant à la manière de la hiérarchie des catégories si la valeur est « true », ou des étiquettes si la valeur est « false » ;
  • public : définit si votre custom post type est visible sur votre site. La valeur par défaut est « true » ;
  • has_archive : permet de générer des pages d’archives pour le custom post type. La valeur par défaut est « false » ;
  • rewrite : permet de définir le slug utilisé pour les custom post type. Par exemple ici, si je ne le définis pas, le slug par défaut est monsite.com/seriestv. J’ai préféré opter pour un plus lisible et optimisé pour le référencement naturel.

Si vous souhaitez connaître tous les attributs disponibles de la fonction register_post_type(), je vous invite à lire la page dédiée sur le sur le Codex de WordPress.

Voilà, notre custom post type est maintenant présent dans l’administration de WordPress :

custom post type wpmarmite

Modifier l’icône de notre custom post type dans le tableau de l’administration

Par défaut, l’icône affichée est la même que pour les articles. Cependant, vous avez la possibilité de la changer en ajoutant votre propre Dashicon (les icônes fournis avec WordPress), ou une image de votre choix via une URL.

icone origine cpt wpmarmite

Vous pouvez trouver la liste de tous les Dashicons disponibles dans les ressources développeurs de WordPress.

Nous allons rajouter l’attribut suivant dans la liste des options de notre custom post type (à l’endroit ou l’on défini label, description, labels…) :


// Si vous utilisez les Dashicons, mettez la classe CSS de celui que vous souhaitez
'menu_icon'      => '
dashicons-video-alt2',

// Ou si vous voulez utilisez une URL:

'menu_icon'      =>'www.monsite.fr/image.png',

Ce qui nous donne comme code final :

/*
* On utilise une fonction pour créer notre custom post type 'Séries TV'
*/

function wpm_custom_post_type() {

	// On rentre les différentes dénominations de notre custom post type qui seront affichées dans l'administration
	$labels = array(
		// Le nom au pluriel
		'name'                => _x( 'Séries TV', 'Post Type General Name'),
		// Le nom au singulier
		'singular_name'       => _x( 'Série TV', 'Post Type Singular Name'),
		// Le libellé affiché dans le menu
		'menu_name'           => __( 'Séries TV'),
		// Les différents libellés de l'administration
		'all_items'           => __( 'Toutes les séries TV'),
		'view_item'           => __( 'Voir les séries TV'),
		'add_new_item'        => __( 'Ajouter une nouvelle série TV'),
		'add_new'             => __( 'Ajouter'),
		'edit_item'           => __( 'Editer la séries TV'),
		'update_item'         => __( 'Modifier la séries TV'),
		'search_items'        => __( 'Rechercher une série TV'),
		'not_found'           => __( 'Non trouvée'),
		'not_found_in_trash'  => __( 'Non trouvée dans la corbeille'),
	);
	
	// On peut définir ici d'autres options pour notre custom post type
	
	$args = array(
		'label'               => __( 'Séries TV'),
		'description'         => __( 'Tous sur séries TV'),
		'labels'              => $labels,
		'menu_icon'           => 'dashicons-video-alt2',
		// On définit les options disponibles dans l'éditeur de notre custom post type ( un titre, un auteur...)
		'supports'            => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', ),
		/* 
		* Différentes options supplémentaires
		*/	
		'hierarchical'        => false,
		'public'              => true,
		'has_archive'         => true,
		'rewrite'			  => array( 'slug' => 'series-tv'),

	);
	
	// On enregistre notre custom post type qu'on nomme ici "serietv" et ses arguments
	register_post_type( 'seriestv', $args );

}

add_action( 'init', 'wpm_custom_post_type', 0 );

J’ai par exemple remplacé l’icône d’origine par le Dashicon caméra pour mon custom post type Séries TV :

icone cpt wpmarmite

2ème étape: la création de nos taxonomies personnalisées

On va maintenant ajouter trois taxonomies pour le CPT « Séries TV ».

Il s’agit de Année, Réalisateurs et Catégories de sérieAnnée et Réalisateurs se comporteront comme les étiquettes (tags) classiques que vous utilisez déjà dans les articles WordPress. Catégories de série se comportera en revanche comme les catégories standards.

Vous pourrez par la suite en ajouter autant que vous le voulez, si vous avez besoin d’avoir d’autres types de classements.

Pour les créer, il faut également les définir dans le fichier functions.php de votre thème enfant.

Voici le code PHP à copier-coller :

add_action( 'init', 'wpm_add_taxonomies', 0 );

//On crée 3 taxonomies personnalisées: Année, Réalisateurs et Catégories de série.

function wpm_add_taxonomies() {
	
	// Taxonomie Année

	// On déclare ici les différentes dénominations de notre taxonomie qui seront affichées et utilisées dans l'administration de WordPress
	$labels_annee = array(
		'name'              			=> _x( 'Années', 'taxonomy general name'),
		'singular_name'     			=> _x( 'Année', 'taxonomy singular name'),
		'search_items'      			=> __( 'Chercher une année'),
		'all_items'        				=> __( 'Toutes les années'),
		'edit_item'         			=> __( 'Editer l année'),
		'update_item'       			=> __( 'Mettre à jour l année'),
		'add_new_item'     				=> __( 'Ajouter une nouvelle année'),
		'new_item_name'     			=> __( 'Valeur de la nouvelle année'),
		'separate_items_with_commas'	=> __( 'Séparer les réalisateurs avec une virgule'),
		'menu_name'         => __( 'Année'),
	);

	$args_annee = array(
	// Si 'hierarchical' est défini à false, notre taxonomie se comportera comme une étiquette standard
		'hierarchical'      => false,
		'labels'            => $labels_annee,
		'show_ui'           => true,
		'show_admin_column' => true,
		'query_var'         => true,
		'rewrite'           => array( 'slug' => 'annees' ),
	);

	register_taxonomy( 'annees', 'seriestv', $args_annee );

	// Taxonomie Réalisateurs
	
	$labels_realisateurs = array(
		'name'                       => _x( 'Réalisateurs', 'taxonomy general name'),
		'singular_name'              => _x( 'Réalisateur', 'taxonomy singular name'),
		'search_items'               => __( 'Rechercher un réalisateur'),
		'popular_items'              => __( 'Réalisateurs populaires'),
		'all_items'                  => __( 'Tous les réalisateurs'),
		'edit_item'                  => __( 'Editer un réalisateur'),
		'update_item'                => __( 'Mettre à jour un réalisateur'),
		'add_new_item'               => __( 'Ajouter un nouveau réalisateur'),
		'new_item_name'              => __( 'Nom du nouveau réalisateur'),
		'separate_items_with_commas' => __( 'Séparer les réalisateurs avec une virgule'),
		'add_or_remove_items'        => __( 'Ajouter ou supprimer un réalisateur'),
		'choose_from_most_used'      => __( 'Choisir parmi les plus utilisés'),
		'not_found'                  => __( 'Pas de réalisateurs trouvés'),
		'menu_name'                  => __( 'Réalisateurs'),
	);

	$args_realisateurs = array(
		'hierarchical'          => false,
		'labels'                => $labels_realisateurs,
		'show_ui'               => true,
		'show_admin_column'     => true,
		'update_count_callback' => '_update_post_term_count',
		'query_var'             => true,
		'rewrite'               => array( 'slug' => 'realisateurs' ),
	);

	register_taxonomy( 'realisateurs', 'seriestv', $args_realisateurs );
	
	// Catégorie de série

	$labels_cat_serie = array(
		'name'                       => _x( 'Catégories de série', 'taxonomy general name'),
		'singular_name'              => _x( 'Catégories de série', 'taxonomy singular name'),
		'search_items'               => __( 'Rechercher une catégorie'),
		'popular_items'              => __( 'Catégories populaires'),
		'all_items'                  => __( 'Toutes les catégories'),
		'edit_item'                  => __( 'Editer une catégorie'),
		'update_item'                => __( 'Mettre à jour une catégorie'),
		'add_new_item'               => __( 'Ajouter une nouvelle catégorie'),
		'new_item_name'              => __( 'Nom de la nouvelle catégorie'),
		'add_or_remove_items'        => __( 'Ajouter ou supprimer une catégorie'),
		'choose_from_most_used'      => __( 'Choisir parmi les catégories les plus utilisées'),
		'not_found'                  => __( 'Pas de catégories trouvées'),
		'menu_name'                  => __( 'Catégories de série'),
	);

	$args_cat_serie = array(
	// Si 'hierarchical' est défini à true, notre taxonomie se comportera comme une catégorie standard
		'hierarchical'          => true,
		'labels'                => $labels_cat_serie,
		'show_ui'               => true,
		'show_admin_column'     => true,
		'query_var'             => true,
		'rewrite'               => array( 'slug' => 'categories-series' ),
	);

	register_taxonomy( 'categoriesseries', 'seriestv', $args_cat_serie );
}

On utilise une fonction globale wpm_add_taxonomies(), qui va englober toutes nos taxonomies. Elles seront chargées au lancement de votre site grâce à l’utilisation du hook add_action( 'init', 'wpm_add_taxonomies', 0 ); .

À l’intérieur de cette fonction, on utilise la fonction register_taxonomy( 'nom-de-votre-taxonomie', 'nom-du-custom-post-type', $args ) qui va permettre de lier tous les paramètres que vous avez déclarés.

Si vous souhaitez connaître tous les attributs disponibles de la fonction register_taxonomy(), je vous invite à lire la page dédiée sur le Codex de WordPress.

Voilà à quoi devrait ressembler la page de votre custom post type dans l’administration :

custom post type et taxonomies WP Marmite

Pour l’exemple, j’ai créé la page de la série Homeland :

custom post type admin wpmarmite

3ème étape: l’affichage de notre custom post type

Avant de commencer, si vous avez une erreur 404 en essayant d’afficher votre CPT, réenregistrez les permaliens en allant dans Réglages > Permaliens. Votre problème devrait être résolu.

Suivant le thème que vous utilisez, si vous essayez de visualiser vos custom post types, il est probable que rien ne s’affiche, ou qu’il manque toutes vos taxonomies personnalisées. Pas de panique, c’est normal !

WordPress cherche en priorité le template single-slugdevotrecustomposttype.php et, s’il ne le trouve pas, va utiliser single.php ou un autre template par défaut, comme index.php.

Vous trouverez la hiérarchie complète des templates sur le Codex et dans Relooker son Thème.

Il va donc falloir créer le ou les templates à utiliser.

Nous allons dans un premier temps copier-coller les fichiers single.php et archive.php du thème parent dans notre thème enfant, et les renommer archive-seriestv.php et single-seriestv.php.

Pensez bien à modifier « seriestv » par le nom de votre CPT !

Voilà ce que donne notre CPT pour la série Homeland, avec le template single-seriestv.php :

custom post type homeland

Votre CPT est maintenant affiché, mais comme vous pouvez le voir, il manque toutes les taxonomies que nous avons créées.

Eh oui, WordPress ne peut pas deviner tout seul ce que vous avez rajouté. Il va donc falloir modifier un peu notre template pour y ajouter le code permettant d’afficher nos taxonomies.

4ème étape: l’affichage de nos taxonomies personnalisées

Pour cela, rendez-vous dans votre fichier fraîchement crée single-seriestv.php ( ou single-votretaxonomie.php) et copiez-collez le code suivant à l’intérieur de la boucle WordPress :

// On affiche les taxonomies gràce à la fonction the_terms()

<?php the_terms( $post->ID, 'realisateurs', 'Réalisateurs : ' ); ?> <br>
<?php the_terms( $post->ID, 'annees', 'Série TV sortie en : ' );?> <br>
<?php the_terms( $post->ID, 'categoriesseries', 'Catégorie(s) : ' ); ?><br>

Ici, on utilise la fonction the_terms( identifiant du Custom Post Type, 'nom-de-votre-taxonomie', 'Phrase de votre choix avant l'affichage' ).

Le nom de la taxonomie utilisé dans la fonction the_terms() est ici le nom déclaré plus haut dans la fonction register_taxonomy( 'nom-de-votre-taxonomie', 'nom-du-custom-post-type', $args ).

Attention à bien orthographier votre taxonomie de la même manière que lorsque vous l’avez déclarée dans le fichier functions.php. Sinon, ça ne marchera pas (méfiez-vous des accents, majuscules et espaces).

Nos taxonomies sont maintenant visibles sur la page de notre CPT :

custom post type final | WP Marmite

Voilà, vous pouvez maintenant créer n’importe quel type de contenu personnalisé, avec autant de taxonomies que vous voulez, en modifiant ce code suivant vos besoins.

N’hésitez pas à styliser l’affichage avec un peu de HTML et CSS pour l’intégrer parfaitement au design de votre site.

Si vous avez besoin d’aller plus loin en termes de personnalisation de vos templates, découvrez le guide Relooker son Thème. Vous apprendrez les bases du code pour créer des fichiers de templates adaptés à vos nouveaux CPT.

Vous débutez ? Procurez-vous le Kit du Freelance WordPress

Trouver les bons clients, leur vendre des prestations et bien communiquer avec eux n'est pas inné. Évitez les galères et gagnez du temps en vous formant aux côtés de 7 professionnels aguerris.

Commencer maintenant

21 commentaires Ajoutez le vôtre

  1. Un petit ajout pour les pressés ou les feignants :
    https://www.wp-hasty.com/tools/wordpress-custom-post-type-generator/

    Ce générateur vous fera gagner du temps.

    Répondre
  2. Salut Alex et merci pour tes Tutos.
    petit souci, avec WP 4.7.5 et thème enfant créé avec ton utilitaire, mais le CPT ne s’affiche pas dans l’admin.
    J’ai recopié tel quel ton script et je lai collé dans le function.php du thème enfant.
    J’espère que tu as bien reçu mes infos sur les contenus enrichis via Messenger FB.
    🙂
    Patrick

    Répondre
    • Salut, il y avait une faute de frappe dans le code. Elle est corrigée et normalement tu peux copier-coller tout ça sans problème dans ton fichier functions.php.

    • Merci Julien, ça roule du tonnerre, maintenant il faut que je creuse pour me faire mes propres CPT.

  3. voila le probléme que ce je trouver quand je fais tout ce que vous avez dire dans le tuto mais mahueresement je connait pas pourquoi toujours afficher ce message d’erreurs
    _user_func_array() expects parameter 1 to be a valid callback, function ‘create_post_type’ not found or invalid function name in C:\wamp\www\mysiteweb\wp-includes\class-wp-hook.php on line 286

    Répondre
    • Bonjour, tu as placé le code dans quel fichier?

  4. Bonjour, j’ai crée un CPT avec beaucoup d’attribut mais comment ne pas avoir des espaces blanc quand un ou plusieurs ne sont pas rempli

    Cordialement

    Répondre
    • Bonjour. Ou sont les espaces blancs dont vous parlez?

  5. Ne faudrait t’il mieux pas créer un custom post type dans un must use plugin comme le conseille le Codex WordPress plutôt qu dans un thème enfant ?

    Répondre
  6. Vraiment un grand merci pour ce tuto parfaitement commenté !

    Tout fonctionne parfaitement pour moi, y compris avec Visual Composer, Polylang, des étapes pas gagnées d’avance.

    Seul bug que je ne parviens pas à résoudre : le titre de mes pages ne s’affiche pas, alors qu’il est bien présent dans le champ de saisie de l’admin de mes pages.

    Bien à vous

    Répondre
    • Bonjour. Cela peut dépendre de ton thème, mais tu peux l’ajouter en modifiant les templates de ton thème enfant en ajoutant la fonction the_title()

  7. Bonsoir,
    Merci pour le tuto , j’ai réussi a créer un custom type . Par contre question qui peut paraitre simple mais comment utiliser les catégories et tag « de base » (ceux que j’utilise dans mes articles ) de wp sans créer de custom taxonomy ?
    merci d’avance
    Phil

    Répondre
    • Bonjour, en fait tu ne peux pas. Tu dois en créer de nouvelles. Par exemple tes catégories de pages et d’articles ne sont pas les mêmes. Si tu as besoin des mêmes alors c’est que tu n’as pas besoin de Custom Post Type.

  8. Bonjour, comment faire si je veux plusieurs custom post type, est-ce possible ?

    Répondre
    • Bonjour, tu peux en créer plusieurs, il suffit de modifier les noms à chaque fois

  9. Hello et merci pour cet excellent article !

    Petite question : Est-ce que si je créé un custom post type, je pourrais utiliser un constructeur de pages ? (ThriveArchitect en l’occurence)

    Je peux l’utiliser dans mes pages et articles mais je ne sais pas si ça fonctionnera en créant un nouveau CPT.

    Merci ! 🙂

    Répondre
    • Bonjour, Thrive Architect je ne crois pas. Je sais que Divi commence à supporter le Builder sur les pages de CPT mais je ne pense pas que ce soit le cas des autres pour l’instant.

  10. Bonjour,

    J’ai suivi ce tutoriel très pratique, mais je suis actuellement bloqué: je ne parviens pas à afficher mes deux CPT artistes et événements.

    Je ne part pas des thèmes prédéfinis par wordpress ( twentyfifteen…) mais d’un thème qui m’est imposé.

    Je pense que mon problème se situe au niveau de l’étape 3. J’utilise Template Debugger et il semble que mes fichiers single-artistes.php et
    archive-artistes.php ne soient « pas lus » (de même pour single-evenements.php et archive-evenements.php)

    Pourtant mes customs type / taxonomie artistes et evenements eux sont « lus ».

    Quelqu’un à t-il une idée d’ou peut venir le problème?

    Répondre

Laisser un commentaire

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

La Marmite ne peut malheureusement pas fournir de support. Merci d'en tenir compte dans votre commentaire 😉

Si vous ne lui en voulez pas, donnez-lui un j'aime sur Facebook :



id commodo Praesent libero quis leo. vel, commodo Aliquam
Partagez
Tweetez
Partagez