
💡 Comment créer un type de publication personnalisé dans WordPress : code et plugin
Les articles et les pages standards couvrent la plupart des besoins d’un site classique. Mais dès qu’un catalogue produits, une base de données immobilière ou un portfolio de projets entre en jeu, ces deux types de contenu ne suffisent plus. Mélanger des produits avec des brouillons d’articles n’est pas pratique, et surcharger les pages avec des champs personnalisés mène tout droit au chaos dans l’interface d’administration.
WordPress résout ce problème avec les types de publication personnalisés, Custom Post Types (CPT). Vous créez une section distincte dans le menu latéral, avec ses propres champs, catégories et modèles d’affichage. Les produits vivent séparément des articles. Les événements ne se mélangent pas avec les pages. Chaque donnée reste à sa place.
Voici deux méthodes éprouvées: par code avec register_post_type() (flexible, zéro plugin supplémentaire) et via le plugin gratuit CPT UI (aucune connaissance PHP requise). Les deux fonctionnent sous WordPress 6.7+ et ont été testées sur des sites en production.
💡 Aperçu rapide:
- Enregistrez un nouveau type de publication via la fonction cœur
register_post_type(), sans plugin, avec un contrôle total sur les paramètres. - Alternative sans code: le plugin Custom Post Type UI offre une interface visuelle, abaisse la barrière d’entrée et élimine les erreurs de syntaxe.
- Après l’enregistrement, le type apparaît dans le menu latéral. Dernières finitions: taxonomies, champs et vidage des permaliens.
Qu’est-ce qu’un type de publication personnalisé
Tout contenu dans WordPress est un enregistrement avec un champ post_type dans la table wp_posts. Pour les articles de blog, c’est post. Pour les pages, c’est page. Pour les médias, c’est attachment. Un type personnalisé ajoute une autre valeur: product pour des produits, event pour des événements, portfolio pour des projets. Tout ce qui correspond aux besoins de votre site.
Chaque CPT obtient son propre élément de menu dans l’administration, une structure d’URL (/events/webinar-2026/), ses propres taxonomies et la prise en charge des blocs d’édition dont vous avez besoin: vignettes, extraits, éditeur, commentaires. Tout cela s’active via des cases à cocher dans le tableau supports, sans aucune magie.
Le principal avantage, c’est l’organisation. Les produits ne flottent pas dans le flux du blog. Les événements n’ont pas besoin d’être filtrés depuis un tas général. L’administration s’accélère et la recherche du site fonctionne de manière plus précise.
Méthode 1: enregistrement par code, register_post_type()
La méthode de base, qui fonctionne depuis WordPress 3.0. Aucun plugin tiers nécessaire. Le code se place dans le fichier functions.php de votre thème enfant ou, de manière plus sûre, via le plugin Code Snippets: une erreur de code ne plantera pas le site mais désactivera simplement l’extrait concerné.
Étape 1: fonction sur le hook init
La fonction s’accroche à init. Avant, cela ne fonctionnera pas car le cœur n’est pas encore prêt à accepter les enregistrements. Après, le type ne sera pris en compte qu’à la requête suivante. Voici un modèle minimal fonctionnel:
1 /** 2 * Registers a custom post type 'Books'. 3 * Place in functions.php of the child theme or via Code Snippets. 4 */ 5 function myprefix_register_book_post_type() { 6 register_post_type( 'book', array( 7 'labels' => array( 8 'name' => 'Books', 9 'singular_name' => 'Book', 10 'add_new_item' => 'Add New Book', 11 'edit_item' => 'Edit Book', 12 'view_item' => 'View Book', 13 'search_items' => 'Search Books', 14 'not_found' => 'No books found', 15 ), 16 'public' => true, 17 'has_archive' => true, 18 'rewrite' => array( 'slug' => 'books' ), 19 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ), 20 'show_in_rest' => true, 21 'menu_icon' => 'dashicons-book-alt', 22 ) ); 23 } 24 add_action( 'init', 'myprefix_register_book_post_type' );
Après avoir inséré le code, une section «Livres» apparaît dans l’administration. Les URL des enregistrements deviennent site.ru/books/book-name/. Cela fonctionne immédiatement.
Étape 2: paramètres clés
La fonction prend deux arguments: une chaîne de clé pour le type (20 caractères maximum, lettres latines et tirets) et un tableau de réglages. Voici les paramètres qu’il est pertinent de configurer délibérément:
Paramètre | Rôle | Recommandation |
|---|---|---|
| Visibilité dans l’admin et le frontend |
|
| Page d’archive listant tous les enregistrements de ce type |
|
| Structure d’URL (slug) | À définir explicitement, sans caractères spéciaux |
| Blocs d’édition | Minimum: |
| Disponibilité dans l’éditeur de blocs |
|
| Icône dans le menu latéral | À choisir parmi les Dashicons |
Étape 3: taxonomies
Les catégories et étiquettes d’articles ne sont pas attachées par défaut à votre CPT. Créez les vôtres:
1 function myprefix_register_book_taxonomies() { 2 register_taxonomy( 'genre', 'book', array( 3 'label' => 'Genres', 4 'rewrite' => array( 'slug' => 'genre' ), 5 'hierarchical' => true, 6 'show_in_rest' => true, 7 ) ); 8 9 register_taxonomy( 'book_tag', 'book', array( 10 'label' => 'Book Tags', 11 'rewrite' => array( 'slug' => 'book-tag' ), 12 'hierarchical' => false, 13 'show_in_rest' => true, 14 ) ); 15 } 16 add_action( 'init', 'myprefix_register_book_taxonomies' );
Les taxonomies sont enregistrées via register_taxonomy() avec une liaison explicite au post_type en deuxième paramètre. hierarchical => true donne une structure arborescente comme les catégories. false donne une liste plate comme les étiquettes.
Étape 4: vidage des permaliens
Après l’enregistrement, allez dans Réglages → Permaliens et cliquez sur «Enregistrer les modifications», même si vous n’avez rien changé. WordPress reconstruira les règles de routage. Sans cette étape, les URL comme /books/ renverront une erreur 404.
Quand le code suffit
Cette méthode fonctionne bien pour un ou deux types personnalisés lorsque la structure ne change pas souvent. Avantage: zéro plugin supplémentaire et un contrôle total sur chaque paramètre. Inconvénient: pour des relations complexes entre plusieurs CPT et des formulaires de soumission frontend, le code grossit rapidement.
Méthode 2: sans code, le plugin Custom Post Type UI
Si vous ne voulez pas toucher à functions.php, installez Custom Post Type UI. Un plugin gratuit de WebDevStudios: un million d’installations actives, note de 4,6 sur WordPress.org. Mis à jour en mai 2026, testé jusqu’à WP 7.0.

