Parmi les nombreux répertoires que l’on retrouve dans une installation WordPress, le dossier wp-includes est l’un des plus critiques pour le bon fonctionnement du cœur du CMS. Invisible pour l’utilisateur final, ce dossier regroupe l’ossature technique du système WordPress : fonctions globales, API internes, classes système, gestion du contenu et compatibilité PHP. Autrement dit, il constitue le socle sur lequel repose toute l’architecture du CMS. Dans cet article, voyons ensemble en détail ce que contient wp-includes
, son rôle précis, et les précautions à respecter lors de sa manipulation.
- Wp-includes : Un répertoire cœur du noyau WordPress
- Comment fonctionne wp-includes et que contient-il réellement ?
- Comment sécuriser le dossier wp-includes de WordPress ?
Wp-includes : Un répertoire cœur du noyau WordPress
Le dossier wp-includes
est l’un des trois répertoires racines d’une installation WordPress (voir également notre sujet sur les fichiers racines de WP), aux côtés de wp-admin
(interface d’administration) et wp-content
(contenus personnalisés). Introduit dès les premières versions publiques de WordPress, ce répertoire est entièrement dédié au fonctionnement interne du CMS. Il constitue en quelque sorte le « moteur » invisible qui exécute toutes les fonctions centrales de WordPress : affichage du contenu, gestion des utilisateurs, traitement des requêtes HTTP, rendu HTML, etc. À la différence de wp-content
qui est destiné à accueillir vos développements personnalisés (thèmes, plugins, uploads), le dossier wp-includes
est considéré comme une zone réservée au noyau, c’est-à-dire aux fichiers que WordPress charge automatiquement pour faire tourner la plateforme. C’est également dans ce répertoire que résident les définitions de classes majeures comme WP_Query
, WP_Error
, WP_Theme
, ou encore les composants de la REST API, les shortcodes natifs et les bibliothèques embarquées comme PHPMailer ou Requests. Historiquement, le contenu de wp-includes
s’est enrichi à chaque version majeure de WordPress. À ses débuts (WordPress 0.7 en 2003), il ne contenait qu’un ensemble limité de fichiers pour le rendu des pages. Mais dès la version 2.0 (2005), avec l’introduction de l’objet WP_Query
et la séparation plus nette entre logique métier et affichage, ce répertoire a évolué pour accueillir des APIs internes de plus en plus sophistiquées. Aujourd’hui, il contient plus de 200 fichiers PHP, des bibliothèques tierces, des classes natives, ainsi que des fichiers JS et CSS embarqués dans l’interface publique ou back-office.
Voici une vue d’ensemble de quelques fichiers importants présents dans wp-includes
:
Fichier | Fonction principale |
---|---|
functions.php |
Contient les fonctions globales utilisées par le CMS (ex. : is_user_logged_in() , wp_redirect() ). |
pluggable.php |
Définit des fonctions remplaçables (login, mail, etc.) si elles ne sont pas déjà déclarées ailleurs. |
general-template.php |
Fournit les fonctions pour afficher le titre du site, les menus, les liens, les catégories… |
class-wp-query.php |
Définit la classe WP_Query qui exécute les requêtes SQL pour charger les contenus (articles, pages, CPT…). |
taxonomy.php |
Gère les taxonomies comme les catégories, étiquettes, ou tout type de classification personnalisée. |
media.php |
Contient les fonctions liées au traitement des fichiers médias : images, vidéos, fichiers PDF, etc. |
script-loader.php |
Permet l’enregistrement et le chargement conditionnel des scripts JS et CSS du cœur et des extensions. |
load.php |
Initialise les constantes globales et gère le chargement progressif des fonctions selon le contexte. |
À cela s’ajoutent de nombreuses autres ressources : classes AJAX, API REST (via rest-api
), gestion des transients, gestion des sessions, localisation via les fichiers de traduction (internationalisation), ou encore les formats RSS/Atom (fichiers feed-*.php
).
Toute modification manuelle de fichiers dans
wp-includes
est déconseillée, car ces fichiers sont remplacés automatiquement lors d’une mise à jour de WordPress. Pour toute personnalisation, utilisez des fonctionshookées
dans un thème enfant ou via un plugin.
Comment fonctionne wp-includes et que contient-il réellement ?
Lorsqu’un site WordPress est exécuté, une séquence précise de fichiers est appelée pour initialiser l’environnement PHP. Parmi ces fichiers, le dossier wp-includes
joue un rôle fondamental. C’est dans le fichier wp-settings.php
, situé à la racine de WordPress, que débute l’inclusion de la majorité des composants de ce répertoire. Ce chargement est effectué à l’aide de la fonction require_once
afin d’éviter les redéfinitions de fonctions et de garantir que chaque fichier ne soit intégré qu’une seule fois.
Le chargement du contenu de wp-includes s’effectue par étapes successives
Lorsqu’un visiteur accède à une page d’un site WordPress, c’est le fichier index.php
à la racine du projet qui est sollicité. Celui-ci appelle wp-blog-header.php
, lequel charge à son tour wp-load.php
. C’est dans ce fichier que le cœur de WordPress est véritablement initialisé via require_once( ABSPATH . 'wp-settings.php' )
. Et c’est ici que wp-includes
entre en action, car la majorité des fichiers qu’il contient sont appelés via ce script central. Voici un décryptage détaillé des étapes clés du processus :
1. Définition des constantes
Le premier fichier inclus est wp-includes/version.php
. Il définit :
WPINC
: la constante qui représente le nom du dossierwp-includes
, utilisée pour simplifier les inclusions ultérieures.$wp_version
: la version exacte de WordPress utilisée par l’installation.$wp_db_version
,$tinymce_version
,$required_php_version
: des constantes système qui permettent à WordPress de vérifier la compatibilité lors des mises à jour, ou d’exposer les bonnes ressources JS/CSS.
Ce fichier sert également de point de référence pour les outils de diagnostic et les scripts d’upgrade (comme update-core.php
).
2. Compatibilité avec différentes versions de PHP
Le fichier wp-includes/compat.php
est ensuite chargé pour assurer le bon fonctionnement du CMS, même sur des environnements PHP anciens. Il contient des polyfills — des fonctions de substitution — pour les fonctions natives manquantes. Parmi celles-ci :
hash_equals()
: pour comparer des chaînes de manière sécurisée (anti-timing attack).array_column()
: fonction PHP 5.5 utilisée pour extraire une colonne spécifique d’un tableau multidimensionnel.json_encode()
/json_decode()
: si non présentes, elles sont simulées.
Ce mécanisme de compatibilité permet à WordPress de fonctionner sur une large gamme d’environnements, notamment les hébergements mutualisés encore basés sur des versions anciennes de PHP.
3. Chargement des fonctions globales
WordPress charge ensuite des fichiers contenant les fonctions globales essentielles à tous les niveaux du CMS. Parmi les plus importants :
functions.php
: c’est ici que l’on retrouve des fonctions commewp_die()
,is_ssl()
, ouwp_safe_redirect()
.formatting.php
: traite la mise en forme du texte viawpautop()
,sanitize_title()
, ouremove_accents()
.link-template.php
: gère les URLs générées par WordPress comme les permaliens, liens vers les auteurs, catégories, taxonomies personnalisées, etc.query.php
: prépare les requêtes SQL selon le contexte de la page (page d’accueil, recherche, archive, single post…)
Ces fichiers définissent des fonctions purement procédurales, qui sont ensuite appelées par les templates de thème, les plugins ou même par le cœur de WordPress dans des contextes divers.
4. Initialisation des classes centrales
À ce stade, WordPress initialise ses principales classes objets, qui structurent son fonctionnement interne :
class-wp-query.php
: crée l’objet$wp_query
, utilisé dans la boucle WordPress pour exécuter et manipuler les requêtes aux bases de données ;user.php
: fournit les classes et fonctions associées àWP_User
, pour la gestion des sessions, permissions et rôles utilisateurs ;post.php
: contient les définitions deWP_Post
et toutes les fonctions associées à la gestion des contenus (post status, post meta, slug, etc.).theme.php
etclass-wp-theme.php
: chargent les informations relatives aux thèmes installés ou actifs.
Ces objets sont indispensables au fonctionnement du CMS et interagissent avec la base de données via la classe wpdb
(chargée via wpdb.php
), qui sert d’interface sécurisée et générique aux requêtes SQL.
5. Initialisation du système de hooks
Enfin, WordPress prépare son système d’extensions internes à l’aide de deux fichiers clés :
plugin.php
: introduit les fonctionsadd_action()
,add_filter()
,do_action()
etapply_filters()
. Ces fonctions permettent aux plugins et thèmes d’injecter ou de modifier des comportements sans altérer le noyau.class-wp-hook.php
: gère la structure objet des hooks avec priorités, arguments dynamiques, et ordonnancement d’exécution.
Ce système d’événements constitue l’épine dorsale de la modularité WordPress. Il est utilisé aussi bien par le cœur du CMS que par les extensions et les thèmes, garantissant une architecture découplée et extensible.
Ces étapes permettent à WordPress d’être à la fois robuste, modulaire et extensible. En comprenant ce séquencement, les développeurs peuvent mieux diagnostiquer les erreurs de chargement, comprendre la hiérarchie des fichiers et optimiser la compatibilité de leurs thèmes ou plugins avec le cœur de WordPress.
Les principales familles de fichiers de wp-includes
Pour mieux comprendre la structure du répertoire wp-includes
, voici un tableau détaillé regroupant ses grandes familles de fichiers et leur rôle fonctionnel au sein du noyau WordPress :
Famille de fichiers | Rôle et fichiers clés |
---|---|
Fichiers de compatibilité | compat.php , version.php assurent le bon fonctionnement du CMS sur des environnements PHP variés.Ils contiennent des polyfills (fonctions de secours) et définissent des constantes critiques comme WPINC ou $wp_version . |
Fonctions globales | functions.php regroupe des fonctions d’utilité générale (wp_die() , is_ssl() ).formatting.php applique les règles de mise en forme du contenu : wpautop() , sanitize_title() , etc. |
Classes système | class-wp-query.php gère les requêtes de contenu dans la boucle WordPress.class-wp-widget.php définit la base technique des widgets personnalisables utilisés dans les sidebars. |
Filtres et hooks | plugin.php et class-wp-hook.php structurent le système d’événements du CMS.Ils permettent d’utiliser add_action() , add_filter() , do_action() , pour personnaliser ou étendre les comportements sans modifier le noyau. |
APIs internes | rewrite.php construit et gère les structures de permaliens.taxonomy.php manipule les catégories, étiquettes, et taxonomies personnalisées.media.php orchestre l’import, la génération et l’accès aux fichiers médias (images, vidéos, documents). |
Modularité et chargement conditionnel
WordPress n’inclut pas tous les fichiers de wp-includes
de manière statique. Il utilise une stratégie de chargement conditionnel pour optimiser les performances. Par exemple :
- Les fichiers de la REST API, comme
rest-api.php
ouclass-wp-rest-server.php
, ne sont chargés que lorsque l’URL cible le point d’entrée/wp-json/
. feed-rss2.php
et consorts ne sont sollicités que lors de la consultation d’un flux RSS ou Atom.- Les fichiers liés à l’éditeur (comme
class-wp-editor.php
oueditor.js
) sont activés uniquement dans le contexte du back-office.
La boucle WordPress et les fonctions de rendu
L’un des éléments les plus emblématiques de WordPress, la boucle ou the loop, repose presque entièrement sur des composants issus de wp-includes
. La classe WP_Query
(définie dans class-wp-query.php
) exécute les requêtes SQL. Ensuite, les fonctions have_posts()
, the_post()
, the_title()
ou the_content()
sont définies dans des fichiers comme query.php
et general-template.php
. C’est également ici que se gèrent les shortcodes (shortcodes.php
), les transients (système de cache temporaire via option.php
) et les composants de l’HTTP API, qui permettent à WordPress de communiquer avec des services tiers via wp_remote_get()
ou wp_remote_post()
.
Un moteur PHP modulaire mais centralisé
Le design de wp-includes
repose sur un principe de centralisation du cœur métier : tous les fichiers critiques sont regroupés dans ce répertoire pour simplifier la maintenance et les mises à jour du noyau. Depuis WordPress 5.x, on observe une meilleure séparation des responsabilités grâce à l’introduction de classes spécifiques (ex. : class-wp-block-parser.php
pour les blocs Gutenberg) et l’ajout de répertoires dédiés comme blocks/
, customize/
, ou theme.json
pour les réglages globaux de thème. Chaque nouvelle version de WordPress apporte son lot de fichiers dans wp-includes
, renforçant progressivement l’architecture modulaire tout en garantissant une rétrocompatibilité avec les anciennes fonctions. C’est ce qui explique pourquoi WordPress peut rester à jour tout en continuant à exécuter des sites créés il y a plus de 10 ans.
Comment sécuriser le dossier wp-includes de WordPress ?
Le dossier wp-includes
contient les fichiers centraux du noyau WordPress. En raison de sa nature sensible et non modifiable, il est souvent ciblé par des attaques cherchant à exploiter des vulnérabilités connues, injecter du code malveillant ou obtenir un accès non autorisé aux fonctions internes du CMS. Il est donc essentiel de sécuriser ce répertoire pour garantir la stabilité, la confidentialité et la résilience de votre site WordPress.
Limiter l’accès direct aux fichiers PHP de wp-includes
Par défaut, certains fichiers du répertoire wp-includes
ne doivent jamais être appelés directement par un utilisateur via le navigateur. Pour renforcer la sécurité, vous pouvez bloquer les accès directs aux fichiers PHP de ce dossier en ajoutant une règle dans le fichier .htaccess
à la racine de votre site (valable si vous utilisez Apache) :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-includes/.*\.php$ - [F,L]
</IfModule>
Cette règle empêche l’exécution de tout fichier PHP situé dans wp-includes
lorsqu’il est directement ciblé dans l’URL. Les fichiers seront cependant toujours accessibles en interne par WordPress.
Pour éviter que des utilisateurs ne puissent voir la liste des fichiers du répertoire wp-includes
(si l’indexation de dossier est activée sur votre serveur), il est fortement recommandé de désactiver l’indexation via la directive suivante dans le htaccess de WP :
Options -Indexes
Cette instruction empêche les navigateurs d’afficher l’arborescence des fichiers dans un dossier web s’il n’existe pas de fichier index.php
ou index.html
.
Bloquer l’accès aux fichiers sensibles via le serveur
Certains fichiers comme class-wp-hook.php
ou rewrite.php
contiennent des fonctions critiques utilisées par WordPress. Pour renforcer la sécurité côté serveur, vous pouvez appliquer des règles spécifiques dans votre configuration Apache ou NGINX pour interdire l’accès à tous les fichiers de wp-includes
en dehors des scripts autorisés par WordPress.
Voici un exemple Apache (à insérer dans un .htaccess
) :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-includes/.*$ [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^wp-includes/.*$ - [F,L]
</IfModule>
Utiliser un plugin de sécurité pour surveiller le dossier
Des plugins comme Wordfence, iThemes Security ou Sucuri permettent d’ajouter une couche de protection applicative en surveillant les modifications non autorisées dans wp-includes
. Ces outils peuvent :
- Vérifier l’intégrité des fichiers système via checksums officiels.
- Bloquer l’exécution de code malicieux ou l’inclusion de fichiers suspects.
- Restaurer automatiquement un fichier corrompu avec la version d’origine de WordPress.
Mettre à jour régulièrement WordPress
Enfin, la meilleure des protections reste de maintenir votre installation à jour. Chaque version de WordPress corrige des failles potentielles, notamment dans les fichiers de wp-includes
. Utilisez la fonctionnalité de mises à jour automatiques ou planifiez des mises à jour manuelles avec une stratégie de sauvegarde régulière. La sécurité du répertoire wp-includes
repose donc sur un principe simple : ne jamais y toucher manuellement, bloquer son exécution publique et surveiller ses changements. Ces bonnes pratiques renforcent la solidité de votre installation WordPress face aux menaces les plus courantes.
0 commentaires