Blog
Architecture des Hooks WordPress : Actions vs Filtres expliqués
La base de tout excellent plugin. Apprenez comment PAGEnza AI utilise les hooks et les filtres pour créer du code maintenable et évolutif.
Chaque plugin WordPress fait l'une des deux choses suivantes : il exécute du code à un moment précis (action), ou il modifie une valeur avant qu'elle ne soit utilisée (filtre). C'est tout. L'ensemble de l'écosystème des plugins WordPress est construit sur cette distinction.
Comprendre la différence — et quand utiliser chacun — est ce qui sépare les plugins qui fonctionnent de ceux qui causent des problèmes.
Actions : faire quelque chose à un moment donné
Un hook d'action est un signal que WordPress (ou un autre plugin) envoie à un moment précis. Vous attachez une fonction à ce signal, et votre fonction s'exécute lorsque le signal est déclenché.
add_action( 'wp_enqueue_scripts', 'my_plugin_load_assets' );
function my_plugin_load_assets() {
wp_enqueue_style( 'my-plugin', plugin_dir_url( __FILE__ ) . 'style.css' );
wp_enqueue_script( 'my-plugin', plugin_dir_url( __FILE__ ) . 'script.js', ['jquery'], '1.0', true );
}
wp_enqueue_scripts se déclenche lorsque WordPress se prépare à charger les ressources pour le front-end. S'accrocher à lui est la bonne façon de charger du CSS et du JS — pas de déposer des balises <script> directement dans les templates.
Hooks d'action courants que vous utiliserez constamment :
init— s'exécute tôt, idéal pour enregistrer des types de publication et des taxonomieswp_enqueue_scripts— charger les ressources front-endadmin_enqueue_scripts— charger les ressources d'administrationsave_post— s'exécute lorsqu'un article est enregistré, idéal pour traiter les champs personnaliséswp_ajax_{action}— gérer les requêtes AJAX des utilisateurs authentifiéswp_ajax_nopriv_{action}— gérer les requêtes AJAX des utilisateurs non connectés
Filtres : modifier une valeur avant son utilisation
Un hook de filtre vous donne une valeur, vous permet de la modifier, et s'attend à ce que vous retourniez la version modifiée. WordPress utilise ensuite votre valeur modifiée au lieu de l'originale.
add_filter( 'the_content', 'my_plugin_append_cta' );
function my_plugin_append_cta( $content ) {
if ( ! is_single() ) {
return $content;
}
$cta = '<div class="post-cta">Prêt à essayer PAGEnza ? <a href="#">Commencez gratuitement →</a></div>';
return $content . $cta;
}
La règle critique : retournez toujours quelque chose d'un filtre. Si vous oubliez le return, la valeur devient null et vous venez de casser tout ce qui l'utilisait.
Hooks de filtre courants :
the_content— le contenu de l'article avant affichagethe_title— le titre de l'articlewp_nav_menu_items— HTML du menu de navigationupload_mimes— types de fichiers autorisés à l'uploadplugin_action_links_{plugin-file}— liens affichés sur la page de liste des plugins
Comment PAGEnza AI utilise les hooks
Lorsque le Plugin Builder génère un plugin, il structure le code autour d'une classe avec des méthodes attachées aux hooks dans le constructeur. Ce modèle évite les collisions de noms de fonctions globales et maintient le code organisé.
class My_Plugin {
public function __construct() {
add_action( 'init', [ $this, 'register_post_type' ] );
add_action( 'wp_enqueue_scripts', [ $this, 'load_assets' ] );
add_filter( 'the_content', [ $this, 'append_content' ] );
}
public function register_post_type() { /* ... */ }
public function load_assets() { /* ... */ }
public function append_content( $content ) {
// toujours retourner
return $content;
}
}
new My_Plugin();
L'analyse de sécurité vérifie spécifiquement que les gestionnaires AJAX incluent à la fois une vérification de nonce et une vérification de capacité avant de faire quoi que ce soit :
add_action( 'wp_ajax_my_action', [ $this, 'handle_ajax' ] );
public function handle_ajax() {
// Sécurité : vérifier le nonce
check_ajax_referer( 'my_nonce_action', 'nonce' );
// Sécurité : vérifier les permissions
if ( ! current_user_can( 'manage_options' ) ) {
wp_send_json_error( 'Permissions insuffisantes', 403 );
}
// Maintenant, il est sûr de traiter
$data = sanitize_text_field( $_POST['data'] ?? '' );
wp_send_json_success( [ 'result' => $data ] );
}
L'absence de l'un ou l'autre de ces éléments est signalée comme un problème de sécurité et empêche la publication du plugin.
Priorité et la file d'attente des hooks
Lorsque plusieurs fonctions sont attachées au même hook, elles s'exécutent dans l'ordre de priorité (un nombre plus petit = s'exécute en premier). La priorité par défaut est 10.
add_action( 'init', 'runs_first', 5 );
add_action( 'init', 'runs_second', 10 ); // par défaut
add_action( 'init', 'runs_last', 20 );
Ceci est important lorsque votre plugin doit s'exécuter avant ou après le code d'un autre plugin. Si vous modifiez quelque chose qu'un autre plugin modifie également, la priorité contrôle qui gagne.
Un modèle courant : si vous remplacez un filtre de thème, utilisez la priorité 20 ou supérieure pour vous assurer de vous exécuter après le code du thème.
Suppression des hooks
Vous pouvez supprimer un hook que quelqu'un d'autre a ajouté — y compris les hooks de thème et de plugin :
remove_action( 'wp_head', 'wp_generator' ); // supprime la version WP de <head>
remove_filter( 'the_content', 'wpautop' ); // supprime l'enroulement automatique des paragraphes
Le hic : vous ne pouvez supprimer un hook que si vous appelez remove_action/remove_filter après que le add_action/add_filter original ait été exécuté. Cela signifie généralement accrocher votre suppression à une action ultérieure.