WordPress est écrit en PHP, et la plupart de ses possibilités passent par un ensemble de fonctions et de mécanismes qu’il vaut mieux connaître avant d’écrire la première ligne de code. Les hooks, la boucle de requête, les options, le chargement des scripts ou la sécurité des données reviennent dans presque tous les projets, qu’il s’agisse d’un petit thème enfant ou d’une extension complète.
Cet article présente les fonctions et notions indispensables, avec des exemples courts que vous pouvez tester sur un site de développement. L’objectif : comprendre la logique de WordPress plutôt que copier des extraits au hasard. Si vous travaillez sur une boutique, la logique reste la même et se prolonge avec le SEO technique de WooCommerce.
À retenir
- WordPress fonctionne par hooks : les actions exécutent du code, les filtres modifient des données.
- WP_Query et les fonctions d’options évitent d’écrire du SQL à la main.
- Toute donnée entrante se valide, toute donnée sortante s’échappe, et les formulaires utilisent des nonces.
- Travaillez dans un thème enfant ou une extension, jamais en modifiant le cœur de WordPress.
1. Préparer un environnement de développement propre
Ne développez jamais directement sur un site en production. Installez WordPress en local avec un outil comme Local, DevKinsta, XAMPP ou Docker, ou utilisez un site de préproduction chez votre hébergeur. Vous pourrez y tester sans risque et revenir en arrière facilement.
Activez le mode débogage dans le fichier wp-config.php. Il affiche ou enregistre les erreurs PHP, ce qui vous fait gagner un temps considérable. Sur un site public, enregistrez les erreurs dans un fichier plutôt que de les afficher.
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );Le journal est alors écrit dans wp-content/debug.log. Gardez aussi une règle simple : votre code personnalisé va dans un thème enfant ou dans une extension dédiée. Si vous modifiez le thème parent, vos changements disparaîtront à la prochaine mise à jour.
2. Les hooks : actions et filtres
Les hooks sont le mécanisme central de WordPress. Une action (add_action) permet d’exécuter votre code à un moment précis : chargement des scripts, enregistrement d’un article, affichage du pied de page. Un filtre (add_filter) permet de modifier une valeur avant qu’elle ne soit utilisée ou affichée : un titre, un extrait, le contenu d’un article. Une fonction de filtre doit toujours retourner la valeur.
// Action : exécuter du code au bon moment
add_action( 'wp_footer', 'ewp_afficher_mention' );
function ewp_afficher_mention() {
echo '<p>Site réalisé avec WordPress</p>';
}
// Filtre : modifier une valeur
add_filter( 'the_title', 'ewp_titre_en_majuscules' );
function ewp_titre_en_majuscules( $titre ) {
return mb_strtoupper( $titre );
}Préfixez toujours vos fonctions (ici ewp_) pour éviter les collisions avec le thème et les autres extensions. Vous pouvez aussi définir la priorité (le troisième argument, 10 par défaut) et le nombre d’arguments acceptés (le quatrième). Pour retirer un comportement ajouté par un thème, remove_action et remove_filter doivent utiliser la même priorité que l’ajout.

