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 taxonomies
  • wp_enqueue_scripts — charger les ressources front-end
  • admin_enqueue_scripts — charger les ressources d'administration
  • save_post — s'exécute lorsqu'un article est enregistré, idéal pour traiter les champs personnalisés
  • wp_ajax_{action} — gérer les requêtes AJAX des utilisateurs authentifiés
  • wp_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 affichage
  • the_title — le titre de l'article
  • wp_nav_menu_items — HTML du menu de navigation
  • upload_mimes — types de fichiers autorisés à l'upload
  • plugin_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.