Vous êtes ici : Accueil | Snippets WordPress | Template | 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éfini 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.

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

custom post type 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 ); .

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

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.

Voila à 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 et 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 hierarchie 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 fichier 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 !

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

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

Voila, 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 terme 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 template 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 ces 7 professionnels.

Commencer maintenant

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

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 :



91fbb479107d9f520fa3864370017e60...............
48 Partages
Partagez48
Tweetez
Partagez