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

Info : Utilisez les générateurs de custom post type et de custom taxonomy de WPTurbo pour gagner un temps précieux.

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
*/
'show_in_rest' => true,
'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
*/
'show_in_rest' => true,
'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_in_rest’ => 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_in_rest' => 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_in_rest' => 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.

Devenez un freelance WordPress accompli

Trouvez les bons clients, vendez des sites rentables, et libérez-vous de vos contraintes​

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.