Installation des dépendances
Une fois la structure minimale de votre thème WordPress en place, installez les dépendances Vite, Tailwind CSS et le plugin officiel @tailwindcss/vite avec la commande ci-dessous :
npm install -D vite tailwindcss @tailwindcss/vite
Configuration
Configuration de Vite
Créez un fichier vite.config.js
à la racine de votre thème avec le contenu suivant :
// vite.config.js
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
build: {
assetsDir: '.',
emptyOutDir: true,
manifest: true,
outDir: 'dist',
sourcemap: true,
rollupOptions: {
input: [
'src/js/main.js',
]
},
},
plugins: [
{
name: "php-full-reload",
handleHotUpdate({ file, server }) {
if (file.endsWith(".php")) {
server.ws.send({ type: "full-reload", path: "*" });
}
},
},
tailwindcss(),
],
})
Cette configuration est personnalisable selon les besoins de votre projet, mais cette base suffit pour notre exemple.
Création du fichier JavaScript principal
Créez un fichier src/js/main.js
avec le contenu suivant :
// src/js/main.js
import './../css/main.css';
console.log('Custom theme is running with Vite ⚡️');
Ce fichier sert de point d'entrée à Vite.
Création du fichier CSS principal
Créez ensuite un fichier src/css/main.css
, puis importez Tailwind CSS :
/* src/css/main.css */
@import "tailwindcss";
Vite est désormais configuré. Votre arborescence devrait ressembler à ceci :
mon-theme/
├─ src/
│ ├─ js/
│ │ └─ main.js
│ └─ css/
│ └─ main.css
├─ functions.php
├─ index.php
├─ package-lock.json
├─ package.json
├─ style.css
├─ vite.config.js
À présent, notre thème doit charger nos assets pour bénéficier du futur style CSS et du JS.
Chargement des assets
Dans votre fichier functions.php
, ajoutez ce code :
// functions.php
function registerCustomAssets() {
$vite_server = 'http://localhost:5173';
$response = wp_remote_get($vite_server);
$is_dev = !is_wp_error($response);
if ($is_dev) {
wp_enqueue_script_module('vite-client', $vite_server . '/@vite/client', [], null);
wp_enqueue_script_module('my-theme', $vite_server . '/src/js/main.js', [], null);
} else {
$manifest_path = get_theme_file_path('dist/.vite/manifest.json');
if (!file_exists($manifest_path)) {
return;
}
$manifest = json_decode(file_get_contents($manifest_path), true);
if (isset($manifest['src/js/main.js'])) {
$js_file = $manifest['src/js/main.js']['file'];
wp_enqueue_script('my-theme', get_template_directory_uri() . '/dist/' . $js_file, [], null,
[
'strategy' => 'defer',
'in_footer' => true,
]
);
$css_file = $manifest['src/js/main.js']['css'][0];
if (isset($css_file)) {
wp_enqueue_style('my-theme', get_template_directory_uri() . '/dist/' . $css_file, [], null);
}
}
}
}
add_action('wp_enqueue_scripts', 'registerCustomAssets');
Cette fonction se découpe avec un test pour charger les assets selon l'environnement dans lequel on se trouve :
- en développement : elle charge les fichiers depuis le serveur Vite
- en production : elle lit le fichier
manifest.json
afin de récupérer les chemins des fichiers optimisés générés par Vite
Le tout repose sur les fonctions natives de WordPress :
wp_enqueue_script
etwp_enqueue_style
permettent d’injecter proprement vos fichiers JS et CSS dans votre thèmewp_enqueue_scripts
est le hook standard pour ajouter les scripts et les styles côté front
Fonctionnement du workflow
Lors de l'installation de Vite, deux scripts sont ajoutés automatiquement à votre package.json
:
"scripts": {
"dev": "vite",
"build": "vite build"
}
npm run dev
lance le serveur de développementnpm run build
génère les fichiers optimisés pour la production
Lancement du serveur de développement
Utilisez la commande ci-dessous pour lancer votre serveur de développement :
npm run dev
À chaque modification de vos fichiers sources, le navigateur se met à jour automatiquement grâce au rechargement instantané, ou HMR (Hot Module Reloading). Plus besoin de marteler le bouton refresh : vos changements apparaissent sous vos yeux, comme par magie. Un gain de temps précieux, qui vous permet de rester concentré sur l’essentiel.
Générer les fichiers pour la production
Une fois le développement terminé, vous pouvez générer une version optimisée de vos fichiers :
npm run build
Cette commande génère les fichiers minifiés et optimisés dans le dossier dist/
, prêts à être utilisés en production.
Dans cet exemple, Vite est configuré pour générer un fichier manifest.json
dans le répertoire dist/.vite/
. Ce fichier contient la correspondance entre les noms des fichiers sources et leurs versions optimisées avec hash.
Notre thème WordPress lit ce fichier, ce qui permet de charger automatiquement les bons chemins, garantissant que les internautes obtiennent la version la plus récente, sans problème de cache navigateur.
Voici un exemple de contenu du fichier manifest.json
après un build :
{
"src/js/main.js": {
"file": "main-_-Me5yPC.js",
"name": "main",
"src": "src/js/main.js",
"isEntry": true,
"css": [
"main-Dqea8g_S.css"
]
}
}
Code final : orpheebesson/demo-wordpress-vite
Conclusion
Entre l’installation des dépendances, la configuration de Vite et le chargement des assets, vous disposez désormais d’une base moderne, rapide et efficace pour développer un thème WordPress en 2025.
C’est d’ailleurs cette approche que j’utilise personnellement dans mes projets WordPress.
Pour aller plus loin
Timber et l'approche MVC
Si vous souhaitez aller encore plus loin dans la structuration de vos thèmes WordPress, je vous recommande vivement d’explorer Timber pour profiter du templating Twig et d’une architecture proche du MVC.
Concrètement, vos fichiers PHP se concentrent sur la logique et la préparation des données, tandis que vos fichiers Twig s’occupent exclusivement du HTML et du rendu de vos pages.
Résultat : un thème mieux structuré, plus lisible et plus facile à maintenir.
Prenons un exemple simple. Tout d'abord, nous préparons les données dans notre fichier single.php
:
// single.php
use Timber\Timber;
$context = Timber::context();
Timber::render('single.twig', $context);
Ensuite, nous affichons ces données dans le fichier single.twig
:
{# single.twig #}
{% extends 'base.twig' %}
{% block content %}
<article>
<h1>{{ post.title }}</h1>
<img src="{{ post.thumbnail.src }}" alt="{{ post.thumbnail.alt }}" />
<div class="post-content">{{ post.content }}</div>
</article>
{% endblock %}
Avec cette séparation claire, vous gagnez en productivité et en lisibilité. Combiné à Vite et Tailwind CSS, Timber devient un excellent allié pour construire vos futurs thèmes WordPress.