Les hooks sont le système nerveux de WordPress. Sans eux, il serait impossible d'étendre le CMS sans modifier le code source. Actions et filters sont ce qui fait de WordPress une plateforme extensible plutôt qu'un simple logiciel.
Pourtant, beaucoup de développeurs les utilisent sans vraiment comprendre leur mécanique : priorité, nombre de paramètres, hooks conditionnels, création de hooks personnalisés pour vos propres plugins et thèmes.
Ce guide est conçu pour les développeurs qui veulent passer de « j'utilise des hooks » à « je maîtrise le système de hooks ». On y couvre la théorie, la pratique, les pièges, et les patterns avancés ?" avec des exemples concrets issus de notre travail chez Volade.
Creez un compte Volade gratuit
Debloquez les ressources membres de cet article et le pack complet Volade.
Sans carte bancaire · Les checklists publiques restent gratuites.
Actions vs Filters : la différence fondamentale
Les actions
Une action est un point d'exécution dans le code WordPress où vous pouvez ajouter votre propre code. L'action ne retourne rien ?" elle exécute.
// Hook de base
add_action('wp_head', 'mon_fonction_meta');
function mon_fonction_meta() {
echo '<meta name="auteur" content="Volade">';
}
// Action avec paramètres
add_action('save_post', 'mon_log_sauvegarde', 10, 3);
function mon_log_sauvegarde($post_id, $post, $update) {
error_log("Post $post_id sauvegardé. Mise à jour : " . ($update ? 'oui' : 'non'));
}
Les filters
Un filter reçoit une valeur, la modifie, et la retourne. Il ne doit jamais faire d'effet de bord direct (echo, redirection, insertion BDD).
// Filter basique
add_filter('excerpt_length', 'mon_longeur_extrait');
function mon_longeur_extrait($length) {
return 30; // 30 mots au lieu de 55
}
// Filter avec paramètres supplémentaires
add_filter('the_content', 'mon_ajout_cta', 20, 1);
function mon_ajout_cta($content) {
if (is_single()) {
$cta = '<p><a href="/contact" class="cta">Contactez-nous</a></p>';
$content .= $cta;
}
return $content;
}
Tableau comparatif
| Critère | Action | Filter |
|---|---|---|
| Objectif | Exécuter du code | Modifier une valeur |
| Valeur de retour | Rien (void) | La valeur modifiée |
| Fonction hook | do_action() | apply_filters() |
| Ajout hook | add_action() | add_filter() |
| Paramètre principal | Nom du hook | La valeur à filtrer |
| Effet de bord autorisé | Oui | Non (idéalement) |
Priorité et paramètres
Comprendre la priorité
La priorité (3e argument) détermine l'ordre d'exécution des hooks attachés au même point. Plus le chiffre est bas, plus l'exécution est précoce.
// Ordre d'exécution : C (5) ?' A (10) ?' B (10) ?' D (100)
add_action('init', 'fonction_a', 10);
add_action('init', 'fonction_b', 10);
add_action('init', 'fonction_c', 5);
add_action('init', 'fonction_d', 100);
:::callout-warning
Ne mettez pas toutes vos fonctions à priorité 10 par défaut. Si trois plugins se greffent sur wp_enqueue_scripts à priorité 10, l'ordre est indéterminé. Utilisez 5, 10, 20, 100 pour laisser de l'espace aux autres.
:::
Gérer les paramètres
Le 4e argument de add_action / add_filter est le nombre de paramètres que votre fonction accepte.
// Le hook save_post passe 3 paramètres
add_action('save_post', 'mon_handler', 10, 3);
function mon_handler($post_id, $post, $update) {
// $post_id : ID du post sauvegardé
// $post : objet WP_Post complet
// $update : booléen (true = mise à jour, false = création)
}
Si vous ne spécifiez pas accepted_args, WordPress ne passe qu'un paramètre ?" les autres sont silencieusement ignorés.
| Erreur fréquente | Symptôme | Solution |
|---|---|---|
accepted_args non défini | La fonction reçoit moins de données que prévu | Toujours préciser accepted_args quand > 1 |
| Priorité identique | Ordre d'exécution aléatoire entre plusieurs plugins | Espacer les priorités (5, 10, 20, 50, 100) |
| Paramètre non passé par référence | Modifications non persistées | Utiliser &$var si le hook le permet |
Créer vos propres hooks
Quand créer un hook personnalisé
- Votre plugin ou thème doit être extensible par d'autres développeurs
- Vous voulez permettre de modifier des valeurs sans toucher à votre code
- Vous avez des points stratégiques dans votre code où d'autres pourraient avoir besoin d'intervenir
Créer une action personnalisée
// Dans votre plugin
function volade_envoyer_email_bienvenue($user_id) {
$user = get_userdata($user_id);
// Envoi de l'email...
// Permettre à d'autres plugins d'ajouter des actions après l'envoi
do_action('volade_apres_email_bienvenue', $user_id, $user);
}
// Dans un autre plugin ou theme
add_action('volade_apres_email_bienvenue', 'mon_ajout_log_email', 10, 2);
function mon_ajout_log_email($user_id, $user) {
error_log("Email de bienvenue envoyé à {$user->user_email}");
}
Créer un filter personnalisé
// Dans votre plugin
function volade_prix_produit($produit_id) {
$prix = get_post_meta($produit_id, 'prix', true);
// Permettre aux extensions de modifier le prix
return apply_filters('volade_prix_produit', $prix, $produit_id);
}
// Dans une extension
add_filter('volade_prix_produit', 'mon_appliquer_reduction', 10, 2);
function mon_appliquer_reduction($prix, $produit_id) {
if (has_term('promo', 'tag_produit', $produit_id)) {
return $prix * 0.9; // -10 %
}
return $prix;
}
Conventions de nommage
| Convention | Exemple | Usage |
|---|---|---|
{plugin}_{action}_ | volade_avant_envoi_email | Actions |
{plugin}_filter_{nom} | volade_filter_prix | Filters (alternatif) |
{plugin}_{resource}_{action} | volade_commande_avant_paiement | Actions spécifiques |
{plugin}_{resource}_filter | volade_commande_filter_total | Filters spécifiques |
Quand vous créez un hook personnalisé, adoptez ces 3 réflexes : 1) préfixez TOUS vos hooks avec votre namespace (ex: volade_) ?" c'est le seul moyen d'éviter les collisions avec d'autres plugins ; 2) documentez chaque hook avec un bloc PHPDoc complet (@param, @return, @since, @example) ?" un hook que personne ne comprend est un hook inutile ; 3) passez systématiquement les paramètres supplémentaires (3e argument de add_action/add_filter) même si votre fonction n'en a pas besoin aujourd'hui ?" vous ou un autre développeur en aurez besoin demain et devrez modifier le code sans casser la rétrocompatibilité.
Hooks conditionnels (conditional hooks)
N'exécuter un hook que dans certains contextes
// Hook conditionnel basé sur une capability
if (current_user_can('manage_options')) {
add_action('admin_bar_menu', 'mon_ajout_admin_bar_link', 100);
}
// Hook conditionnel basé sur un type de post
if (get_post_type() === 'produit') {
add_filter('the_content', 'mon_cta_produit');
}
// Hook conditionnel basé sur une page spécifique
add_action('template_redirect', function() {
if (is_page('contact')) {
add_action('wp_footer', 'mon_script_tracking_contact');
}
});
Les hooks conditionnels natifs WordPress
| Hook | Déclencheur |
|---|---|
init | WordPress chargé, avant tout header |
wp_loaded | Toutes les requêtes WordPress sont traitées |
template_redirect | Avant la sélection du template |
wp_enqueue_scripts | Chargement des scripts et styles |
admin_enqueue_scripts | Chargement des scripts admin |
save_post | Sauvegarde d'un post |
wp_login | Connexion utilisateur |
wp_logout | Déconnexion utilisateur |
user_register | Nouvel utilisateur créé |
deleted_post | Post supprimé |
Exemples concrets de hooks avancés
Exemple 1 : Ajouter une colonne personnalisée dans l'admin
// Ajouter la colonne
add_filter('manage_posts_columns', 'ajouter_colonne_extrait');
function ajouter_colonne_extrait($columns) {
$columns['extrait'] = 'Extrait';
return $columns;
}
// Afficher le contenu de la colonne
add_action('manage_posts_custom_column', 'afficher_colonne_extrait', 10, 2);
function afficher_colonne_extrait($column_name, $post_id) {
if ($column_name === 'extrait') {
echo wp_trim_words(get_the_excerpt($post_id), 20);
}
}
Exemple 2 : Modifier la requête principale
add_action('pre_get_posts', 'modifier_query_archive');
function modifier_query_archive($query) {
if (!is_admin() && $query->is_main_query() && is_post_type_archive('produit')) {
$query->set('posts_per_page', 24);
$query->set('orderby', 'meta_value_num');
$query->set('meta_key', 'prix');
$query->set('order', 'ASC');
}
}
Exemple 3 : Redirection après connexion personnalisée
add_filter('login_redirect', 'rediriger_apres_login', 10, 3);
function rediriger_apres_login($redirect_to, $request, $user) {
if (isset($user->roles) && in_array('subscriber', $user->roles)) {
return home_url('/mon-compte/');
}
return $redirect_to;
}
Bonnes pratiques
Pour déboguer un hook qui ne s'exécute pas, activez le mode WP_DEBUG et ajoutez temporairement error_log( 'Hook exécuté : ' . current_filter() ) dans votre callback. Si le message n'apparaît pas dans les logs, le problème est dans l'ordre d'exécution ?" vérifiez que votre priorité (3e argument) est suffisamment basse (5 ou 1) et que votre accepted_args correspond bien aux paramètres passés par le hook. 80 % des bugs de hooks viennent d'un mauvais accepted_args ou d'une priorité trop haute.
Checklist du hook bien écrit
- Nom de hook unique et préfixé avec votre namespace
- Priorité explicitement définie et espacée des autres
accepted_argstoujours précisé quand > 1- Documentation du hook (paramètres, type de retour, exemple)
- Hook exécuté au bon moment du cycle de vie WordPress
- Dans un filter : toujours retourner la valeur modifiée (jamais null sauf si explicite)
- Dans une action : pas de valeur de retour utilisée par l'appelant
Anti-patterns à éviter
// ? ?VITER : filter avec effet de bord
add_filter('the_title', 'mauvais_filter');
function mauvais_filter($title) {
update_post_meta(get_the_ID(), 'dernier_acces', time()); // EFFET DE BORD
return $title;
}
// ? ?VITER : priorité trop large
add_action('init', 'fonction_totale', 10); // 10 000 plugins sur init à 10
add_action('init', 'fonction_importante', 10); // ordre aléatoire
// ? ?VITER : paramètres manquants
add_action('save_post', 'mon_handler'); // reçoit 1 paramètre, pas 3
Ce qu'on retient
Le système de hooks de WordPress est à la fois simple et profond. Actions et filters partagent la même mécanique mais ont des usages distincts.
Maîtrisez les priorités : ne laissez pas l'ordre d'exécution au hasard. Espacez vos priorités (5, 10, 20, 50, 100) pour laisser de la place à d'autres extensions.
Spécifiez toujours accepted_args : c'est la source numéro 1 de bugs silencieux dans les hooks. Si vous attendez 3 paramètres, écrivez add_action('hook', 'func', 10, 3).
Créez des hooks personnalisés : c'est ce qui distingue un plugin fermé d'un plugin extensible. do_action('mon_prefixe_event') et apply_filters('mon_prefixe_filter', $value) sont vos meilleurs outils.
Documentez vos hooks : un hook sans documentation est un hook que personne n'utilisera.
Article mis à jour le 9 juillet 2026. Sources : WordPress Plugin Developer Handbook, documentation Code Reference, retours d'expérience Volade.
FAQ — Hooks WordPress 2026 :
Qu'est-ce que Hooks WordPress 2026 : ?
Les hooks sont le système nerveux de WordPress. Sans eux, il serait impossible d'étendre le CMS sans modifier le code source. Actions et filters sont ce qui fait de WordPress une plateforme extensible plutôt qu'un simple logiciel.
Actions vs Filters : la différence fondamentale : quels sont les points clés ?
Les actions
Une action est un point d'exécution dans le code WordPress où vous pouvez ajouter votre propre code. L'action ne retourne rien ?" elle exécute. php
// Hook de base
add_action('wp_head', 'mon_fonction_meta');
function mon_fonction_meta() { echo '<meta name="auteur" content="Volade">';
}
// Action avec paramètres
add_action('save_post', 'mon_log_sauvegarde', 10, 3);
function mon_log_
Priorité et paramètres : quels sont les points clés ?
Comprendre la priorité
La priorité (3e argument) détermine l'ordre d'exécution des hooks attachés au même point. Plus le chiffre est bas, plus l'exécution est précoce. php
// Ordre d'exécution : C (5) ?' A (10) ?' B (10) ?' D (100)
add_action('init', 'fonction_a', 10);
add_action('init', 'fonction_b', 10);
add_action('init', 'fonction_c', 5);
add_action('init', 'fonction_d', 100); Ne mettez pa
Créer vos propres hooks : quels sont les points clés ?
Quand créer un hook personnalisé
Votre plugin ou thème doit être extensible par d'autres développeurs
Vous voulez permettre de modifier des valeurs sans toucher à votre code
Vous avez des points stratégiques dans votre code où d'autres pourraient avoir besoin d'intervenir
Créer une action personnalisée
php
// Dans votre plugin
function volade_envoyer_email_bienvenue($user_id) { $user = get
Hooks conditionnels (conditional hooks) : quels sont les points clés ?
N'exécuter un hook que dans certains contextes
php
// Hook conditionnel basé sur une capability
if (current_user_can('manage_options')) { add_action('admin_bar_menu', 'mon_ajout_admin_bar_link', 100);
}
// Hook conditionnel basé sur un type de post
if (get_post_type() === 'produit') { add_filter('the_content', 'mon_cta_produit');
}
// Hook conditionnel basé sur une page spécifique
add_action('
Exemples concrets de hooks avancés : quels sont les points clés ?
Exemple 1 : Ajouter une colonne personnalisée dans l'admin
php
// Ajouter la colonne
add_filter('manage_posts_columns', 'ajouter_colonne_extrait');
function ajouter_colonne_extrait($columns) { $columns'extrait' = 'Extrait'; return $columns;
}
// Afficher le contenu de la colonne
add_action('manage_posts_custom_column', 'afficher_colonne_extrait', 10, 2);
function afficher_colonne_extrait($colu
Bonnes pratiques : quels sont les points clés ?
Pour déboguer un hook qui ne s'exécute pas, activez le mode WP_DEBUG et ajoutez temporairement error_log( 'Hook exécuté : ' . current_filter() ) dans votre callback. Si le message n'apparaît pas dans les logs, le problème est dans l'ordre d'exécution ?" vérifiez que votre priorité (3e argument) est suffisamment basse (5 ou 1) et que votre accepted_args correspond bien aux paramètres passés par le
Ce qu'on retient : quels sont les points clés ?
Le système de hooks de WordPress est à la fois simple et profond. Actions et filters partagent la même mécanique mais ont des usages distincts. Maîtrisez les priorités : ne laissez pas l'ordre d'exécution au hasard.
Quels sont les prérequis pour se lancer ?
Avant de commencer, assurez-vous d'avoir les bases : un site ou projet bien défini, des objectifs clairs, et les ressources nécessaires (temps, budget, compétences). Le reste s'acquiert en chemin.
Par où commencer après avoir lu cet article ?
Identifiez votre besoin prioritaire, choisissez 2-3 actions concrètes de cet article, et lancez-vous cette semaine. Fixez-vous un point dans 30 jours pour ajuster. L'important est de passer à l'action.
Pret a passer a l'action ?
Explorez le catalogue Volade — sans compte pour commencer.
Votre avis compte
Commentez « Hooks WordPress 2026 : guide complet pour développeurs ?" actions, filters, création, bonnes pratiques » ou notez cet article pour aider la communauté.
personnes ont partagé cet article