Comprendre l’intérêt des Custom Post Types
Dans l’écosystème WordPress, les articles et les pages sont les piliers de la gestion de contenu. Cependant, pour des sites web professionnels, ces deux formats s’avèrent souvent limités. Imaginez que vous développiez un site pour une agence immobilière : mélanger les annonces de maisons avec les actualités du blog serait une erreur structurelle majeure.
C’est ici qu’intervient la notion de Custom Post Type (CPT). Un CPT est un type de contenu personnalisé qui permet de séparer distinctement différentes natures de données dans l’administration WordPress. En créant un CPT, vous bénéficiez d’un menu dédié dans le tableau de bord, de ses propres archives et de sa propre structure d’URL.
L’approche « avancée » ne se limite pas à la simple déclaration du type de contenu. Elle implique la gestion fine des capacités (capabilities), l’ajout de taxonomies spécifiques et, surtout, l’implémentation de champs personnalisés via des Meta Boxes pour capturer des données structurées (comme un prix, une surface ou une date de livraison).
Enregistrer le Custom Post Type avec register_post_type
Pour créer un CPT, nous utilisons la fonction native register_post_type(). Cette fonction doit impérativement être accrochée à l’action init de WordPress pour garantir que le type de contenu est reconnu avant que le système de routage ne s’exécute.
Voici un exemple complet pour créer un CPT « Projet » destiné à un portfolio :
function noucode_register_projet_cpt() {
$labels = array(
'name' => 'Projets',
'singular_name' => 'Projet',
'menu_name' => 'Mes Projets',
'add_new' => 'Ajouter un projet',
'add_new_item' => 'Ajouter un nouveau projet',
'edit_item' => 'Modifier le projet',
'all_items' => 'Tous les projets',
'view_item' => 'Voir le projet',
'search_items' => 'Rechercher un projet',
'not_found' => 'Aucun projet trouvé',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'show_in_rest' => true, // Active l'éditeur Gutenberg
'menu_icon' => 'dashicons-portfolio',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'rewrite' => array('slug' => 'projets'),
'capability_type' => 'post',
);
register_post_type('projet', $args);
}
add_action('init', 'noucode_register_projet_cpt');
Dans cet exemple, l’argument show_in_rest est crucial : s’il est positionné sur false, WordPress utilisera l’ancien éditeur classique. Le paramètre has_archive permet de générer automatiquement une page listant tous les projets à l’adresse /projets/.
Ajouter des taxonomies personnalisées
Un CPT devient réellement puissant lorsqu’il est associé à des taxonomies. Les taxonomies sont des systèmes de classification. Par exemple, pour nos projets, nous pourrions vouloir créer une taxonomie « Type de Prestation » (Développement, Design, SEO).
On distingue deux types de taxonomies : hiérarchiques (comme les catégories) et non-hiérarchiques (comme les étiquettes).
function noucode_register_projet_taxonomies() {
$labels = array(
'name' => 'Prestations',
'singular_name' => 'Prestation',
'search_items' => 'Rechercher une prestation',
'all_items' => 'Toutes les prestations',
'edit_item' => 'Modifier la prestation',
'update_item' => 'Mettre à jour la prestation',
'add_new_item' => 'Ajouter une nouvelle prestation',
'new_item_name' => 'Nom de la prestation',
'menu_name' => 'Prestations',
);
$args = array(
'hierarchical' => true, // Se comporte comme des catégories
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'show_in_rest' => true,
);
register_taxonomy('prestation', array('projet'), $args);
}
add_action('init', 'noucode_register_projet_taxonomies');
L’argument show_admin_column est particulièrement utile car il ajoute automatiquement une colonne dans la liste des projets de l’administration, permettant de voir en un coup d’œil la prestation associée à chaque projet.
Gérer les données avec les Meta Boxes
Pour rendre un Custom Post Type WordPress véritablement avancé, il faut pouvoir stocker des informations spécifiques. Pour un projet, cela pourrait être l’URL du site client ou la date de livraison. Plutôt que de tout écrire dans l’éditeur de texte, on utilise des Meta Boxes.
L’implémentation manuelle se déroule en trois étapes : l’ajout de la boîte, l’affichage du champ et la sauvegarde des données.
// 1. Ajouter la Meta Box
function noucode_add_projet_metaboxes() {
add_meta_box(
'projet_details',
'Détails du Projet',
'noucode_projet_metabox_callback',
'projet',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'noucode_add_projet_metaboxes');
// 2. Afficher le champ HTML
function noucode_projet_metabox_callback($post) {
$value = get_post_meta($post->ID, '_projet_url', true);
echo 'URL du site client : ';
echo '';
}
// 3. Sauvegarder la donnée
function noucode_save_projet_meta($post_id) {
if (array_key_exists('projet_url', $_POST)) {
update_post_meta(
$post_id,
'_projet_url',
esc_url_raw($_POST['projet_url'])
);
}
}
add_action('save_post', 'noucode_save_projet_meta');
L’utilisation d’un underscore (_projet_url) devant le nom de la meta key permet de rendre ce champ « caché » pour l’utilisateur dans l’interface standard des champs personnalisés de WordPress, évitant ainsi toute modification accidentelle.
Afficher le contenu du CPT dans le thème
Une fois les données enregistrées, il faut les afficher sur le site. WordPress utilise une hiérarchie de templates. Pour un CPT nommé projet, WordPress cherchera prioritairement single-projet.php pour l’article seul et archive-projet.php pour la liste.
Si vous souhaitez afficher vos projets dans une page personnalisée, vous devrez utiliser WP_Query :
$args = array(
'post_type' => 'projet',
'posts_per_page' => 6,
'meta_key' => '_projet_url',
'orderby' => 'date',
'order' => 'DESC'
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
$url_client = get_post_meta(get_the_ID(), '_projet_url', true);
echo '' . get_the_title() . '';
echo 'Lien : ' . esc_url($url_client) . '';
endwhile;
wp_reset_postdata();
endif;
L’appel à wp_reset_postdata() est indispensable après une boucle personnalisée pour restaurer l’objet global $post et éviter des bugs d’affichage sur le reste de la page.
Conclusion
La création d’un Custom Post Type avancé transforme WordPress d’un simple outil de blogging en un véritable gestionnaire de contenu structuré (CMS). En combinant register_post_type(), des taxonomies personnalisées et des Meta Boxes, vous offrez une interface de saisie rigoureuse et une gestion des données optimisée.
Bien que des extensions comme ACF (Advanced Custom Fields) facilitent ce processus, maîtriser le code PHP natif vous permet de créer des solutions plus légères, plus rapides et parfaitement adaptées aux besoins de vos clients. Nous vous encourageons à tester ces implémentations sur un environnement de staging avant de les déployer en production.
Avez-vous déjà utilisé des CPT pour vos projets ? Partagez vos astuces ou vos questions en commentaires !


