WordPress 38 termes

38 termes affichés

TypeBestPractice Concept Method Security Tool
Niveau 🟢 Junior 🟡 Mid 🔴 Senior

Mis à jour ces 90 derniers jours 7 nouvelles · 4 révisées

$wpdb->prepare

WordPress 🟡 Mid

Méthode de la classe $wpdb pour créer des requêtes SQL paramétrées dans WordPress. Équivalent des prepared statements PDO, adapte a l'écosystème WP.

Comme un coffre-fort avec une serrure a combinaison : les données ne peuvent pas s'échapper du cadre prévu.

global $wpdb;
$results = $wpdb->get_results(
  $wpdb->prepare(
    "SELECT * FROM {$wpdb->posts}
     WHERE post_author = %d AND post_status = %s",
    $authorId, 'publish'
  )
);

Cas d'usage : Pour toute requête SQL directe dans WordPress qui inclut des variables.

Anti-pattern : Concaténer des variables dans la requête : $wpdb->query("DELETE FROM ... WHERE id = $id").
#core#interview#security#wordpress

Abilities API

WordPress 🔴 Senior

Registre standardisé, introduit dans WordPress 6.9 « Gene » (2 décembre 2025), qui décrit des unités de fonctionnalité lisibles par machine : wp_register_ability() déclare label, description, input_schema, output_schema, exécuté_callback et permission_callback, sur le hook wp_abilities_api_init. Les abilities s'exposent en REST sous wp-abilities/v1. WordPress 7.0 ajoute un client côté navigateur et un client IA, 7.1 un cycle d'exécution filtrable.

La carte d'un restaurant lisible par un robot : chaque plat, ses ingrédients et qui a le droit de le commander.

add_action('wp_abilities_api_init', function () {
  wp_register_ability('my-plugin/get-post-count', [
    'label'       => __('Nombre d\'articles', 'my-plugin'),
    'description' => __('Retourne le total d\'articles publiés.'),
    'category'    => 'content-management',
    'execute_callback'    => fn() => wp_count_posts()->publish,
    'permission_callback' => fn() => current_user_can('read'),
    'meta' => ['show_in_rest' => true],
  ]);
});
// GET  /wp-json/wp-abilities/v1/abilities
// POST /wp-json/wp-abilities/v1/abilities/my-plugin/get-post-count/run

Cas d'usage : Exposer proprement les actions d'une extension aux agents IA, aux automatisations et aux autres extensions, avec schéma et permissions.

Anti-pattern : Appeler wp_register_ability() hors du hook wp_abilities_api_init : _doing_it_wrong() et l'enregistrement échoue.
#advanced#wordpress#wp69#ia

Action Hook

WordPress 🟢 Junior

Hook qui permet d'exécuter du code a un moment précis du cycle WordPress (init, wp_head, save_post, etc.). Ne retourne pas de valeur.

Comme une alarme programmée : quand elle sonne, tu exécutés l'action prévue.

add_action('save_post', function(int $postId): void {
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  update_post_meta($postId, '_custom_field', 'value');
}, 10, 1);

Cas d'usage : Pour exécuter du code en réaction a un evenement WordPress : création de post, login, activation de plugin.

Anti-pattern : Accrocher du code lourd (requêtes API) sur des hooks fréquents comme 'init' sans condition.
#core#interview#wordpress

Autoload Options Piege

WordPress 🔴 Senior

Piège de performance ou trop d'options avec autoload=yes sont chargées en mémoire a chaque requête. Une table wp_options volumineuse ralentit tout le site.

Comme charger TOUS tes dossiers dans ton sac chaque matin au lieu de prendre seulement ceux du jour.

// Mauvais : autoload par defaut = yes
update_option('huge_data', $bigArray);

// Bon : desactiver autoload
update_option('huge_data', $bigArray, false);

// Audit
// SELECT SUM(LENGTH(option_value)) FROM wp_options
// WHERE autoload = 'yes';

Cas d'usage : Lors de l'audit de performance d'un site WordPress lent au premier chargement.

Anti-pattern : Stocker des logs, des caches ou des données volumineuses dans wp_options avec autoload.
#interview#wordpress#performance

Block Bindings API

WordPress 🟡 Mid

