ENI Service - WordPress - PHP

Paul Schuhmacher

Durée : 28h

Novembre 2025

Partie 1 : Présentation, setup et fonctionnement général (core)

Partie 1 : Présentation, setup et fonctionnement général (core) #

bg right contain w: 80%

Pour bien s’installer et commencer à se familiariser avec le framework.

Questions préliminaires à l’audience #

Pour adapter au mieux le reste de la formation :

WordPress, en bref #

Historique

WordPress, en bref #

Quelques actualités récentes

Caractéristiques générales et évolution #

Usages de WordPress #

{domain}/wp-json/wp
{domain}/wp-json/wp/v2/posts

Contributeur·ices au core (2023) #

Nombre de commits par entreprise

bg right contain

Source

Contributeur·ices au core (2023) #

Nombre de contributeur·ices par pays

bg right contain

Source

Releases, roadmap de WordPress #

Pas grand chose de nouveau sur les autres API… (Settings, REST, etc..)

Accéder à la roadmap

Écosystème #

Projet open-source, protégé par la WordPress Foundation (protège la marque WordPress).

wordpress.org

Vendors majeurs (services)

WordPress (wordpress.org) != Wordpress.com (Automattic) != WP Engine !

Préparation de l’environnement de développement #

Versions de PHP supportées #

À l’heure de la formation

Attention : il est de la responsabilité de chaque vendor (thème, plugin) de maintenir la compatibilité de ses modules avec WordPress !

Voir la compatibilité entre WordPress et PHP selon leurs versions.

SBGBDR (base de données) supportés #

À l’heure de la formation

Possible d’utiliser d’autres systèmes (PostgreSQL, SQLite) mais demande une couche logicielle supplémentaire (plugins), peu d’intérêt si le choix ;

Installation de l’environnement de développement #

Télécharger le kit de développement (dossier kit-dev) préparé pour la formation.

  1. Cloner le dépôt;
  2. Suivre les instructions.;
  3. Annexe : Se préparer un environnement de développement complet sous Windows avec la WSL.

Nous utiliserons Docker pour servir le projet en local.

Présentation de l’environnement de développement #

WordPress Core : Architecture #

#A la racine du kit de développement, après installation
cd web
ls -C1 --group-directories-first

WordPress Core #

wp-admin/
wp-content/
wp-includes/
index.php
license.txt
readme.html
wp-activate.php
wp-blog-header.php
wp-comments-post.php
wp-config-docker.php
wp-config.php
wp-config-sample.php
wp-cron.php
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php

WordPress Core #

Trois répertoires :

Les contenus HTML (pages, posts, users, etc.) et leurs métadonnées sont stockés dans la base de données.

Configuration de WordPress #

wp-admin/
wp-content/
wp-includes/
index.php
license.txt
readme.html
wp-activate.php
wp-blog-header.php
wp-comments-post.php
wp-config-docker.php
........................... => wp-config.php
wp-config-sample.php
wp-cron.php
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php

Configuration de WordPress #

Le fichier wp-config-sample.php sert de base à la création du fichier wp-config.php lors de l’installation.

Accéder à la documentation de wp-config.php

Authentification sous WordPress #

Le hash est calculé avec les clés et sels définis dans wp-config.php (cf slide suivante).

Il est également possible de s’authentifier auprès de la REST API via plusieurs méthodes (JWT, Basic Auth, etc. )

Clefs et sels #

Les clefs et sels sont générés à l’installation et sont utilisés pour signer les cookies d’authentification et les nonces (tokens anti-CSRF pour les formulaires) :

//Clefs secrètes pour signer :
//- les cookies d'authentification admin
define( 'AUTH_KEY',         'put your unique phrase here' );
//- les cookies d'authentification admin en HTTPS
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
//- les cookies d'authentification d'un utilisateur connecté à l'interface publique, sans accès à l’administration.
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
//- les nonces WordPress (tokens CSRF) utilisés pour valider les formulaires d'un user authentifié
define( 'NONCE_KEY',        'put your unique phrase here' );
//Sels (salts) associés à leurs clés respectives
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

