Quiz 2 — Architecture & hooks
⏱️ TL;DR — 20 questions sur l’environnement de dev, le cycle de requête, les hooks, The Loop et WP_Query (Parties 4–5). Réponds de tête, puis déplie.
1. Action vs filtre ?
Réponse
Une action (do_action) = « il s’est passé quelque chose », ton callback agit (echo, enregistre). Un filtre (apply_filters) = une valeur passe par ta fonction qui la modifie et la retourne.
2. Que déclarent les 3e et 4e arguments d’add_action ?
Réponse
La priorité (défaut 10, plus petit = plus tôt) et le nombre d’arguments acceptés (accepted_args). Oublier ce dernier = « argument manquant ».
3. Dans un filtre the_content, que se passe-t-il si on oublie le return ?
Réponse
Le contenu disparaît (la fonction retourne null). Un filtre doit toujours retourner la valeur (modifiée ou non). Bug classique.
4. Que fait-on typiquement sur le hook init ?
Réponse
On enregistre CPT, taxonomies, shortcodes… init se déclenche après le chargement de WordPress, avant tout rendu. register_post_type doit y être appelé.
5. Quelle est la bonne façon d’ajouter un CSS/JS ?
Réponse
L’enqueue (wp_enqueue_style/script) sur le hook wp_enqueue_scripts — jamais de <link>/<script> en dur. WordPress gère dépendances, versions, ordre.
6. Qu’est-ce que « The Loop » ?
Réponse
La boucle qui parcourt les résultats de la requête principale (have_posts() / the_post()) et affiche chaque contenu. Le bloc Query Loop en est la version no-code.
7. À quoi sert pre_get_posts ?
Réponse
À modifier la requête principale avant exécution (ex. articles par page sur les archives). Toujours vérifier ! is_admin() et is_main_query() pour ne pas tout casser.
8. Qu’est-ce que la hiérarchie de gabarits (template hierarchy) ?
Réponse
L’ordre selon lequel WordPress choisit le fichier de gabarit du plus spécifique au plus général (single-livre.php > single.php > index.php). Le routing par convention.
9. Comment interroger la base en SQL sans risque d’injection ?
Réponse
Avec $wpdb->prepare("… WHERE id = %d", $id) (placeholders %d/%s/%f). Jamais de concaténation. Et privilégier WP_Query/get_posts au SQL brut.
10. Options, transients, cache : à quoi servent-ils ?
Réponse
Options (get_option) = config persistante. Transients (set_transient) = cache avec expiration. Le cache objet accélère les requêtes répétées. À invalider au bon moment.
11. Qu’est-ce que WP-Cron ?
Réponse
Le planificateur de tâches de WordPress, déclenché par le trafic (pas un vrai cron système). Il publie les articles planifiés et lance les tâches récurrentes (wp_schedule_event).
12. Pourquoi flush_rewrite_rules à l’activation d’un plugin ?
Réponse
Parce qu’un nouveau CPT crée des URLs (/livres/…) qui n’existent qu’après un flush des règles de réécriture. On l’appelle une fois à l’activation (sinon 404).
13. Rôle de wp-config.php et de WP_DEBUG ?
Réponse
wp-config.php = identifiants BDD, clés (salts), constantes (le .env de WordPress). WP_DEBUG = true affiche les erreurs PHP (avec WP_DEBUG_LOG → debug.log). Jamais affiché en prod.
14. À quoi sert WP-CLI ?
Réponse
À administrer WordPress en ligne de commande (wp plugin, wp post, wp search-replace, wp db export). Indispensable en pro, surtout search-replace (gère les données sérialisées).
15. Où doit vivre tout ton code (structure des fichiers) ?
Réponse
Dans wp-content/ (themes/, plugins/, uploads/, mu-plugins/). On ne touche jamais wp-admin/ ni wp-includes/ (écrasés aux mises à jour).
16. Comment référencer le préfixe de tables en code ?
Réponse
Via $wpdb->prefix (jamais wp_ en dur), car le préfixe est configurable. Ex. "{$wpdb->prefix}mytable".
17. À quoi servent les conditional tags (is_single, is_admin…) ?
Réponse
À agir selon le contexte (« où/qui sommes-nous »). ⚠️ La plupart ne sont fiables qu’après le hook wp (pas trop tôt).
18. Comment rendre ton propre code extensible ?
Réponse
En déclarant tes hooks : do_action('mon_hook', $data) et apply_filters('mon_filtre', $valeur). D’autres pourront s’y brancher sans modifier ton plugin.
19. Sur save_post, pourquoi ignorer les révisions ?
Réponse
Parce que save_post tire aussi pour les révisions/autosaves → double déclenchement. On teste wp_is_post_revision($post_id) et on sort. Puis vérif nonce + capability.
20. À quoi sert current_user_can ?
Réponse
À vérifier la capability de l’utilisateur côté serveur avant une action sensible. Cacher un bouton ne protège rien : il faut vérifier au traitement.
Quiz suivant : Quiz 3 — Thèmes & plugins.