API disponible depuis WordPress 6.5 qui lie un attribut de bloc (contenu d'un paragraphe, url d'une image, texte d'un bouton…) à une source de données, sans bloc personnalisé. La source core/post-meta lit un champ enregistré avec show_in_rest ; register_block_bindings_source() crée ses propres sources.

Un champ de publipostage : le gabarit reste le même, la valeur vient de la fiche.

// PHP : exposer la méta
register_meta('post', 'prix', [
  'show_in_rest' => true, 'single' => true, 'type' => 'string',
]);

/* Markup du bloc :
<!-- wp:paragraph {"metadata":{"bindings":{
  "content":{"source":"core/post-meta","args":{"key":"prix"}}
}}} -->
<p>Valeur de repli</p>
<!-- /wp:paragraph -->
*/

Cas d'usage : Afficher des champs personnalisés (ACF, méta natives) dans des blocs standards, dans les gabarits de l'éditeur de site.

Anti-pattern : Lier une méta dont la clé commence par un underscore ou non exposée en REST : la liaison est ignorée.
#core#wordpress

Capabilities & Roles

WordPress 🟡 Mid

Système de permissions WordPress ou les roles (admin, editor, author) regroupent des capabilities (édit_posts, manage_options). Contrôle l'accès aux fonctionnalités.

Comme les badges d'accès dans une entreprise : le directeur ouvre toutes les portes, le stagiaire quelques-unes.

// Verifier une capability
if (!current_user_can('edit_posts')) {
  wp_die('Acces interdit');
}

// Ajouter un role custom
add_role('moderator', 'Moderateur', [
  'read' => true, 'edit_posts' => true,
]);

Cas d'usage : Pour contrôler finement qui peut faire quoi dans l'admin et via l'API REST.

Anti-pattern : Vérifier is_admin() au lieu de current_user_can() pour protéger les actions.
#core#interview#security#wordpress

Capabilities Check

WordPress 🟡 Mid

Vérification systématique des permissions utilisateur avant toute action sensible via current_user_can(). Pilier de la sécurité WordPress.

Comme un vigile qui vérifie le badge avant de laisser entrer dans une zone restreinte.

add_action('wp_ajax_delete_item', function() {
  if (!current_user_can('delete_posts')) {
    wp_send_json_error('Non autorise', 403);
  }
  check_ajax_referer('delete_item_nonce');
  // Suppression securisee
});

Cas d'usage : Avant toute action admin : CRUD, changement de settings, accès aux données sensibles.

Anti-pattern : Vérifier seulement is_admin() ou le role au lieu de la capability spécifique.
#core#interview#security#wordpress

Child Theme

WordPress 🟢 Junior

Theme qui hérite de toutes les fonctionnalités d'un theme parent et permet de le personnaliser sans modifier ses fichiers. Les mises a jour du parent sont préservées.

Comme customiser une voiture de série : on ajoute des options sans modifier la carrosserie d'origine.

/* style.css */
/*
 * Theme Name: Mon Theme Enfant
 * Template: theme-parent
 */

// functions.php
add_action('wp_enqueue_scripts', function() {
  wp_enqueue_style('parent', get_template_directory_uri() . '/style.css');
});

Cas d'usage : Pour personnaliser un theme tiers tout en conservant la possibilité de le mettre a jour.

Anti-pattern : Modifier directement les fichiers du theme parent, perdant les changements a chaque mise a jour.
#core#interview#wordpress

Compatibilité PHP × WordPress

WordPress 🟢 Junior

Chaque version de WordPress publie sa grille de compatibilité PHP. Relevé le 27/09/2026 : WordPress 7.1 et 7.0 supportent PHP 7.4 à 8.5 (7.0 a abandonné PHP 7.2 et 7.3) ; 6.9 va de 7.3 à 8.5 (8.5 en bêta) ; 6.8 de 7.3 à 8.4. Côté PHP, seules les branches 8.4 et 8.5 sont en support actif, 8.2 et 8.3 ne reçoivent que des correctifs de sécurité.

La grille de compatibilité des pneus et des jantes : tout ne se monte pas sur tout.

# Version PHP servie par le site
wp eval 'echo PHP_VERSION;'
# Version WordPress
wp core version
# Repères (27/09/2026) :
# WP 7.1 / 7.0 : PHP 7.4 → 8.5
# WP 6.9       : PHP 7.3 → 8.5 (8.5 bêta)
# PHP support actif : 8.4 (jusqu'au 31/12/2026), 8.5 (31/12/2027)

Cas d'usage : Planifier une montée de version PHP sur un parc, ou répondre en entretien à « quelle version de PHP pour un WordPress à jour ? ».

Anti-pattern : Laisser un site en PHP 8.1 ou antérieur (fin du support sécurité) sous prétexte que WordPress le tolère encore.
#core#wordpress#devops

Custom Post Type

WordPress 🟡 Mid

Type de contenu personnalise au-delà des posts et pages natifs. Permet de modéliser des entités métier (produits, evenements, témoignages) avec leur propre interface admin.

Comme ajouter un nouveau type de classeur dans une armoire de bureau : factures, devis, contrats.

register_post_type('product', [
  'labels' => ['name' => 'Produits'],
  'public' => true,
  'has_archive' => true,
  'supports' => ['title', 'editor', 'thumbnail'],
  'show_in_rest' => true,
]);

Cas d'usage : Quand le contenu ne correspond pas aux posts/pages natifs : portfolio, evenements, FAQ, produits.

Anti-pattern : Créer des CPT pour des données qui devraient être en base custom ou en taxonomie.
#core#interview#wordpress

Custom Taxonomy

WordPress 🟡 Mid

Système de classification personnalise pour organiser les contenus au-delà des catégories et tags natifs. Peut être hiérarchique ou plate.

Comme créer un nouveau système d'étiquettes dans une bibliothèque : par couleur, par taille, par theme.

register_taxonomy('brand', ['product'], [
  'labels' => ['name' => 'Marques'],
  'hierarchical' => false,
  'show_in_rest' => true,
  'rewrite' => ['slug' => 'marque'],
]);

Cas d'usage : Pour classifier les CPT : marques de produits, lieux d'evenements, niveaux de difficulté.

Anti-pattern : Utiliser des meta fields pour ce qui devrait être une taxonomie (filtrage et requête moins performants).
#core#interview#wordpress

esc_html / esc_attr / esc_url

WordPress 🟢 Junior

Fonctions d'échappement WordPress adaptées au contexte de sortie : esc_html pour le contenu, esc_attr pour les attributs HTML, esc_url pour les URLs.

Comme des combinaisons de protection différentes selon l'environnement : labo, chantier, ou cuisine.

<a href="<?php echo esc_url($link); ?>">
  <?php echo esc_html($title); ?>
</a>
<input value="<?php echo esc_attr($value); ?>">
<?php echo wp_kses_post($html_content); ?>

Cas d'usage : A chaque affichage de données dynamiques dans les templates WordPress, selon le contexte.

Anti-pattern : Utiliser esc_html dans un attribut href (ne protège pas contre javascript: URLs).
#core#interview#security#wordpress

Filter Hook

WordPress 🟢 Junior

Hook qui permet de modifier une valeur avant qu'elle soit utilisée. Le callback reçoit la valeur, la transforme et la retourne modifiée.

Comme un filtre Instagram : la photo passe dedans et ressort transformée.

add_filter('the_content', function(string $content): string {
  if (is_single()) {
    $content .= '<div class="cta">Abonnez-vous!</div>';
  }
  return $content;
});

Cas d'usage : Pour modifier dynamiquement les titres, contenus, requêtes, URLs sans toucher aux templates.

Anti-pattern : Oublier de retourner la valeur dans un filtre, ce qui retourne null et casse l'affichage.
#core#interview#wordpress

Full Site Editing (FSE)

WordPress 🔴 Senior

Paradigme, apparu avec WordPress 5.9, où tout le site (en-tête, pied de page, gabarits) s'édite par blocs dans l'éditeur de site. WordPress 7.0 « Armstrong » (20 mai 2026) a rendu cet éditeur plus extensible (routage, validation des routes) et WordPress 7.1 « Mary Lou » (19 août 2026) y ajoute des contrôles de style responsives.

Comme passer d'un papier peint fixe a un mur de LEGO : chaque élément du site est deplacable et modifiable.

<!-- templates/single.html (thème bloc) -->
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:post-content /-->
<!-- wp:template-part {"slug":"footer"} /-->

Cas d'usage : Pour les thèmes blocs modernes où les utilisateurs personnalisent la mise en page sans code.

Anti-pattern : Mélanger éditeur de site et gabarits PHP classiques sans stratégie claire.
#core#wordpress#wp7

Gutenberg Block

WordPress 🟡 Mid

Unité de contenu de l'éditeur. Chaque bloc est décrit par un block.json : interface d'édition React et rendu (render.php côté serveur). Depuis WordPress 6.5, un bloc peut déclarer viewScriptModule et supports.interactivity pour utiliser l'Interactivity API, et lier ses attributs à des données via Block Bindings.

Comme des briques de construction modulaires : chacune a sa forme et sa fonction, on les assemble librement.

{
  "name": "myplugin/cta",
  "title": "Call to Action",
  "category": "design",
  "editorScript": "file:./index.js",
  "render": "file:./render.php",
  "viewScriptModule": "file:./view.js",
  "supports": { "interactivity": true }
}

Cas d'usage : Pour créer des composants de contenu réutilisables avec une expérience d'édition visuelle.

Anti-pattern : Créer des blocs complexes sans block.json ni support server-side rendering.
#core#interview#wordpress

Hook System

WordPress 🟢 Junior

Système central de WordPress base sur le pattern Observer. Les hooks permettent aux plugins et themes de modifier le comportement sans toucher au core. Il en existe deux types : Actions et Filtres.

Comme des prises électriques dans une maison : tu branches ce que tu veux, ou tu veux, sans refaire l'installation.

// Action : executer du code a un moment
add_action('wp_footer', function() {
  echo '<script>console.log("loaded")</script>';
});
// Filtre : modifier une valeur
add_filter('the_title', 'strtoupper');

Cas d'usage : Mécanisme fondamental pour toute extension WordPress : plugins, themes, customisations.

Anti-pattern : Modifier directement les fichiers core de WordPress au lieu d'utiliser les hooks.
#core#interview#wordpress

Interactivity API

WordPress 🟡 Mid

API standard, intégrée au cœur depuis WordPress 6.5, pour rendre les blocs interactifs côté front avec des directives HTML (data-wp-interactive, data-wp-context, data-wp-bind, data-wp-on, data-wp-text, data-wp-each…) et un store JavaScript (state, actions, callbacks). Le script se charge en module ES via viewScriptModule dans block.json.

Des post-it sur le HTML qui disent au navigateur quoi faire au clic, sans réécrire la page en React.

<!-- render.php -->
<div data-wp-interactive="myPlugin"
     data-wp-context='{"isOpen": false}'>
  <button data-wp-on--click="actions.toggle">Afficher</button>
  <p data-wp-bind--hidden="!context.isOpen">Contenu caché</p>
</div>

<script type="module">
// view.js
import { store, getContext } from '@wordpress/interactivity';
store('myPlugin', {
  actions: { toggle() { const c = getContext(); c.isOpen = !c.isOpen; } },
});
</script>

Cas d'usage : Accordéons, filtres, paniers, navigation instantanée entre blocs qui partagent un état, sans jQuery ni framework tiers.

Anti-pattern : Charger React ou un framework complet pour un simple bouton alors que les directives suffisent et que le HTML reste rendu côté serveur.
#core#interview#wordpress

Mots de passe d'application

WordPress 🟡 Mid

Mécanisme natif depuis WordPress 5.6 (novembre 2020) pour authentifier des clients externes sur l'API REST : un mot de passe dédié par application, révocable, utilisé en Basic Auth (RFC 7617) sur HTTPS uniquement. Un flux d'autorisation (/wp-admin/authorize-application.php) laisse l'utilisateur créer le jeton depuis l'application.

Une clé de valet : elle ouvre la voiture mais pas le coffre, et on la reprend quand on veut.

# Générer : Profil > Mots de passe d'application (HTTPS requis)
curl --user "USERNAME:xxxx xxxx xxxx xxxx xxxx xxxx" \
  "https://example.com/wp-json/wp/v2/users?context=edit"

# Vérifier que le site les accepte :
curl https://example.com/wp-json/ | jq .authentication

# Flux d'autorisation depuis une appli :
# /wp-admin/authorize-application.php?app_name=MonApp&success_url=…

Cas d'usage : Scripts de déploiement, intégrations SaaS, applications mobiles ou headless qui écrivent dans WordPress sans partager le mot de passe principal.

Anti-pattern : Utiliser le mot de passe du compte ou une extension « Basic Auth » de développement en production.
#security#wordpress#interview

mu-plugin (Must-Use Plugin)

WordPress 🟡 Mid

Plugin charge automatiquement avant tous les autres, sans possibilité de désactivation via l'admin. Place dans wp-content/mu-plugins/.

Comme un système de sécurité intégré dans les murs de la maison : on ne peut pas le débrancher.

// wp-content/mu-plugins/security.php
add_action('init', function() {
  // Forcer HTTPS
  if (!is_ssl()) {
    wp_redirect('https://' . $_SERVER['HTTP_HOST']
      . $_SERVER['REQUEST_URI'], 301);
    exit;
  }
});

Cas d'usage : Pour du code critique qui ne doit jamais être désactivé : sécurité, configuration, performance.

Anti-pattern : Mettre de la logique métier dans un mu-plugin au lieu d'un plugin classique.
#core#wordpress

Nonce WordPress

WordPress 🟡 Mid

Token de sécurité WordPress (number used once) qui protège contre les CSRF et les accès non autorises. Valide 24h, lie a l'action et a l'utilisateur.

Comme un ticket d'entrée a usage unique qui prouve que c'est bien toi qui as demande l'accès.

// Generation
$nonce = wp_create_nonce('delete_post_42');

// Verification
if (!wp_verify_nonce($_POST['_nonce'], 'delete_post_42')) {
  wp_die('Securite : requete non autorisee');
}

Cas d'usage : Sur tout formulaire et lien d'action dans l'admin et le front-end WordPress.

Anti-pattern : Utiliser un nonce générique ('mon_nonce') au lieu d'un nonce spécifique a l'action.
#core#interview#security#wordpress

Object Cache

WordPress 🔴 Senior

Cache en mémoire persistant (Redis, Memcached) qui remplace le cache objet non-persistant par défaut. Accélère drastiquement les requêtes répétées.

Comme une mémoire vive ultra-rapide a cote d'un disque dur lent : les données fréquentes y sont stockées.

// wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');

// Usage dans le code
wp_cache_set('user_42', $userData, 'users', 3600);
$cached = wp_cache_get('user_42', 'users');

Cas d'usage : Sur les sites a fort trafic pour réduire les requêtes base de données de 60-80%.

Anti-pattern : Mettre en cache des données qui changent a chaque requête, annulant tout bénéfice.
#advanced#wordpress#performance

Options API

WordPress 🟢 Junior

Système de stockage clé-valeur dans la table wp_options. Sert pour les réglages du site, des plugins et des themes. Les options autoload=yes sont chargées a chaque requête.

Comme un fichier de configuration central ou chaque plugin note ses préférences.

// Stocker
update_option('mon_plugin_api_key', $key);

// Recuperer
$key = get_option('mon_plugin_api_key', 'default');

// Supprimer
delete_option('mon_plugin_api_key');

Cas d'usage : Pour stocker les paramètrès de configuration du site, des plugins et des themes.

Anti-pattern : Stocker des données volumineuses ou temporaires dans les options avec autoload=yes.
#core#interview#wordpress

Plugin API

WordPress 🟡 Mid

Ensemble de fonctions et conventions permettant de créer des extensions WordPress. Inclut l'activation, la désactivation, les hooks, les settings et les shortcodes.

Comme le kit de développement d'une console de jeux : il fournit les outils pour créer des jeux compatibles.

/*
 * Plugin Name: Mon Plugin
 * Version: 1.0
 */
register_activation_hook(__FILE__, function() {
  // Setup: tables, options, roles
});
add_action('init', 'mon_plugin_init');

Cas d'usage : Pour étendre WordPress avec des fonctionnalités personnalisées de façon maintenable et upgradable.

Anti-pattern : Mettre toute la logique dans functions.php au lieu de créer un plugin réutilisable.
#core#interview#wordpress

pre_get_posts

WordPress 🟡 Mid

Hook filter qui permet de modifier la requête principale de WordPress AVANT son exécution. Le moyen le plus performant de personnaliser les listings.

Comme modifier la commande au restaurant avant qu'elle parte en cuisine, plutôt que de renvoyer le plat.

add_action('pre_get_posts', function(WP_Query $query) {
  if (!is_admin() && $query->is_main_query()) {
    if ($query->is_home()) {
      $query->set('posts_per_page', 6);
      $query->set('post_type', ['post', 'tutorial']);
    }
  }
});

Cas d'usage : Pour modifier le nombre de posts, le tri, les types affiches sur les pages d'archive et la home.

Anti-pattern : Utiliser query_posts() ou créer un nouveau WP_Query quand pre_get_posts suffit.
#core#interview#wordpress#performance

Query Monitor

WordPress 🟡 Mid

Plugin de debugging WordPress qui affiche les requêtes SQL, hooks, erreurs PHP, requêtes HTTP et temps d'exécution en temps réel dans une barre admin.

Comme un tableau de bord médical qui affiche tous les signes vitaux du site en temps réel.

// Pas de code : c'est un plugin a installer
// Affiche dans la barre admin :
// - Nombre et temps des requetes SQL
// - Hooks executes et leur temps
// - Erreurs PHP et notices
// - Scripts/styles charges

Cas d'usage : En développement pour identifier les requêtes lentes, les plugins gourmands et les hooks problématiques.

Anti-pattern : Laisser Query Monitor actif en production (expose des informations sensibles).
#core#tool#wordpress#performance

sanitize_* Functions

WordPress 🟢 Junior

Famille de fonctions WordPress (sanitize_text_field, sanitize_émail, sanitize_url) qui nettoient les données entrantes en supprimant les caractères dangereux.

Comme un filtre a eau qui retire les impuretés avant de boire : on ne fait jamais confiance a l'eau brute.

$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
$url = sanitize_url($_POST['website']);
$html = wp_kses_post($_POST['content']);

Cas d'usage : A chaque réception de données utilisateur dans WordPress : formulaires, AJAX, REST API.

Anti-pattern : Utiliser sanitize_text_field sur du HTML riche (il supprime toutes les balises).
#core#interview#security#wordpress

Template Hierarchy

WordPress 🟡 Mid

Système de résolution de templates ou WordPress cherche le fichier le plus spécifique d'abord (single-product.php) puis remonte vers le plus générique (index.php).

Comme un GPS qui cherche la route la plus précise d'abord, puis une route plus générâle si la précise n'existe pas.

// Pour un post de type 'product' :
// 1. single-product.php
// 2. single.php
// 3. singular.php
// 4. index.php

Cas d'usage : Pour comprendre quel fichier template sera utilise et ou placer ses customisations.

Anti-pattern : Tout mettre dans index.php avec des if/else au lieu d'utiliser la hiérarchie de templates.
#core#interview#wordpress

The Loop

WordPress 🟢 Junior

Boucle principale de WordPress qui itere sur les posts de la requête courante. Utilise have_posts() et the_post() pour afficher le contenu.

Comme un présentoir de magazines : on les feuillette un par un dans l'ordre prévu.

<?php if (have_posts()) : ?>
  <?php while (have_posts()) : the_post(); ?>
    <h2><?php the_title(); ?></h2>
    <div><?php the_content(); ?></div>
  <?php endwhile; ?>
<?php endif; ?>

Cas d'usage : Dans tout template WordPress pour afficher les posts correspondant a la page courante.

Anti-pattern : Appeler the_post() en dehors d'un while ou oublier wp_reset_postdata() après une boucle custom.
#core#interview#wordpress

Theme API

WordPress 🟡 Mid

Système de theming WordPress gérant template hierarchy, theme supports, customizer, menus, sidebars et widgets. Sépare la présentation de la logique.

Comme les habits d'une personne : ils changent l'apparence sans changer la personnalité.

// functions.php
add_action('after_setup_theme', function() {
  add_theme_support('post-thumbnails');
  add_theme_support('title-tag');
  register_nav_menus(['primary' => 'Menu Principal']);
});

Cas d'usage : Pour créer des themes WordPress qui respectent les standards et sont compatibles avec l'écosystème.

Anti-pattern : Hardcoder des URLs et chemins au lieu d'utiliser les fonctions WordPress (get_template_directory_uri).
#core#interview#wordpress

theme.json

WordPress 🟡 Mid

Fichier de configuration central des themes blocs WordPress (5.8+). Définit les couleurs, typographies, espacements et styles globaux en JSON.

Comme un guide de style visuel numérique : il définit les règles de design pour tout le site.

{
  "version": 3,
  "settings": {
    "color": {
      "palette": [
        { "slug": "primary", "color": "#0073aa" }
      ]
    },
    "typography": { "fluid": true }
  }
}

Cas d'usage : Pour tout theme bloc moderne : centralise la configuration visuelle et génère le CSS automatiquement.

Anti-pattern : Dupliquer les variables de style dans theme.json ET dans des feuilles CSS manuelles.
#core#interview#wordpress

Transient API

WordPress 🟡 Mid

Système de cache temporaire natif stockant des données avec expiration. Utilise la table options par défaut, ou un object cache externe si disponible.

Comme un post-it avec une date de péremption : l'info est disponible rapidement mais disparaît après un temps.

$data = get_transient('api_data');
if ($data === false) {
  $data = wp_remote_get('https://api.example.com/data');
  set_transient('api_data', $data, HOUR_IN_SECONDS);
}

Cas d'usage : Pour cacher les résultats d'appels API externes, de requêtes coûteuses ou de calculs lourds.

Anti-pattern : Stocker des transients sans expiration (ils ne sont jamais nettoyés automatiquement dans la table options).
#core#interview#wordpress#performance

WordPress 6.9 → 7.1 : repères

WordPress 🟢 Junior

Trois majeures en neuf mois. 6.9 « Gene » (2 décembre 2025) : notes sur les blocs, palette de commandes partout, Abilities API. 7.0 « Armstrong » (20 mai 2026) : refonte de l'administration, client IA dans le cœur, blocs créés côté serveur en PHP. 7.1 « Mary Lou » (19 août 2026) : contrôles de style responsives, éditeur de médias, traitement d'images dans le navigateur (WebAssembly), AVIF/HEIC. Version de sécurité 7.1.2 le 22 septembre 2026.

Les millésimes d'un vin : savoir ce que chaque année a apporté.

# Sauvegarde puis mise à jour vers la dernière branche
wp db export avant-maj.sql
wp core check-update
wp core update && wp core update-db
wp plugin update --all
# Vérifier
wp core version   # attendu : 7.1.x (7.1.2 = sécurité du 22/09/2026)
wp plugin list --update=available

Cas d'usage : Situer un site client dans le cycle, justifier une mise à jour de sécurité, citer les nouveautés utiles en entretien.

Anti-pattern : Sauter plusieurs majeures d'un coup sans sauvegarde ni test des extensions sur un Playground ou une préprod.
#core#wordpress#wp7

WordPress Playground

WordPress 🟢 Junior

WordPress complet exécuté dans le navigateur : PHP compilé en WebAssembly et SQLite à la place de MySQL, sans serveur ni compte. Un Blueprint (fichier JSON) décrit l'instance : versions de PHP et WordPress, extensions à installer, connexion, page d'arrivée. Instance publique : playground.wordpress.net.

Une maquette de cuisine dans un salon : on essaie tout, rien n'est branché chez soi.

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/wp-admin/",
  "preferredVersions": { "php": "8.3", "wp": "latest" },
  "steps": [
    { "step": "login", "username": "admin", "password": "password" }
  ]
}
// Chargement : playground.wordpress.net/#<json>
//           ou ?blueprint-url=https://…/blueprint.json

