Intermediaire 1 min de lecture · 181 mots

WordPress Hooks : Actions et Filtres expliqués avec exemples

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 .= '

Une remarque, un retour ?

Cet article est vivant - corrections, contre-arguments et retours de production sont les bienvenus. Trois canaux, choisissez celui qui vous convient.

Laisser un commentaire