WordPress utilise HMAC pour signer les cookies et les nonces (wp-includes/pluggable.php) :

//Génération d'un cookie dans la fonction wp_generate_auth_cookie() basé sur un $token (valeur aléatoire) conservé en base
//clé
$key = wp_hash( $user->user_login . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme );
//valeur
$hash = hash_hmac( 'sha256', $user->user_login . '|' . $expiration . '|' . $token, $key );

Configurer WordPress en Debug mode #

Dans le fichier wp-config.php, configurer le mode debug pour avoir accès à toutes les informations d’erreur et diagnostics:

define( 'WP_ENVIRONMENT_TYPE', 'development' ); // Permet de définir le mode d'execution dans le code.
//Disposer de toutes les informations de debug
define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true ); // Désactiver le gestionnaire d'erreur global > 5.2
define( 'WP_DEBUG', true );               // Active le mode debug global
define( 'WP_DEBUG_DISPLAY', true );       // Affiche les erreurs à l'écran (activé si WP_DEBUG activé)
define( 'WP_DEBUG_LOG', true );           // Log dans wp-content/debug.log
define( 'SAVEQUERIES', true );            // Log SQL dans $wpdb->queries (debug DB)
define( 'SCRIPT_DEBUG', true );           // Charge assets JS/CSS non minifiés du core 

//Afficher la valeur des constantes
//print_r( get_defined_constants() );

On reviendra sur la configuration en mode production plus tard dans la formation.

Configurer WordPress en Debug mode #

Quelques configurations :

define('WP_DEBUG', true); //erreurs sur la sortie (à l'écran)
define('WP_DEBUG_LOG', true); //erreurs dans le fichier de log wp-content/debug.log
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false); // pour éviter l'affichage sur la sortie (à l'écran)

Configurer WordPress en Debug mode #

WP_ENVIRONMENT_TYPE est une constante introduite depuis WordPress 5.5 pour identifier le contexte d’exécution du site web. Permet aux thèmes et aux plugins d’adapter leur comportement :

if ( wp_get_environment_type() === 'development' ) {
  //Faire quelque chose de spécifique en environnement de dev
}

Doc wp_get_environment_type()

Configurer WordPress en Debug mode #

Pour débuger les requêtes SQL :

// Log toutes les requêtes vers la base dans un tableau PHP
define( 'SAVEQUERIES', true );
// Pour afficher le tableau de la requête
global $wpdb;
print_r( $wpdb->queries );

Configuration des logs dans WordPress #

error_log("Utilisateur X a installé plugin Y");
//Envoi d'un email
error_log('Message critique pour notifier l\'administrateur', 1, "admin@email.com");

En savoir plus sur la fonction native PHP error_log

Configuration des logs dans WordPress #

Par défaut, si WP_DEBUG est définie à true, WordPress crée un fichier wp-content/debug.log et y écrit les logs.

Ce fichier est placé dans wp-content qui est par définition public !

Essayer : http://localhost:8080/wp-content/debug.log

Embrassant !

Il ne doit évidemment pas être accessible aux clients.

Sur Apache, on peut restreindre son accès via un fichier .htaccess placé dans le dossier wp-content :

<Files "debug.log">
    Require all denied
</Files>

Essayer : http://localhost:8080/wp-content/debug.log

Mieux !

Où sont log les erreurs PHP ? #

Les erreurs PHP peuvent être logés à différents endroits en fonction de l’emplacement de l’erreur :

//Dans wp-settings.php
// Check if WP_DEBUG mode is enabled.
wp_debug_mode(); // enregistre un gestionnaire d'erreur qui redirige les logs vers wp-content/debug.loh

wp_debug_mode() est implémentée dans wp-includes/load.php. Définit le fichier de redirection des logs et le niveau des erreurs consignées (ini_set( ‘error_log’, $log_path ); et error_reporting())

Couverture complète des erreurs #

Pour avoir une couverture complète des erreurs, il faut donc :

Configurer le système de logs de PHP #

Il y a trois deux possibilités :