Les hooks les plus utiles à connaître : init (initialisation), wp_enqueue_scripts (scripts et styles du site), admin_menu (menus d’administration), save_post (enregistrement d’un contenu), the_content (filtre du contenu) et template_redirect (redirections avant l’affichage).
3. WP_Query : interroger les contenus
WP_Query est la classe qui récupère des articles, pages ou contenus personnalisés. Elle remplace avantageusement le SQL manuel, car elle gère pour vous les statuts, les droits et les caches. Vous passez un tableau de paramètres, puis vous parcourez les résultats avec une boucle.
$requete = new WP_Query( [
'post_type' => 'post',
'posts_per_page' => 5,
'category_name' => 'seo',
'orderby' => 'date',
'order' => 'DESC',
] );
if ( $requete->have_posts() ) {
while ( $requete->have_posts() ) {
$requete->the_post();
echo '<h2>' . esc_html( get_the_title() ) . '</h2>';
}
wp_reset_postdata();
}N’oubliez pas wp_reset_postdata() après une requête secondaire, sinon les fonctions de la requête principale se comportent de façon inattendue. Pour modifier la requête principale d’une page d’archive, utilisez plutôt le hook pre_get_posts, qui évite de lancer une seconde requête inutile.
posts_per_page => -1 sur un site volumineux : charger tous les contenus d’un coup peut saturer la mémoire du serveur. Paginez ou limitez le nombre de résultats.Les paramètres meta_query et tax_query permettent de filtrer par champ personnalisé ou par taxonomie. Ils sont puissants, mais peuvent être lents sur de grandes tables : mesurez avec Query Monitor avant de les multiplier.
4. Options, métadonnées et transients
WordPress stocke les réglages dans la table des options. Les fonctions get_option, update_option et add_option lisent et écrivent ces valeurs, qui sont mises en cache automatiquement. Pour les données propres à un article, utilisez les métadonnées : get_post_meta, update_post_meta et delete_post_meta. Les équivalents existent pour les utilisateurs (get_user_meta) et les termes (get_term_meta).
// Réglage global
update_option( 'ewp_message_accueil', 'Bienvenue !' );
$message = get_option( 'ewp_message_accueil', 'Bonjour' );
// Donnée liée à un article
update_post_meta( $post_id, 'ewp_temps_lecture', 8 );
$minutes = (int) get_post_meta( $post_id, 'ewp_temps_lecture', true );Les transients (set_transient, get_transient) conservent un résultat coûteux, comme la réponse d’une API externe, pendant une durée donnée. Utilisez-les pour éviter de refaire la même opération à chaque visite. Gardez en tête qu’un transient peut disparaître à tout moment : votre code doit toujours savoir recalculer la valeur.

