Skip to content

Tout pour WordPress, le développement web — et plus encore

💡 Comment créer un type de publication personnalisé dans WordPress : code et plugin

💡 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 */
5function 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}
24add_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

public

Visibilité dans l’admin et le frontend

true pour la plupart des cas

has_archive

Page d’archive listant tous les enregistrements de ce type

true pour les catalogues et collections

rewrite

Structure d’URL (slug)

À définir explicitement, sans caractères spéciaux

supports

Blocs d’édition

Minimum: title editor thumbnail

show_in_rest

Disponibilité dans l’éditeur de blocs

true est obligatoire, sinon Gutenberg ne s’ouvrira pas

menu_icon

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:

1function 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}
16add_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.

Interface d'ajout d'un type de publication personnalisé dans l'extension CPT UI

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 (register_post_type)

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

developer.wordpress.org

docs.pluginize.com

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_type dans 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 SQL UPDATE 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.php du 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 votre post_type dans 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.