WordPress 31 termes

31 termes affichés

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

$wpdb->prepare

WordPress 🟡 Mid

Methode de la classe $wpdb pour creer des requetes SQL parametrees dans WordPress. Equivalent des prepared statements PDO, adapte a l'ecosysteme WP.

Comme un coffre-fort avec une serrure a combinaison : les donnees ne peuvent pas s'echapper du cadre prevu.

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 requete SQL directe dans WordPress qui inclut des variables.

Anti-pattern : Concatener des variables dans la requete : $wpdb->query("DELETE FROM ... WHERE id = $id").
#core#interview#security#wordpress

Action Hook

WordPress 🟢 Junior

Hook qui permet d'executer du code a un moment precis du cycle WordPress (init, wp_head, save_post, etc.). Ne retourne pas de valeur.

Comme une alarme programmee : quand elle sonne, tu executes l'action prevue.

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 executer du code en reaction a un evenement WordPress : creation de post, login, activation de plugin.

Anti-pattern : Accrocher du code lourd (requetes API) sur des hooks frequents comme 'init' sans condition.
#core#interview#wordpress

Autoload Options Piege

WordPress 🔴 Senior

Piege de performance ou trop d'options avec autoload=yes sont chargees en memoire a chaque requete. 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 donnees volumineuses dans wp_options avec autoload.
#interview#wordpress#performance

Capabilities & Roles

WordPress 🟡 Mid

Systeme de permissions WordPress ou les roles (admin, editor, author) regroupent des capabilities (edit_posts, manage_options). Controle l'acces aux fonctionnalites.

Comme les badges d'acces 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 controler finement qui peut faire quoi dans l'admin et via l'API REST.

Anti-pattern : Verifier is_admin() au lieu de current_user_can() pour proteger les actions.
#core#interview#security#wordpress

Capabilities Check

WordPress 🟡 Mid

Verification systematique des permissions utilisateur avant toute action sensible via current_user_can(). Pilier de la securite WordPress.

Comme un vigile qui verifie 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, acces aux donnees sensibles.

Anti-pattern : Verifier seulement is_admin() ou le role au lieu de la capability specifique.
#core#interview#security#wordpress

Child Theme

WordPress 🟢 Junior

Theme qui herite de toutes les fonctionnalites d'un theme parent et permet de le personnaliser sans modifier ses fichiers. Les mises a jour du parent sont preservees.

Comme customiser une voiture de serie : 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 possibilite 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

Custom Post Type

WordPress 🟡 Mid

Type de contenu personnalise au-dela des posts et pages natifs. Permet de modeliser des entites metier (produits, evenements, temoignages) 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 : Creer des CPT pour des donnees qui devraient etre en base custom ou en taxonomie.
#core#interview#wordpress

Custom Taxonomy

WordPress 🟡 Mid

Systeme de classification personnalise pour organiser les contenus au-dela des categories et tags natifs. Peut etre hierarchique ou plate.

Comme creer un nouveau systeme d'etiquettes dans une bibliotheque : 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 difficulte.

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

esc_html / esc_attr / esc_url

WordPress 🟢 Junior

Fonctions d'echappement WordPress adaptees 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 differentes 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 donnees dynamiques dans les templates WordPress, selon le contexte.

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

Filter Hook

WordPress 🟢 Junior

Hook qui permet de modifier une valeur avant qu'elle soit utilisee. Le callback recoit la valeur, la transforme et la retourne modifiee.

Comme un filtre Instagram : la photo passe dedans et ressort transformee.

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, requetes, 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 WordPress 5.9+ ou tout le site (header, footer, templates) est editable via des blocs Gutenberg. Remplace le Customizer classique.

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

// theme.json active FSE
// templates/single.html
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:post-content /-->
<!-- wp:template-part {"slug":"footer"} /-->

Cas d'usage : Pour les themes modernes permettant aux utilisateurs de personnaliser tout le layout sans code.

Anti-pattern : Mixer FSE et templates PHP classiques sans strategie claire, creant de la confusion.
#core#wordpress

Gutenberg Block

WordPress 🟡 Mid

Unite de contenu de l'editeur Gutenberg. Chaque bloc est un composant React avec une interface d'edition et un rendu front. Base du Full Site Editing.

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

// block.json
{
  "name": "myplugin/cta",
  "title": "Call to Action",
  "category": "design",
  "editorScript": "file:./index.js",
  "render": "file:./render.php"
}

Cas d'usage : Pour creer des composants de contenu reutilisables avec une experience d'edition visuelle.

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

Hook System

WordPress 🟢 Junior

Systeme 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 electriques 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 : Mecanisme 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

mu-plugin (Must-Use Plugin)

WordPress 🟡 Mid

Plugin charge automatiquement avant tous les autres, sans possibilite de desactivation via l'admin. Place dans wp-content/mu-plugins/.

Comme un systeme de securite integre dans les murs de la maison : on ne peut pas le debrancher.

// 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 etre desactive : securite, configuration, performance.

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

Nonce WordPress

WordPress 🟡 Mid

Token de securite WordPress (number used once) qui protege contre les CSRF et les acces non autorises. Valide 24h, lie a l'action et a l'utilisateur.

Comme un ticket d'entree a usage unique qui prouve que c'est bien toi qui as demande l'acces.

// 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 generique ('mon_nonce') au lieu d'un nonce specifique a l'action.
#core#interview#security#wordpress

Object Cache

WordPress 🔴 Senior

Cache en memoire persistant (Redis, Memcached) qui remplace le cache objet non-persistant par defaut. Accelere drastiquement les requetes repetees.

Comme une memoire vive ultra-rapide a cote d'un disque dur lent : les donnees frequentes y sont stockees.