5. Charger scripts et styles avec wp_enqueue
N’écrivez jamais les balises <script> ou <link> directement dans le thème. WordPress fournit un système de file d’attente qui gère les dépendances, les versions et les doublons. Déclarez vos fichiers sur le hook wp_enqueue_scripts.
add_action( 'wp_enqueue_scripts', 'ewp_charger_assets' );
function ewp_charger_assets() {
wp_enqueue_style(
'ewp-style',
get_stylesheet_directory_uri() . '/style.css',
[],
'1.0.0'
);
wp_enqueue_script(
'ewp-script',
get_stylesheet_directory_uri() . '/assets/app.js',
[],
'1.0.0',
[ 'in_footer' => true, 'strategy' => 'defer' ]
);
}Le dernier paramètre de wp_enqueue_script accepte, depuis WordPress 6.3, un tableau avec la stratégie de chargement (defer ou async) et la position dans le pied de page. Changer le numéro de version force les navigateurs à recharger le fichier après une modification. Ne chargez vos fichiers que sur les pages qui en ont besoin, à l’aide de conditions comme is_singular() ou is_front_page().
6. Sécurité : valider, nettoyer, échapper, vérifier
La sécurité du code repose sur quatre habitudes. Valider : vérifier que la donnée correspond à ce qui est attendu. Nettoyer à l’entrée (sanitize_text_field, sanitize_email, absint). Échapper à la sortie (esc_html, esc_attr, esc_url, wp_kses_post). Enfin vérifier l’intention et les droits avec les nonces et les capacités.
// Formulaire : champ nonce
wp_nonce_field( 'ewp_enregistrer', 'ewp_nonce' );
// Traitement
if ( ! isset( $_POST['ewp_nonce'] )
|| ! wp_verify_nonce( $_POST['ewp_nonce'], 'ewp_enregistrer' ) ) {
wp_die( 'Requête invalide.' );
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( 'Accès refusé.' );
}
$nom = sanitize_text_field( wp_unslash( $_POST['nom'] ?? '' ) );Le principe : on ne fait jamais confiance à $_GET, $_POST ou $_COOKIE. Une valeur affichée sans échappement ouvre la porte aux attaques XSS ; une action sans nonce ni contrôle de capacité peut être déclenchée à l’insu d’un administrateur. Ces vérifications sont aussi au cœur d’une bonne hygiène technique du site, car un site compromis perd rapidement sa visibilité.
current_user_can() pour les actions sensibles.7. Types de contenus, shortcodes et base de données
register_post_type crée un type de contenu personnalisé (portfolio, événement, produit, témoignage) avec ses propres écrans d’administration, tandis que register_taxonomy crée des classements dédiés. Déclarez-les sur le hook init, et pensez à enregistrer show_in_rest => true pour les rendre disponibles dans l’éditeur de blocs et l’API REST.
add_action( 'init', 'ewp_type_temoignage' );
function ewp_type_temoignage() {
register_post_type( 'temoignage', [
'label' => 'Témoignages',
'public' => true,
'show_in_rest' => true,
'supports' => [ 'title', 'editor', 'thumbnail' ],
'menu_icon' => 'dashicons-format-quote',
] );
}Un shortcode (add_shortcode) insère un bloc de contenu dynamique dans un article avec une syntaxe courte comme [temoignages nombre="3"]. La fonction doit retourner le contenu, pas l’afficher avec echo.
Pour interroger la base directement, par exemple sur une table personnalisée, passez par l’objet global $wpdb et ses méthodes. Utilisez toujours $wpdb->prepare() pour y injecter des valeurs : il protège contre les injections SQL.
global $wpdb;
$resultats = $wpdb->get_results(
$wpdb->prepare(
"SELECT ID, post_title FROM {$wpdb->posts}
WHERE post_status = %s AND post_author = %d",
'publish',
$auteur_id
)
);
8. Organiser son code et poursuivre l’apprentissage
Une extension propre suit quelques conventions. Un fichier principal avec l’en-tête de description, des fichiers séparés par fonctionnalité, un préfixe commun, des fichiers de traduction (__() et _e() avec un domaine de texte) et une désinstallation propre via uninstall.php. Dans un thème enfant, ne surchargez que ce qui est nécessaire : un fichier style.css, un functions.php et quelques modèles.
Pour progresser, lisez le Code Reference et le Developer Handbook, observez le code des extensions réputées, et adoptez les standards de code WordPress. Un outil comme PHP_CodeSniffer, avec les règles WordPress, détecte automatiquement les erreurs de style et plusieurs failles courantes.

Enfin, mettez en place un contrôle de version avec Git : chaque modification se retrouve dans l’historique, et un retour en arrière devient trivial. Le même réflexe sera précieux quand vous commencerez à monétiser votre site avec des extensions sur mesure.
Checklist : développer proprement sur WordPress
À cocher avant de passer à autre chose
- ☐ Je développe en local ou en préproduction, jamais en production
- ☐ WP_DEBUG et le journal d’erreurs sont activés
- ☐ Mon code est dans un thème enfant ou une extension
- ☐ Mes fonctions ont un préfixe unique
- ☐ Les scripts passent par wp_enqueue_script
- ☐ Les entrées sont nettoyées et les sorties échappées
- ☐ Les actions sensibles vérifient un nonce et une capacité
- ☐ Les requêtes SQL utilisent $wpdb->prepare()
Conclusion
Maîtriser quelques dizaines de fonctions suffit pour développer l’essentiel de ce que demande un projet WordPress. Retenez la logique des hooks, privilégiez les API du système (WP_Query, options, enqueue) plutôt que du code improvisé, et ne négligez jamais la sécurité. À partir de ce socle, vous pouvez passer à des sujets plus avancés. Pour comprendre comment l’IA change la manière dont les sites sont découverts, lisez notre article sur le SEO et le GEO.
Prochaine étape
Votre code est propre ? Vérifiez maintenant que votre site n’est pas victime d’erreurs qui l’empêchent d’apparaître sur Google.
Lire les 15 erreurs SEO à éviter