Créer un plugin WordPress : FAQ asynchrone, étape par étape
Téléchargements
Tu veux créer un type de contenu personnalisé dans WordPress, par exemple pour gérer des projets, des recettes, des témoignages ou une FAQ ?
Bonne nouvelle : tu n’as pas besoin d’un plugin obscur téléchargé sur Internet pour ça !
Dans cet article, on va voir pas à pas comment créer ton propre Custom Post Type (CPT) avec seulement quelques lignes de code. Tu vas comprendre ce qu’est un CPT, pourquoi l’utiliser et comment le rendre visible dans l’administration.
Un Custom Post Type (CPT), c’est un nouveau type de contenus que tu crées dans WordPress pour mieux organiser et séparer tes données.
Il est automatiquement stocké dans la base de données par WordPress, sans que tu aies besoin d’écrire du SQL.
Concrètement, chaque élément est enregistré dans wp_posts (avec un post_type dédié) et ses métadonnées dans wp_postmeta.
Types déjà présents dans WordPress :
post pour les articles de blog
page pour les pages classiques
attachment pour les médias
etc.
Quand ton projet grandit, tu peux créer tes propres types, par exemple :
projet pour ton portfolio
cours, exercices et quiz pour une plateforme de formations
faq pour une liste de questions / réponses
produit pour une boutique personnalisée
Les CPT te permettent d’avoir tes propres types avec interface dédiée, champs personnalisés, modèles, catégories… et bien plus encore !
Tu as deux options pour enregistrer un Custom Post Type :
Dans ton thème avec le fichier functions.php par exemple
→ Idéal pour des besoins simples et c’est plus facile à gérer, mais ton CPT disparaîtra si tu changes de thème.
Dans un plugin dédié
→ Idéal si tu veux garder ton CPT indépendant du thème, par exemple si tu souhaites le réutiliser sur plusieurs sites, le partager, ou le conserver même en changeant de thème.
Dans cet article, on va créer un petit plugin dédié.
Cela nous évitera de modifier le thème enfant à chaque ajout et de tout recommencer si on décide d’en changer plus tard.
On va commencer par créer l’arborescence nécessaire de notre plugin :
Crée un dossier nommé custom-post-type-example/ dans le dossier wp-content/plugins
À l’intérieur, crée un fichier principal custom-post-type-example.php
Colle ceci dans custom-post-type-example.php :
<?php
/**
* Plugin Name: CPT Example – Custom Post Type WordPress
* Description: Exemple simple de création d’un Custom Post Type dans WordPress.
* Author: William Malbos
* Version: 1.0.0
* Text Domain: cpt-example
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Sécurité : empêche l’accès direct au fichier.
}
Le bloc de commentaire du haut est l’en-tête standard WordPress qui permet d’identifier le dossier comme un plugin.
Ajoute ensuite le code d’enregistrement :
function cpt_example_register_project_cpt() {
// 1. Définition des labels
$labels = [
'name' => 'Projets',
'singular_name' => 'Projet',
'menu_name' => 'Projets',
'add_new' => 'Ajouter un projet',
'add_new_item' => 'Ajouter un nouveau projet',
'edit_item' => 'Modifier le projet',
'new_item' => 'Nouveau projet',
'view_item' => 'Voir le projet',
'search_items' => 'Rechercher un projet',
'not_found' => 'Aucun projet trouvé',
'not_found_in_trash' => 'Aucun projet dans la corbeille',
'all_items' => 'Tous les projets',
];
// 2. Arguments de configuration
$args = [
'labels' => $labels,
'public' => true, // Accessible côté front et back
'show_in_rest' => true, // Active l’API REST (et l’éditeur Gutenberg)
'menu_icon' => 'dashicons-portfolio', // Icône du menu admin
'menu_position' => 5, // Position dans le menu
'supports' => ['title', 'editor', 'thumbnail', 'excerpt'],
'has_archive' => true, // Page d’archives (ex: /projets)
'rewrite' => ['slug' => 'projets'],
'show_in_menu' => true,
];
// 3. Enregistrement du CPT
register_post_type( 'project', $args );
}
add_action( 'init', 'cpt_example_register_project_cpt' );
$labels représente un tableau de chaînes qui définissent les textes affichés dans l’administration pour ce CPT (menus, boutons, titres d’écran, etc.).
Une fois ton plugin activé dans le back-office (Extensions → Extensions installées). En passant, les informations que l’on a mises dans le commentaire d’en-tête s’affichent ici, comme la description, la version ou l’auteur avec un lien vers son site web.
Tu verras apparaître un nouveau menu « Projets » dans la barre latérale WordPress.
Sur cette page, tu retrouveras la liste complète de tes projets, qu’ils soient publiés, en brouillon, supprimés, etc..
Tu peux créer un nouveau projet en cliquant sur « Ajouter un nouveau projet »
En cliquant sur « Définir l’image mise en avant », tu pourras attribuer une image de miniature à chaque projet.
Enfin, tu peux rédiger le contenu avec Gutenberg.
On pourra voir dans un autre article comment étendre Gutenberg (champs, blocs personnalisés) pour réaliser des projets plus complexes.
Dans WordPress, une page d’archive d’un Custom Post Type est une page automatiquement créée qui affiche la liste de tous les contenus de ce type.
Autrement dit, ici avec notre CPT nommé « project », la page d’archive sera une page de listing qui regroupe tous les projets publiés si tu as bien défini has_archive => true.
Essaie de te rendre dans ton navigateur sur : 127.0.0.1:8001/projets en remplaçant 127.0.0.1:8001 par le nom de domaine de ton site internet.
Tu verras la liste de tes projets (avec le template par défaut).
Tu peux aller plus loin en créant un fichier archive-project.php dans ton thème pour personnaliser l’affichage, par exemple :
<?php get_header(); ?>
<main class="project-archive">
<h1>Mes projets</h1>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<article>
<h2><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
<a href="<?php the_permalink(); ?>">Voir le projet</a>
</article>
<?php endwhile; endif; ?>
</main>
<?php get_footer(); ?>
En pratique, on voit souvent le CPT et ses templates dans le thème (ou thème enfant) pour éviter d’éparpiller les fichiers et garder tout l’affichage « au même endroit ». C’est plus pratique sur un petit site, mais si ton CPT doit vivre au-delà du thème (réutilisable, partageable), préfère le CPT en plugin et les templates dans le thème.
Attention : il si tu choisis de mettre le CPT en plugin, il faut quand même mettre le fichier archive-project.php dans ton thème et non dans le plugin, car :
Template Hierarchy : WordPress ne charge les templates d’archive que depuis le thème actif (ou le thème enfant). Un fichier placé dans un plugin n’est pas pris en compte par la hiérarchie des templates.
Séparation des rôles : le plugin gère la fonctionnalité (enregistrer le CPT, taxonomies, etc.), tandis que le thème gère la présentation (HTML/CSS/templates).
Surcharges faciles : en mettant le template dans le thème enfant, tu peux le modifier/surcharger sans toucher au cœur ni au plugin.
Styles & cohérence : le template profite automatiquement des styles et composants du thème.
Évolutivité : si tu changes de thème, tu pourras recréer/adapter facilement le template, sans impacter la logique du plugin.
Techniquement, on pourrait forcer le chargement d’un template depuis un plugin via le hook template_include, mais ce n’est pas la bonne pratique pour un site maintenable : garde la logique dans le plugin et l’affichage dans le thème.
Dans WordPress, la page single d’un Custom Post Type affiche le détail d’un seul contenu (titre, contenu, image mise en avant, etc.). Autrement dit, c’est le modèle de page individuelle de ton CPT.
Pour un CPT nommé « project », WordPress cherchera automatiquement le fichier single-project.php dans ton thème (ou thème enfant) pour afficher la page d’un projet.
Exemple d’URL à tester : 127.0.0.1:8001/projets/mon-projet (remplace 127.0.0.1:8001 par le nom de domaine de ton site)
Pour personnaliser l’affichage, crée le fichier single-project.php dans ton thème (et non dans le plugin), afin de maîtriser le HTML/CSS, la mise en page et les éléments que tu veux afficher (méta, taxonomies, navigation, projets liés, commentaires, etc.).
Tu sais maintenant comment créer et afficher ton propre type de contenu dans WordPress grâce aux Custom Post Types (CPT).
Tu as vu deux fichiers essentiels :
archive-project.php → pour afficher la liste complète de tes projets.
single-project.php → pour afficher le détail d’un projet individuel.
Grâce à ton plugin, ton CPT reste indépendant du thème, ce qui te permettra de le réutiliser sur d’autres sites ou de changer de thème sans rien perdre.
Dans un autre article, on pourra aller encore plus loin, par exemple on ajoutera des taxonomies personnalisées, des champs dynamiques avec ACF, et même des blocs Gutenberg dédiés pour enrichir tes projets.
Plan du chapitre
Découvre d’autres articles de la même catégorie pour enrichir tes connaissances et ton inspiration.