Développer une mise en page de listing d’articles avec cinq lignes de « Lorem ipsum dolor sit amet » identiques ne révèle jamais les vrais problèmes visuels : titres de longueurs variables qui cassent une grille, images absentes qui écrasent une mise en page pensée pour un ratio précis, extraits qui débordent d’une carte. Ce texte ne traite pas de la base de données anonymisée reconstituée à partir de données de production, déjà couverte, mais d’une approche différente et complémentaire : générer depuis zéro un jeu de données fictif mais réaliste, avec la bibliothèque PHP Faker.
L’intérêt de cette approche par rapport à une base anonymisée existante est double : elle ne dépend d’aucune donnée de production, ce qui la rend utilisable dès le tout premier jour d’un nouveau projet, et elle permet de générer précisément le volume et la variété de contenu nécessaires pour tester un cas limite, comme un article au titre extrêmement long ou une catégorie avec un seul contenu.
Installer Faker dans le contexte WP-CLI
La bibliothèque fzaninotto/faker (ou son fork maintenu fakerphp/faker) s’installe comme dépendance de développement du projet :
composer require --dev fakerphp/faker
Un fichier de commande personnalisée WP-CLI, placé dans wp-content/mu-plugins/commandes-dev.php (à ne jamais déployer en production, protégé par une vérification d’environnement), enregistre une nouvelle commande dédiée au peuplement du site.
Le script de génération, adapté au projet
Sur un projet de blog de recettes de cuisine pour un client, le script génère des articles avec des titres cohérents avec le thème du site, plutôt que des phrases Faker génériques hors sujet :

<?php
use Faker\Factory;
if (! defined('WP_CLI')) {
return;
}
class CommandesDev {
public function peupler_recettes($args, $assoc_args) {
$nombre = $assoc_args['nombre'] ?? 50;
$faker = Factory::create('fr_FR');
$ingredients = ['tomate', 'basilic', 'poulet', 'lentilles', 'saumon', 'courgette', 'parmesan'];
$techniques = ['rôti', 'mijoté', 'sauté', 'vapeur', 'gratiné', 'mariné'];
$categories = get_terms(['taxonomy' => 'categorie_recette', 'hide_empty' => false]);
for ($i = 0; $i < $nombre; $i++) {
$ingredient = $faker->randomElement($ingredients);
$technique = $faker->randomElement($techniques);
$titre = ucfirst("{$ingredient} {$technique} " . $faker->words(2, true));
$id = wp_insert_post([
'post_type' => 'recette',
'post_title' => $titre,
'post_content' => $this->generer_contenu_recette($faker, $ingredient),
'post_excerpt' => $faker->sentence(rand(8, 22)),
'post_status' => 'publish',
'post_date' => $faker->dateTimeBetween('-2 years', 'now')->format('Y-m-d H:i:s'),
]);
if (! empty($categories)) {
wp_set_object_terms($id, $faker->randomElement($categories)->term_id, 'categorie_recette');
}
update_post_meta($id, 'temps_preparation', $faker->numberBetween(10, 90));
update_post_meta($id, 'nombre_portions', $faker->numberBetween(2, 8));
WP_CLI::log("Recette créée : {$titre}");
}
WP_CLI::success("{$nombre} recettes générées.");
}
private function generer_contenu_recette($faker, $ingredient) {
$etapes = "";
for ($e = 1; $e <= rand(3, 6); $e++) {
$etapes .= "<p>Étape {$e} : " . $faker->sentence(rand(10, 18)) . "</p>";
}
return "<p>Une recette simple à base de {$ingredient}.</p>" . $etapes;
}
}
WP_CLI::add_command('dev peupler-recettes', ['CommandesDev', 'peupler_recettes']);
Lancer la génération
wp dev peupler-recettes --nombre=500 --allow-root
Sur la machine de développement de l’agence, cette commande a généré 500 recettes complètes, avec métadonnées et taxonomie assignée, en un peu moins de douze secondes, contre plusieurs heures qu’aurait demandé une saisie manuelle équivalente pour obtenir une variété comparable de longueurs de titre et de contenu.
Générer aussi des images cohérentes
Pour les projets qui ont besoin d’images à l’échelle, Faker peut aller chercher des images de substitution auprès d’un service comme Picsum Photos, à ne jamais utiliser en production mais parfaitement adapté à un environnement de développement local :
$url_image = 'https://picsum.photos/800/600?random=' . $faker->numberBetween(1, 9999);
$id_media = media_sideload_image($url_image, $id, $titre, 'id');
set_post_thumbnail($id, $id_media);
Adapter la logique à chaque type de contenu personnalisé
La vraie valeur de cette approche ne tient pas dans l’appel générique à Faker, mais dans l’effort de rendre chaque champ personnalisé cohérent avec la réalité métier du projet. Un CPT « événement » aura besoin de dates futures plutôt que passées, un CPT « témoignage client » aura besoin de noms et de notes de satisfaction plausibles, un CPT « offre d’emploi » aura besoin de fourchettes de salaire réalistes pour le secteur du client. Un script générique qui produit des données incohérentes ne teste rien de plus utile que du lorem ipsum.
| Type de contenu | Générateur Faker adapté |
|---|---|
| Article de blog | Titres et paragraphes thématiques personnalisés |
| Fiche produit | Prix réalistes, SKU, stock aléatoire borné |
| Témoignage client | Noms, notes 3 à 5 étoiles, textes courts |
| Événement à venir | Dates futures uniquement, lieux plausibles |
Un jeu de données de test qui ne ressemble pas au métier du client cache exactement les bugs que le client rencontrera en premier une fois le site en production.
En résumé
Faker, combiné à une commande WP-CLI personnalisée écrite pour chaque projet, remplace efficacement le contenu lorem ipsum par un jeu de données varié et pertinent, sans dépendre d’un accès à une base de production existante. Le temps investi à écrire une logique de génération spécifique au métier du client, plutôt qu’un script générique, se rentabilise dès la première revue de mise en page où les cas limites apparaissent naturellement plutôt que d’être découverts en production.