Quelle méthode choisir ? Cela dépend de votre environnement de production et de votre liberté d’action sur le serveur. Mon conseil : Privilégier via php.ini si possible !

Configuration PHP #

Il faut utiliser trois directives PHP :

Voir toutes les directives et options pour le système de logging de PHP

Solution via des instructions PHP #

//wp-config.php
@ini_set('display_errors', 0);              // désactive l'affichage
@ini_set('log_errors', 1);                  // active le logging PHP
@ini_set('error_log', '/var/log/wordpress.log'); // log PHP global

Solution via un fichier php.ini #

; Désactiver l'affichage des erreurs aux utilisateurs
display_errors = Off
; Activer le logging des erreurs PHP
log_errors = On
; Fichier de log PHP global
error_log = /var/log/wordpress.log
; Niveau d'erreur à loger. Important pour pas polluer ses logs
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT

À propos de cette instruction : error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT. Le & est un ET binaire sur les flags. Le ~ est un NOT binaire qui inverse le flag. On prend tous les types d’erreurs (E_ALL), puis on retire ceux qu’on ne veut pas (E_NOTICE, E_DEPRECATED, E_STRICT).

À privilégier !

Avec Apache PHP-FPM, placer le fichier ini dans le répertoire /etc/php/8.x/fpm/pool.d/www.conf. Voir comment configurer PHP-FPM

Ne plus utiliser l’ancien module CGI PHP d’Apache (mod_php). Il est déprécié.

Configuration typique de WordPress en production #

En production, on veut toujours log les erreurs, mais on ne souhaite pas les afficher sur la sortie (et finissent chez le client) :

// Mode production
define('WP_ENVIRONMENT_TYPE', 'production');
// Désactive l'affichage
define('WP_DEBUG', true);          // Activé pour que les erreurs soient loguées
define('WP_DEBUG_LOG', true);      // Consigne les erreurs dans wp-content/debug.log
define('WP_DEBUG_DISPLAY', false); // RIEN AFFICHER SUR LA SORTIE (ECRAN)
define('SAVEQUERIES', false);      // Surtout pas !
define('SCRIPT_DEBUG', false);     // Désactive le chargement de assets du core non minifiées

Un exemple complet de fichier de configuration sera fourni dans la section consacrée à la mise en production.

Configurer WordPress : éléments de configuration personnalisés #

Dans le fichier wp-config.php, un emplacement vous est indiqué pour ajouter vos propres configurations.

/* Add any custom values between this line and the "stop editing" line. */

// => AJOUTER VOS CONFIGS ICI (ou inclure un fichier de config custom) <=
if ( ! defined( 'MACONFIG' ) ){
  define( 'MACONFIG', 'MACONFIG_VALUE' );
}

/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
 define( 'ABSPATH', __DIR__ . '/' );
}
...

Configurer WordPress : mises à jour automatiques #

Depuis WordPress 3.7, on peut activer une politique de mise à jour du cœur en arrière-plan. Il y a quatre types de mises à jour automatiques que l’ont peut configurer :

Configurer WordPress : mises à jour automatiques du coeur #

Trois types de mises à jour du cœur :

Configurer WordPress : mises à jour automatiques du coeur #

//désactiver complètement TOUS les types de mises à jour automatiques (core, theme, plugins, traductions)
define( 'AUTOMATIC_UPDATER_DISABLED', true );
//mises à jour du core
//aucune mises à jour auto
define( 'WP_AUTO_UPDATE_CORE', false );
//toutes les mises à jour activées ;
define( 'WP_AUTO_UPDATE_CORE', true );
//Recommandé : mises à jour auto pour versions mineures seulement (sécurité, bug fix)
//Valeur par défaut depuis WordPress 5.6
define( 'WP_AUTO_UPDATE_CORE', 'minor' );

Tour du Core (suite) #