Cas d'usage : Démo d'extension reproductible, test d'une mise à jour sur plusieurs versions de PHP, formation, prototypage sans installation locale.

Anti-pattern : S'en servir comme hébergement : les données vivent dans l'onglet et disparaissent à sa fermeture.
#tool#wordpress

WP REST API

WordPress 🟡 Mid

API REST native de WordPress exposant les contenus en JSON. Elle permet le headless, les SPA et les intégrations externes. Authentification : cookie + nonce (X-WP-Nonce) côté navigateur, mots de passe d'application (Basic Auth sur HTTPS, WordPress 5.6) pour les clients externes.

Comme un guichet de service qui fournit les informations dans un format standard que tout le monde peut lire.

register_rest_route('myplugin/v1', '/items', [
  'methods'  => 'GET',
  'callback' => fn(WP_REST_Request $req) =>
    new WP_REST_Response($data, 200),
  // public ? sinon : fn() => current_user_can('edit_posts')
  'permission_callback' => '__return_true',
]);

Cas d'usage : Pour les architectures headless, les apps mobiles ou les intégrations tierces avec WordPress.

Anti-pattern : Exposer une route avec permission_callback => '__return_true' pour des données non publiques, ou l'omettre : WordPress exige ce paramètre.
#core#interview#wordpress