Comment créer un CPT via l’interface
- Installez le plugin: Extensions → Ajouter → «Custom Post Type UI» → Installer → Activer.
- Allez dans CPT UI → Add/Edit Post Types.
- Remplissez les champs: Post Type Slug (lettres latines, par exemple
event), Plural Label («Événements»), Singular Label («Événement»). - Dans le bloc Settings, cochez: Public (True), Has Archive (True), Show in REST API (True).
- Dans le bloc Supports, cochez au minimum: Title, Editor, Thumbnail, Excerpt.
- Cliquez sur Add Post Type.
Les taxonomies se créent au même endroit, dans l’onglet Add/Edit Taxonomies. Indiquez la liaison avec votre type de publication et les catégories apparaîtront dans le menu latéral.
Points forts
Enregistrement rapide sans risque d’erreur de syntaxe: le plugin assemble tout seul un tableau $args correct. L’onglet Tools permet la migration des types entre sites via l’export et l’import de code. CPT UI Pro ajoute des blocs pour l’affichage frontend et des colonnes en glisser-déposer dans l’administration, mais la version gratuite couvre entièrement la tâche d’enregistrement.
Notez que le plugin enregistre uniquement les types et les taxonomies. Pour l’affichage frontend, vous aurez besoin soit de modèles de thème, de CPT UI Pro, soit d’une combinaison avec Advanced Custom Fields ou Elementor.
Comparatif: code versus plugin
Critère | Code ( | Plugin (CPT UI) |
|---|---|---|
Barrière d’entrée | Nécessite de comprendre les tableaux PHP | Interface similaire aux réglages WP standards |
Nombre de CPT | Illimité | Illimité |
Transfert entre sites | Copier le code | Export/import via Tools |
Code supplémentaire sur le site | Aucun | Un plugin de plus |
Dépendance à un plugin | Aucune | Oui, CPT UI doit être actif |
Documentation |
En pratique, on utilise souvent une combinaison: enregistrer les types via CPT UI pour la rapidité, et ajouter les champs via Advanced Custom Fields. Cela donne une interface de configuration visuelle sans une seule ligne de PHP.
⁉️🤔 Foire aux questions
Dois-je vider les permaliens après avoir créé un CPT?
Oui, systématiquement. Allez dans Réglages → Permaliens et cliquez sur «Enregistrer». WordPress reconstruira les règles de routage. Sans cela, les nouvelles URL comme
/books/renverront une erreur 404.
Quelle différence entre CPT UI et ACF pour l’enregistrement de types?
CPT UI enregistre uniquement les types de publication et les taxonomies. ACF, à partir de la version 6.1, peut aussi enregistrer des CPT, mais sa force principale réside dans les champs personnalisés. La combinaison CPT UI + ACF vous donne une interface pour les types et des champs flexibles. Vous n’êtes pas enfermé chez un seul éditeur.
Puis-je renommer un type de publication existant?
Il n’existe pas de mécanisme direct. Si vous modifiez le
post_typedans la base de données, les anciens enregistrements disparaissent de l’administration. La bonne approche: créez un nouveau type avec le nom souhaité, migrez les enregistrements avec une requête SQLUPDATE wp_posts SET post_type = 'new_type' WHERE post_type = 'old_type', et seulement ensuite supprimez l’ancien enregistrement. Une sauvegarde complète de la base avant migration est obligatoire.
Les types personnalisés disparaîtront-ils en changeant de thème?
Si les types sont enregistrés dans le
functions.phpdu thème, oui, en changeant de thème ils disparaîtront de l’administration. Les enregistrements resteront dans la base de données mais ne seront plus visibles. Enregistrez les CPT dans un plugin séparé ou via Code Snippets, et les types survivront à tout changement de thème.
Comment afficher un CPT sur la page d’accueil dans le flux général?
Ajoutez un filtre dans Code Snippets:
add_filter( 'pre_get_posts', function( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } );. Remplacez par votrepost_typedans le tableau, et les enregistrements apparaîtront dans le flux aux côtés des articles classiques.
Quelle méthode choisir: résumé final
Les deux méthodes aboutissent au même résultat: une nouvelle section apparaît dans le menu latéral, prête à être alimentée en contenu. La différence réside uniquement dans l’outil.
Si vous gérez le site en direct et que functions.php ne vous fait pas peur, utilisez le code. Une seule fonction register_post_type(), zéro plugin supplémentaire. Convient aux pages d’atterrissage, aux petits catalogues et aux projets avec un accompagnement développeur.
Si vous remettez le site à un client ou construisez un projet éditorial avec une dizaine de types, installez CPT UI. L’interface visuelle abaisse la barrière d’entrée, et l’export de configuration fait gagner des heures lors d’une migration entre plateformes.
Dans tous les cas, après l’enregistrement, paramétrez l’affichage: les modèles single et archive dans le thème ou la mise en page visuelle via CPT UI Pro / Elementor Pro. Sans cette étape, le contenu restera uniquement dans l’interface d’administration.