wp-admin/           : "gestion de l'administration du site "[x]
wp-content/         : "notre application embarquée par wordpress" [x]
................................................................................. => wp-includes/
index.php           : "point d'entrée de l'application WordPress" [x]
license.txt
readme.html
wp-activate.php
wp-blog-header.php
wp-comments-post.php
wp-config-docker.php
wp-config.php [x]
wp-config-sample.php [x]
wp-cron.php         : "configure un gestionnaire de tâches automatisées (cron job) (déclenché à chaque visite)" [x]
wp-links-opml.php
wp-load.php
wp-login.php        : "gestion du login" [x]
wp-mail.php
wp-settings.php     : "définit variables globales, gère includes (core)" [x]
wp-signup.php       : "gestion de la création de compte" [x]
wp-trackback.php
xmlrpc.php

Commencer à se sentir chez soi…

Tour du Core (suite) #

(Quelques) fichiers du core, qui implémentent toutes les API de WordPress, dans /wp-includes :

Nous allons apprendre à nous servir de nombreuses API (fonctions, classes, variables globales) pour développer notre site sur mesure (theme, plugins).

Les API de WordPress #

Pour interagir avec le core, WordPress expose de nombreuses API. Voici les principales :

Les API mises en avant sont celles que nous allons aborder au cours de cette formation !

La base de données WordPress #

Il est utile d’avoir une vision d’ensemble du schéma de la base de données de WordPress pour :

Schéma de la base de données WordPress #

Points techniques :

Des versions majeures de WordPress peuvent changer (très) légèrement la structure des tables (label, champ). Mais la rétrocompatibilité chez WordPress est un objectif principal (pas de craintes).

Schéma de la base de données WordPress : Trois régions #

bg right contain

Trois grandes régions :

La table wp_links (gestion de liens vers d’autres sites) a été déprécié en WordPress 3.5 (présente pour rétrocompatibilité, toujours utilisable si besoin !) On l’ignorera ici.

Voir une documentation du schéma publiée sur le Codex

Schéma de la base de données WordPress : Détail (1/2) #

bg right contain

Posts

Taxonomies (catégories et tags)

Schéma de la base de données WordPress Détail (2/2) #

bg right contain

Utilisateurs

Options

De la base de données aux “primitives” WordPress #

Données primitives de WordPress : pages, posts, taxonomies, utilisateurs, rôles

Posts (et pages) #

Presque tout est un post en WordPress !

Taxonomies #

Taxonomie hiérarchique #

bg right contain

Terminologie :

Exemple de taxonomie hiérarchique #

bg right contain

Un exemple :

Taxonomie non hiérarchique #

bg right contain

Terminologie :

Exemple de taxonomie non hiérarchique #

bg right contain

Exemple :

Le cas des taxonomies par défaut “Categories” et “Tags” #

Design des taxonomies #

bg right contain

Un vaste sujet (passionnant) !

Pose des questions sur la navigabilité et les possibilités de recherche offertes par le système, et donc sa structure et son design.

Feuilletage recommandé : Information Architecture for the World Wide Web 3rd Edition, de Peter Morville et Louis Rosenfeld, publié chez O’Reilly Media, 2006. Consulter notamment le chapitres 1 et 2.

Gestion des taxonomies en détail #

bg right contain

Les tables pour la gestion des taxonomies et leurs associations (formalisme MERISE).

Exemple :

En base :

Users et métadonnées : roles, capabilities #

Le cœur du système de permissions WordPress #

Les rôles et capacités sont stockés sous forme d’un tableau PHP sérialisé en base.

Extrait de la valeur par défaut (à l’installation) de wp_options.wp_user_roles :