WP-CLI

WordPress 🟡 Mid

Interface en ligne de commande officielle de WordPress. Elle permet de gérer extensions, thèmes, base de données, utilisateurs et plus sans navigateur. Chaque commande destructrice (search-replace) se teste d'abord avec --dry-run.

Comme un tableau de bord textuel pour piloter WordPress a la vitesse de la lumière.

# Mise à jour
wp core update && wp plugin update --all
# Rechercher/remplacer (dry-run d'abord)
wp search-replace 'http://old.com' 'https://new.com' --dry-run
wp search-replace 'http://old.com' 'https://new.com'
# Export base
wp db export backup.sql

Cas d'usage : Pour l'automatisation, les déploiements, la maintenance et les migrations WordPress.

Anti-pattern : Faire des opérations massives (search-replace) depuis l'interface web au lieu de WP-CLI.
#core#tool#wordpress

WP_Cron

WordPress 🟡 Mid

Système de taches planifiées de WordPress, déclenché par les visites des utilisateurs (pseudo-cron). Peut être remplace par un vrai cron système pour plus de fiabilité.

Comme un réveil qui ne sonne que quand quelqu'un passe devant : il n'est pas fiable si personne ne vient.

// Planifier
if (!wp_next_scheduled('daily_cleanup')) {
  wp_schedule_event(time(), 'daily', 'daily_cleanup');
}
add_action('daily_cleanup', function() {
  // Nettoyage quotidien
});