// 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 reduire les requetes base de donnees de 60-80%.

Anti-pattern : Mettre en cache des donnees qui changent a chaque requete, annulant tout benefice.
#advanced#wordpress#performance

Options API

WordPress 🟢 Junior

Systeme de stockage cle-valeur dans la table wp_options. Sert pour les reglages du site, des plugins et des themes. Les options autoload=yes sont chargees a chaque requete.

Comme un fichier de configuration central ou chaque plugin note ses preferences.

// 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 parametres de configuration du site, des plugins et des themes.

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

Plugin API

WordPress 🟡 Mid

Ensemble de fonctions et conventions permettant de creer des extensions WordPress. Inclut l'activation, la desactivation, les hooks, les settings et les shortcodes.

Comme le kit de developpement d'une console de jeux : il fournit les outils pour creer 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 etendre WordPress avec des fonctionnalites personnalisees de facon maintenable et upgradable.

Anti-pattern : Mettre toute la logique dans functions.php au lieu de creer un plugin reutilisable.
#core#interview#wordpress

pre_get_posts

WordPress 🟡 Mid

Hook filter qui permet de modifier la requete principale de WordPress AVANT son execution. Le moyen le plus performant de personnaliser les listings.

Comme modifier la commande au restaurant avant qu'elle parte en cuisine, plutot 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 creer un nouveau WP_Query quand pre_get_posts suffit.
#core#interview#wordpress#performance

Query Monitor

WordPress 🟡 Mid

Plugin de debugging WordPress qui affiche les requetes SQL, hooks, erreurs PHP, requetes HTTP et temps d'execution en temps reel dans une barre admin.

Comme un tableau de bord medical qui affiche tous les signes vitaux du site en temps reel.

// 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 developpement pour identifier les requetes lentes, les plugins gourmands et les hooks problematiques.

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_email, sanitize_url) qui nettoient les donnees entrantes en supprimant les caracteres dangereux.

Comme un filtre a eau qui retire les impuretes 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 reception de donnees 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

Systeme de resolution de templates ou WordPress cherche le fichier le plus specifique d'abord (single-product.php) puis remonte vers le plus generique (index.php).

Comme un GPS qui cherche la route la plus precise d'abord, puis une route plus generale si la precise 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 hierarchie de templates.
#core#interview#wordpress

The Loop

WordPress 🟢 Junior

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

Comme un presentoir de magazines : on les feuillette un par un dans l'ordre prevu.

<?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() apres une boucle custom.
#core#interview#wordpress

Theme API

WordPress 🟡 Mid

Systeme de theming WordPress gerant template hierarchy, theme supports, customizer, menus, sidebars et widgets. Separe la presentation de la logique.

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

// 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 creer des themes WordPress qui respectent les standards et sont compatibles avec l'ecosysteme.

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+). Definit les couleurs, typographies, espacements et styles globaux en JSON.

Comme un guide de style visuel numerique : il definit les regles 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 genere 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

Systeme de cache temporaire natif stockant des donnees avec expiration. Utilise la table options par defaut, ou un object cache externe si disponible.

Comme un post-it avec une date de peremption : l'info est disponible rapidement mais disparait apres 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 resultats d'appels API externes, de requetes couteuses ou de calculs lourds.

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

WP REST API

WordPress 🟡 Mid

API RESTful native de WordPress exposant les contenus en JSON. Permet le headless WordPress, les SPA et l'integration avec des applications 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' => function(WP_REST_Request $req) {
    return new WP_REST_Response($data, 200);
  },
  'permission_callback' => '__return_true',
]);

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

Anti-pattern : Exposer des endpoints sans permission_callback, laissant les donnees accessibles a tous.
#core#interview#wordpress

WP_Cron

WordPress 🟡 Mid

Systeme de taches planifiees de WordPress, declenche par les visites des utilisateurs (pseudo-cron). Peut etre remplace par un vrai cron systeme pour plus de fiabilite.

Comme un reveil 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 recurrentes : nettoyage, envoi d'emails, synchronisation de donnees.

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

wp_enqueue_script

WordPress 🟢 Junior

Methode standard pour charger CSS et JS dans WordPress. Gere les dependances, le versioning, le placement header/footer et evite les doublons.

Comme un chef d'orchestre qui decide 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 : Inserer des balises <script> et <link> directement dans le header au lieu d'utiliser le systeme d'enqueue.
#core#interview#wordpress

WP_Query

WordPress 🟡 Mid

Classe PHP pour construire des requetes de posts personnalisees. Permet de filtrer par type, taxonomie, meta, date, avec pagination et cache.

Comme un moteur de recherche interne ultra precis : tu definis tes criteres, 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 personnalisees (produits vedettes, articles recents d'une categorie).

Anti-pattern : Utiliser query_posts() qui ecrase la requete globale au lieu de creer un nouveau WP_Query.
#core#interview#wordpress

WP-CLI

WordPress 🟡 Mid

Interface en ligne de commande officielle de WordPress. Permet de gerer plugins, themes, base de donnees, utilisateurs et plus sans navigateur.

Comme un tableau de bord textuel pour piloter WordPress a la vitesse de la lumiere.

# Mise a jour
wp core update && wp plugin update --all
# Rechercher/remplacer
wp search-replace 'http://old.com' 'https://new.com'
# Export base
wp db export backup.sql

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

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

Autres stacks

Advanced Ecosystem Architecture CSS-in-JS DevOps HTML / CSS JavaScript MongoDB Mongoose NestJS Personalities PHP PostgreSQL React Sass Styled-Components Tailwind CSS Testing TypeScript
← Retour au lexique complet