a:5:
  {
    s:13:"administrator";
    a:2:{
      s:4:"name";s:13:"Administrator";s:12:"capabilities";
      a:61:{
        s:13:"switch_themes";b:1;
        s:11:"edit_themes";b:1;
        s:16:"activate_plugins";b:1;
        s:12:"edit_plugins";b:1;
  ...

Pourquoi se familiariser avec la base de données de WordPress #

Se familiariser avec la base permet :

Pratique : interroger la base #

Pour cela, utilisez au choix :

docker compose exec -it db mysql -uroot -proot

Exercice requêtes SQL #

  1. Retrouver dans la base l’identifiant, le titre et le status du post Hello world! crée par défaut.
  2. Dans le dashboard, modifier le contenu du post et refaire la requête. Que remarque-t-on ? Afficher également le parent du post;
  3. Dans le dashboard :
    1. Créer une nouvelle catégorie formation,
    2. Créer deux nouveaux posts et les placer dans cette catégorie,
  4. Écrire une requête SQL pour :
    1. Retrouver le slug de la catégorie Formation dans la base de données;
    2. Retrouver uniquement les posts appartenant à la catégorie formation. Afficher le titre du poste, le nom de la taxonomie et le nom du terme;
    3. Modifier le mot de passe de votre compte administrateur du site directement dans la base (peut s’avérer utile !)

Solution #

-- Question 1
SELECT ID, post_title, post_status, post_parent FROM wp_posts WHERE post_title = "Hello World!";
-- Question 4.1
SELECT slug FROM wp_terms WHERE name="Formation";
-- Question 4.2
SELECT p.post_title, tt.taxonomy, t.name 
FROM wp_term_relationships tr 
JOIN wp_posts p ON tr.object_id = p.ID 
JOIN wp_term_taxonomy tt ON tt.term_taxonomy_id = tr.term_taxonomy_id 
JOIN wp_terms t ON t.term_id = tt.term_id 
WHERE t.name = "Formation";
-- Question 4.3
UPDATE wp_users
SET user_pass = MD5('nouveau_mot_de_passe')
WHERE user_id = 1;

Attention, ici on hash le mot de passe avec l’algorithme MD5 (déprécié !). À la première connexion, WordPress va re hasher le mot de passe en utilisant bcrypt et son salt. Se reconnecter immédiatement !

En cas de besoin (plus d’accès à /login), utiliser plutôt WP-CLI :

docker compose run --rm wpcli user update 1 --user_pass="new_pass"

Remarque (importante) sur les révisions #

Observations :

Essayer de créer plusieurs révisions en modifiant le contenu du post “Hello World” et en enregistrant.

Conséquences et problèmes :

Intervenir sur les révisions #

Pour inspecter le nombre de révisions en base :

SELECT COUNT(ID) as "Nombre de revisions :" FROM wp_posts WHERE post_type = 'revision';

Solution :

Limiter le nombre de révisions via la constante WP_POST_REVISIONS (2-3 suffisent généralement), à placer dans le fichier wp-config.php :

//Dans le fichier wp-config.php :
//Limité à 3 révisions
define( 'WP_POST_REVISIONS', 3 );
//Désactiver les révisions, si pas besoin d'historique
define( 'WP_POST_REVISIONS', false );

Supprimer toutes les révisions de chaque post sauf la dernière :

DELETE FROM wp_posts
WHERE post_type = 'revision'
  AND ID NOT IN (
    -- Sélectionne la dernière révision de chaque post
    SELECT id FROM (
      SELECT MAX(ID) AS id
      FROM wp_posts
      WHERE post_type = 'revision'
      GROUP BY post_parent
    ) AS latest
  );

Tour du Core (suite et fin) wp-content : user space #

Dans le répertoire wp-content :

Finaliser la préparation de l’environnement de développement #

La configuration de WordPress se partage entre les sources et les données en base.

Dashboard : Guide Tour et quelques configurations #

Se connecter en tant qu’administrateur·ice.

Guide Tour :

Personnaliser le dashboard #

bg right contain

Activer les permaliens #

bg right contain

Par défaut les URLs de WordPress sont de la forme /?key=value. Par exemple : /?p=1, /?cat=2, etc. Elles sont basées sur des paramètres d’url (query part).

Activer les permaliens (réécriture d’URL)

Avantages :

Définir la timezone, le format de la date et de l’heure #

Dans la section Settings/General :

À adapter en fonction de la langue du site et de ses règles d’usage.

Installer des plugins de développement utiles #

Installer les plugins suivants :

À utiliser uniquement en environnement de développement !

Créer un thème minimal (déjà fourni) #

Fichiers requis :

On développera ce thème (et ses plugins) tout au long de la formation. On a ajouté screenshot.png (optionnel) pour que le thème ait un thumbnail.

Contenu du fichier style.css #

/*
Theme Name: Mon Thème
Author: Prénom Nom
Description: Une description du thème
Version: 0.1.0
License: Infos sur la licence
Text Domain:
Tags: 
*/

Contenu du fichier index.php (test) #

<?php

/**
 * Point d'entrée du thème
 */

//Modifier l'expéditeur de l'email par défaut via un filtre
add_filter('wp_mail_from', function ($email) {
    return 'test@mailhog.local';
});

//Envoi d'un email de test
if (wp_mail("test@example.com", "MailHog test", "Hello from WordPress")) {
  echo "email sent";
} else {
  echo "Error: email not sent.";
}

//Ecrire un log
error_log('some log');

//Afficher les informations sur la configuration de php utilisée par WordPress
phpinfo();

Activer le thème #

  1. Activer le thème Mon Thème. Ce thème servira de fil rouge pour une partie de la formation. C’est un thème classique (non basé sur des blocs, vu plus tard);
  2. Visiter le site (/) et vérifier que l’email est bien présent dans le mailcatcher;
  3. Vérifier que le fichier wp-content/debug.log existe et contient le log.

Pipeline assets CSS/JS #

Le service gulp défini dans le fichier compose.yaml (basé sur gulpjs) :

  1. Compile les sources SCSS (Sass) en CSS;
  2. Minifie CSS et JS;
  3. Copie les versions minifiées dans les sources du thème.

Lancer le service :

#ne pas le détacher pour debug (voir des erreurs)
docker compose exec gulp gulp

On s’en servira plus tard !

À adapter/étendre à vos usages (intégrer vos frameworks CSS, comme Bootstrap, ou JavaScript favoris). On n’utilisera pas de framework CSS/JS dans cette formation pour ne pas introduire de complexité inutile.

Administration WordPress via WP-CLI #

WP-CLI est un outil puissant (programmable !). Il permet de :

#check la configuration de wp-cli
docker compose run --rm wpcli wp config list
docker compose run --rm wpcli cli info
docker compose run --rm wpcli db tables

WP-CLI utilise les informations de connexion présents dans wp-config.php pour se connecter à la base de données.

Debug dans l’écosystème docker #

#Lister les conteneurs actifs
docker compose ps
#Afficher en temps réel les logs du conteneur WordPress (log d'Apache ici)
docker compose logs -f wordpress

Fonctionnement de WordPress #

Cycle de vie de l’application WordPress : de la requête à la réponse HTTP.

Cycle de vie de l’application WordPress : du serveur web au chargement de WordPress #

  1. Requête HTTP est traitée par le serveur web (Apache, Nginx, etc.)
  2. Initialisation de WordPress : wp-settings.php est chargé :
    1. Initialisation du Core,
    2. Chargement des plugins, MU-plugins et thèmes,
    3. Définition des constantes, classes et fonctions globales;

*Que la réécriture des permaliens soit activée ou non (voir slide suivante)

Cycle de vie de l’application WordPress : production de la réponse HTTP #

  1. Contrôleur : WP::main() orchestre la logique centrale :
    1. parse_request() : transforme l’URL en query vars pour préparer les requêtes SQL à effectuer (post_type, p, name, etc.). L’intention du client est dans l’URL, WordPress en déduit un ensemble de données à récupérer,
    2. send_headers() : prépare et écrit les headers de la réponse HTTP (Content-Type, Status, Cache HTP, etc.). Il ne manque plus que le body (HTML) de la réponse à produire,
    3. WP_Query->query() : Exécute la/les requêtes SQL, et construit le contexte $wp_query : objets $post, collections, flags (is_single(), is_page(), etc.) etc.
    4. Hooks (actions/filters) : injection de logique métier par plugins ou thème (pre_get_posts, etc.).
    5. Sélection de la vue : choix du template basé sur la Template Hierarchy,
    6. Rendu du template. Le template est exécuté avec accès au contexte => Loop WordPress. Produit le document HTML,
    7. Réponse HTTP : HTML final est renvoyé au client (les headers et le statut HTTP ont été préparés par le contrôleur à l’étape 2).

Remarque sur la réécriture des permaliens #

Par défaut, on l’a vu, les URL de WordPress concernent toujours la ressource racine (/) et en produit des variations avec des query parameters (ex /?p=1). Le fichier index.php est donc toujours le point d’entrée.

Réécrire les permaliens génère (avec Apache) le fichier .htaccess suivant :

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
# Si le fichier ou dossier existe physiquement, il est servi directement.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Sinon, redirige toute requête vers index.php, le point d’entrée WordPress.
RewriteRule . /index.php [L]
</IfModule>

Cette configuration dit :

La réécriture des permaliens ne modifie donc pas le fonctionnement du cycle de vie de l’application.

Template hierarchy (un aperçu) #

bg right contain

La template Hierarchy est un mécanisme central du fonctionnement des thèmes à comprendre.

Elle détermine le choix de la vue et donc du script PHP de votre thème qui va être utilisé en fonction du contexte, et donc de l’URL.

On y reviendra plus en détail par la suite.

La (fameuse) “Loop WordPress” #

bg right:30% contain w: 80%
//Dans un template (page, post, archive, etc.)
//have_posts() interroge le contexte
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <div class="entry">
        <?php the_content(); ?>
    </div>
 <?php endwhile;?>

Source de l’image, p 83.

Fonctionnement de la Loop #

//Dans un template (page, post, archive, etc.)
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <div class="entry">
        <?php the_content(); ?>
    </div>
 <?php endwhile;?>

On verra dans la suite de la formation comment créer nos propres loops customs.

Pattern Model-View-Controller #

WordPress, un framework Model-View-Controller ? #

Idéalement, on devrait pouvoir changer de thème tout en maintenant le bon fonctionnement du site !

Au final, “concrètement”, qu’est ce qu’un site web WordPress ? #

Un programme écrit en PHP basé sur une base de données relationnelle (MySQL).

Pour migrer ou installer un site WordPress il faut donc :

On reviendra sur les workflows de déploiement plus tard dans la formation

Apprendre WordPress, utiliser les différentes documentations #

Pour monter en compétences sur WordPress on peut utiliser les différents niveaux de documentation suivants :

Apprendre WordPress : code source avec commentaires standardisés #

Par exemple, dans le fichier wp-includes/functions.php :

/**
 * Converts given MySQL date string into a different format.
 *
 *  - `$format` should be a PHP date format string.
 *  - 'U' and 'G' formats will return an integer sum of timestamp with timezone offset.
 *  - `$date` is expected to be local time in MySQL format (`Y-m-d H:i:s`).
 *
 * Historically UTC time could be passed to the function to produce Unix timestamp.
 *
 * If `$translate` is true then the given date and format string will
 * be passed to `wp_date()` for translation.
 *
 * @since 0.71
 *
 * @param string $format    Format of the date to return.
 * @param string $date      Date string to convert.
 * @param bool   $translate Whether the return date should be translated. Default true.
 * @return string|int|false Integer if `$format` is 'U' or 'G', string otherwise.
 *                          False on failure.
 */
function mysql2date( $format, $date, $translate = true ) {
 if ( empty( $date ) ) {
  return false;
 }

  ...

Disposer de la doc de référence directement dans l’IDE #

Recommandé !

Par exemple, dans VS Code, utiliser l’extension Hooks IntelliSense for WordPress, en plus de l’extension PHP Intelephense

Bonnes pratiques (première volée) 1/3 #

Bonnes pratiques (première volée) 2/3 #

Bonnes pratiques (première volée) 3/3 #

Le schéma de base de WordPress (posts, metas, terms, users) est stabilisé, éprouvé sur des millions d’installations, et intégré au système de cache du coeur (objet cache, page cache, query caching). Ses tables ont des index connus, et l’API WP_Query sait les exploiter efficacement. Beaucoup de plugins se basent dessus, ce qui garantit compatibilité et prévisibilité du comportement. Créer ses tables = une dette à assumer !

En conclusion #

Dans cette première séquence nous avons :

Développer en WordPress avec PHP #

Vers le module 2

Liens utiles #