Introduction
Le système de hooks (crochets) de WordPress est l’épine dorsale de son architecture extensible. C’est ce qui permet à des milliers de plugins et thèmes de coexister et d’étendre WordPress sans modifier son code source. Comprendre les hooks est essentiel pour tout développeur WordPress intermédiaire.
Dans ce guide approfondi, nous explorerons la différence entre actions et filtres, leur fonctionnement interne, et comment les utiliser efficacement dans vos projets professionnels.
Table des matières
- Architecture du système de hooks
- Actions vs Filtres : comprendre la différence
- Utiliser les actions existantes
- Utiliser les filtres existants
- Créer vos propres hooks personnalisés
- Priorités et ordre d’exécution
- Hooks conditionnels et contextuels
- Performance et optimisation
- Debugging des hooks
- Cas d’usage avancés et patterns
1. Architecture du système de hooks
Le pattern Observer
WordPress implémente le pattern de conception Observer (aussi appelé Publish-Subscribe) :
┌─────────────┐ Fire Event ┌──────────────┐
│ WordPress │ ──────────────────────> │ Hook System │
│ Core │ │ (wp-hooks) │
└─────────────┘ └──────────────┘
│
│ Notify
▼
┌────────────────────────────────┐
│ Registered Callbacks │
│ (Plugins, Themes, Functions) │
└────────────────────────────────┘
Fonctionnement interne
WP_Hook Object {
callbacks = array(
10 => array( // Priorité
'unique_id_1' => array(
'function' => 'callback_function',
'accepted_args' => 1
),
'unique_id_2' => array(
'function' => array($object, 'method'),
'accepted_args' => 2
)
),
20 => array( ... )
)
}
)
*/
Cycle de vie d’un hook
1. add_action() ou add_filter()
↓
- Stockage dans $wp_filter global
↓
- do_action() ou apply_filters()
↓
- Tri par priorité
↓
- Exécution séquentielle des callbacks
↓
- Retour du résultat (filtres) ou fin (actions)
2. Actions vs Filtres : comprendre la différence
Actions : Faire quelque chose à un moment précis
Les actions permettent d’exécuter du code à des moments spécifiques sans modifier de données.
Filtres : Modifier des données
Les filtres permettent de modifier des données avant qu'elles soient utilisées ou affichées.
Tableau comparatif
| Caractéristique | Actions | Filtres |
|---|---|---|
| But | Exécuter du code | Modifier des données |
| Valeur de retour | Aucune (void) | Obligatoire |
| Fonction d'ajout | add_action() |
add_filter() |
| Fonction de déclenchement | do_action() |
apply_filters() |
| Exemple d'usage | Envoyer un email, enregistrer un log | Modifier un titre, ajouter du CSS |
3. Utiliser les actions existantes
Actions du cycle de vie WordPress
array(
'name' => 'Livres',
'singular_name' => 'Livre'
),
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'thumbnail'),
'rewrite' => array('slug' => 'livres'),
));
// Enregistrer des taxonomies
register_taxonomy('genre', 'livre', array(
'labels' => array(
'name' => 'Genres',
'singular_name' => 'Genre'
),
'hierarchical' => true,
'rewrite' => array('slug' => 'genre'),
));
}
/**
* Hook lors de l'activation d'un thème
*/
add_action('after_setup_theme', 'yawc_theme_setup');
function yawc_theme_setup() {
// Support des fonctionnalités du thème
add_theme_support('post-thumbnails');
add_theme_support('custom-logo');
add_theme_support('html5', array(
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
));
// Enregistrer les menus
register_nav_menus(array(
'primary' => **('Menu Principal', 'yawc'),
'footer' => **('Menu Pied de page', 'yawc'),
));
// Tailles d'images personnalisées
add_image_size('portrait', 400, 600, true);
add_image_size('paysage', 800, 400, true);
}
/**
* Hook lors du chargement des scripts
*/
add_action('wp_enqueue_scripts', 'yawc_enqueue_assets');
function yawc_enqueue_assets() {
// Charger les styles
wp_enqueue_style(
'yawc-main-style',
get_template_directory_uri() . '/assets/css/main.css',
array(),
'1.0.0'
);
// Charger les scripts
wp_enqueue_script(
'yawc-main-script',
get_template_directory_uri() . '/assets/js/main.js',
array('jquery'),
'1.0.0',
true
);
// Passer des données PHP au JavaScript
wp_localize_script('yawc-main-script', 'yawcData', array(
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('yawc-nonce'),
'siteUrl' => home_url(),
));
}
Actions de contenu et d'affichage
';
$before .= '' . yawc_get_reading_time() . ' min de lecture';
$before .= 'Publié le ' . get_the_date() . '';
$before .= '