Comment créer un plugin WordPress : guide complet pour débutants 2026
Apprenez à créer un plugin WordPress from scratch : structure, hooks, classes PHP, shortcodes, sécurisation et publication sur WordPress.org.
Introduction : pourquoi créer son propre plugin WordPress ?
WordPress alimente plus de 43 % du web mondial, et sa force réside dans son système d’extensions. Créer un plugin WordPress vous permet d’ajouter des fonctionnalités sur mesure sans modifier le core ni le thème. Que vous soyez développeur souhaitant distribuer votre travail sur WordPress.org ou chef de projet voulant comprendre le fonctionnement interne, ce guide complet vous accompagne pas à pas dans la création d’un plugin professionnel en 2026.
Nous allons couvrir la structure d’un plugin, les hooks WordPress (actions et filtres), la création d’une page de réglages, les shortcodes personnalisés, la sécurisation du code et enfin la publication officielle sur le répertoire WordPress.org.
Structure d’un plugin WordPress : les bases indispensables
Un plugin WordPress est un dossier placé dans wp-content/plugins/. Il contient au minimum un fichier PHP principal avec un en-tête standardisé que WordPress lit pour identifier le plugin.
<?php
/**
* Plugin Name: Mon Super Plugin
* Plugin URI: https://example.com/mon-plugin
* Description: Un plugin qui fait des choses formidables.
* Version: 1.0.0
* Author: Votre Nom
* License: GPL-2.0+
* Text Domain: mon-super-plugin
*/
if ( ! defined( 'ABSPATH' ) ) { exit; }
Architecture recommandée :
mon-super-plugin/
├── mon-super-plugin.php
├── includes/
│ ├── class-core.php
│ ├── class-admin.php
│ └── class-public.php
├── admin/
├── public/
├── languages/
└── readme.txt
Cette structure orientée objet sépare la logique administrateur de la logique front-end et facilite la maintenance à long terme.
add_action et add_filter : le cœur du système de hooks
WordPress fonctionne sur un système de hooks qui permet aux plugins de s’intercaler dans l’exécution du code sans modifier les fichiers core. Il existe deux types : les actions (exécutent du code) et les filtres (modifient et retournent une valeur).
// Action : ajouter un script JS
add_action( 'wp_enqueue_scripts', 'mon_plugin_enqueue_scripts' );
function mon_plugin_enqueue_scripts() {
wp_enqueue_script(
'mon-plugin-script',
plugin_dir_url( __FILE__ ) . 'public/js/main.js',
array( 'jquery' ), '1.0.0', true
);
}
// Filtre : modifier le titre
add_filter( 'the_title', 'mon_plugin_modifier_titre' );
function mon_plugin_modifier_titre( $title ) {
if ( is_single() ) return '» ' . $title;
return $title;
}
La priorité (3e argument, défaut 10) contrôle l’ordre d’exécution. Plus le nombre est faible, plus le hook s’exécute tôt.
Créer une page de réglages dans l’administration WordPress
L’API Settings de WordPress permet de créer des pages de configuration standardisées avec une gestion automatique de la sécurité.
add_action( 'admin_menu', 'mon_plugin_ajouter_menu' );
function mon_plugin_ajouter_menu() {
add_options_page(
'Réglages Mon Plugin', 'Mon Plugin',
'manage_options', 'mon-plugin-settings',
'mon_plugin_render_settings'
);
}
add_action( 'admin_init', 'mon_plugin_enregistrer_settings' );
function mon_plugin_enregistrer_settings() {
register_setting( 'mon_plugin_group', 'mon_plugin_option' );
add_settings_section( 'section_1', 'Paramètres généraux', '__return_false', 'mon-plugin-settings' );
add_settings_field( 'champ_nom', 'Votre nom', 'mon_plugin_render_champ', 'mon-plugin-settings', 'section_1' );
}
function mon_plugin_render_settings() { ?>
<div class="wrap">
<h1>Mon Plugin</h1>
<form method="post" action="options.php">
<?php settings_fields( 'mon_plugin_group' );
do_settings_sections( 'mon-plugin-settings' );
submit_button(); ?>
</form>
</div>
<?php }
Créer un shortcode personnalisé
Les shortcodes permettent aux rédacteurs d’insérer du contenu dynamique dans les articles sans écrire de code.
add_shortcode( 'mon_plugin_boite', 'mon_plugin_render_boite' );
function mon_plugin_render_boite( $atts, $content = null ) {
$atts = shortcode_atts( array(
'couleur' => 'bleu',
'titre' => 'Information',
), $atts, 'mon_plugin_boite' );
$couleur = sanitize_html_class( $atts['couleur'] );
$titre = sanitize_text_field( $atts['titre'] );
ob_start(); ?>
<div class="boite boite--<?php echo esc_attr($couleur); ?>">
<h4><?php echo esc_html($titre); ?></h4>
<div><?php echo wp_kses_post($content); ?></div>
</div>
<?php return ob_get_clean();
}
Utilisation : [mon_plugin_boite couleur="vert" titre="Astuce"]Votre texte[/mon_plugin_boite]
Sécuriser son plugin : nonces, sanitization et vérification des droits
La sécurité est l’aspect le plus négligé par les débutants. Un plugin mal sécurisé expose votre site à des attaques XSS, CSRF ou injection SQL.
// Nonce dans le formulaire
echo '<input type="hidden" name="nonce" value="' . wp_create_nonce( 'mon_action' ) . '">';
// Vérification à la soumission
if ( ! wp_verify_nonce( $_POST['nonce'], 'mon_action' ) ) {
wp_die( 'Action non autorisée.' );
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Droits insuffisants.' );
}
// Sanitization selon le type de données
$email = sanitize_email( $_POST['email'] );
$texte = sanitize_text_field( $_POST['texte'] );
$html = wp_kses_post( $_POST['contenu'] );
$url = esc_url_raw( $_POST['url'] );
$entier = absint( $_POST['id'] );
// Requêtes SQL préparées
global $wpdb;
$result = $wpdb->get_results(
$wpdb->prepare( "SELECT * FROM {$wpdb->prefix}posts WHERE ID = %d", absint( $_GET['id'] ) )
);
Hooks d’activation, désactivation et désinstallation
register_activation_hook( __FILE__, 'mon_plugin_activation' );
function mon_plugin_activation() {
global $wpdb;
$table = $wpdb->prefix . 'mon_plugin_data';
$sql = "CREATE TABLE IF NOT EXISTS $table (
id mediumint(9) NOT NULL AUTO_INCREMENT,
valeur text NOT NULL,
PRIMARY KEY (id)
) " . $wpdb->get_charset_collate() . ";";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta( $sql );
add_option( 'mon_plugin_version', '1.0.0' );
}
register_deactivation_hook( __FILE__, 'mon_plugin_desactivation' );
function mon_plugin_desactivation() {
wp_clear_scheduled_hook( 'mon_plugin_cron' );
}
// Dans uninstall.php :
// if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) exit;
// delete_option( 'mon_plugin_version' );
Distribuer son plugin sur WordPress.org
Pour publier sur le répertoire officiel : 1) Créez un compte WordPress.org. 2) Soumettez via wordpress.org/plugins/developers/add/. 3) Attendez la revue de code (1 à 4 semaines). 4) Recevez un accès SVN pour uploader votre plugin. 5) Rédigez un readme.txt complet.
=== Mon Super Plugin ===
Contributors: votrenom
Tags: shortcode, personnalisation
Requires at least: 6.0
Tested up to: 6.7
Stable tag: 1.0.0
License: GPLv2 or later
Description courte (max 150 caractères).
== Description ==
Description complète avec markdown.
== Installation ==
1. Uploader dans /wp-content/plugins/
2. Activer dans Extensions
== Changelog ==
= 1.0.0 = Version initiale
Pour un accompagnement professionnel dans le développement de plugins sur mesure, consultez notre page développeur WordPress Paris.
Questions fréquentes sur la création de plugins WordPress
Faut-il être expert PHP pour créer un plugin WordPress ?
Non, un niveau intermédiaire en PHP suffit pour créer un plugin simple. Vous devez maîtriser les fonctions, les classes, les tableaux et les bases de la POO. La documentation officielle WordPress (developer.wordpress.org) est très bien documentée et propose des tutoriels accessibles aux débutants.
Quelle est la différence entre un plugin et un thème enfant ?
Un thème enfant est lié à un thème parent spécifique et disparaît si vous changez de thème. La règle : tout ce qui touche à la fonctionnalité va dans un plugin, tout ce qui touche à la présentation va dans le thème. Ainsi, vos fonctionnalités persistent quelle que soit la mise en page choisie.
Mon plugin ralentit le site, comment optimiser ?
Chargez les scripts uniquement sur les pages nécessaires (utiliser is_page(), is_singular()), mettez en cache les requêtes BDD coûteuses avec l’Object Cache WordPress (wp_cache_set/wp_cache_get), évitez les requêtes N+1 et utilisez update_option avec autoload à no pour les options rarement lues.
Comment déboguer un plugin WordPress efficacement ?
Activez le mode debug dans wp-config.php avec define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);. Utilisez error_log(print_r($variable, true)) pour inspecter les variables. Le plugin Query Monitor affiche les hooks déclenchés, les requêtes SQL et les erreurs PHP en temps réel.