Cas d'usage : Pour les taches récurrentes : nettoyage, envoi d'emails, synchronisation de données.

Anti-pattern : Compter sur WP_Cron pour des taches critiques sans configurer DISABLE_WP_CRON + cron système.
#core#wordpress

wp_enqueue_script

WordPress 🟢 Junior

Méthode standard pour charger CSS et JS dans WordPress. Gère les dépendances, le versioning, le placement header/footer et évite les doublons.

Comme un chef d'orchestre qui décide quels musiciens jouent, dans quel ordre et a quel moment.

add_action('wp_enqueue_scripts', function() {
  wp_enqueue_style('main', get_stylesheet_uri(), [], '1.0');
  wp_enqueue_script(
    'app', get_theme_file_uri('js/app.js'),
    ['jquery'], '1.0', true
  );
});

Cas d'usage : Pour tout chargement de CSS/JS dans un theme ou plugin WordPress.

Anti-pattern : Insérer des balises <script> et <link> directement dans le header au lieu d'utiliser le système d'enqueue.
#core#interview#wordpress

WP_Query

WordPress 🟡 Mid

Classe PHP pour construire des requêtes de posts personnalisées. Permet de filtrer par type, taxonomie, meta, date, avec pagination et cache.

Comme un moteur de recherche interne ultra précis : tu définis tes critères, il trouve les contenus.

$query = new WP_Query([
  'post_type' => 'product',
  'posts_per_page' => 12,
  'tax_query' => [[
    'taxonomy' => 'category',
    'terms' => 'featured',
  ]],
]);
wp_reset_postdata();

Cas d'usage : Pour afficher des listes de contenus personnalisées (produits vedettes, articles récents d'une catégorie).

Anti-pattern : Utiliser query_posts() qui écrase la requête globale au lieu de créer un nouveau WP_Query.
#core#interview#wordpress