Blueprints WordPress Playground
Aperçu
Un Blueprint est un fichier JSON qui configure de façon déclarative une instance WordPress Playground — installation de plugins/thèmes, configuration d'options, exécution de PHP/SQL, manipulation de fichiers, et plus.
Principe fondamental : Les Blueprints sont des déclarations JSON de confiance uniquement. Pas de JavaScript arbitraire. Ils fonctionnent sur le web, Node.js, et CLI.
Modèle de démarrage rapide
{
"$schema": "https://playground.wordpress.net/blueprint-schema.json",
"landingPage": "/wp-admin/",
"preferredVersions": { "php": "8.3", "wp": "latest" },
"steps": [{ "step": "login" }]
}
Propriétés de niveau supérieur
Toutes optionnelles. Seules les clés documentées sont autorisées — le schéma rejette les propriétés inconnues.
| Propriété | Type | Notes |
|---|---|---|
$schema |
string | Toujours "https://playground.wordpress.net/blueprint-schema.json" |
landingPage |
string | Chemin relatif, par ex. /wp-admin/ |
meta |
object | { title, author, description?, categories? } — title et author obligatoires |
preferredVersions |
object | { php, wp } — les deux obligatoires si présents |
features |
object | { networking?: boolean, intl?: boolean } — uniquement ces deux clés, rien d'autre. Networking par défaut true |
extraLibraries |
array | ["wp-cli"] — auto-inclus si une étape wp-cli est présente |
constants |
object | Raccourci pour defineWpConfigConsts. Valeurs : string/boolean/number |
plugins |
array | Raccourci pour les étapes installPlugin. Strings = slugs wp.org |
siteOptions |
object | Raccourci pour setSiteOptions |
login |
boolean or object | true = connexion en tant qu'admin. Object = { username?, password? } (tous deux par défaut "admin"/"password") |
steps |
array | Pipeline d'exécution principal. S'exécute après les raccourcis |
Valeurs de preferredVersions
- php : Majeure.mineure uniquement (ex.
"8.3","7.4"), ou"latest". Les versions patch comme"7.4.1"sont invalides. Consultez le schéma pour les versions actuellement supportées. - wp : Versions majeures récentes (ex.
"6.7","6.8"),"latest","nightly","beta", ou une URL vers un zip personnalisé. Consultez le schéma pour la liste complète.
Raccourcis vs étapes
Les raccourcis (login, plugins, siteOptions, constants) sont développés et ajoutés au début de steps dans un ordre non spécifié. Utilisez des étapes explicites quand l'ordre d'exécution est important.
Références de ressources
Les ressources indiquent à Playground où trouver les fichiers. Utilisées par installPlugin, installTheme, writeFile, writeFiles, importWxr, etc.
| Type de ressource | Champs obligatoires | Exemple |
|---|---|---|
wordpress.org/plugins |
slug |
{ "resource": "wordpress.org/plugins", "slug": "woocommerce" } |
wordpress.org/themes |
slug |
{ "resource": "wordpress.org/themes", "slug": "astra" } |
url |
url |
{ "resource": "url", "url": "https://example.com/plugin.zip" } |
git:directory |
url, ref |
Voir ci-dessous |
literal |
name, contents |
{ "resource": "literal", "name": "file.txt", "contents": "hello" } |
literal:directory |
name, files |
Voir ci-dessous |
bundled |
path |
Référence un fichier dans un paquet blueprint (ex. { "resource": "bundled", "path": "/plugin.zip" }) |
zip |
inner |
Enveloppe une autre ressource dans un ZIP — utilisez quand une étape attend un zip mais votre source n'en est pas une (ex. envelopper une ressource url pointant vers un répertoire brut) |
git:directory — Installation depuis GitHub
{
"resource": "git:directory",
"url": "https://github.com/WordPress/gutenberg",
"ref": "trunk",
"refType": "branch",
"path": "/"
}
- Quand vous utilisez un nom de branche ou de tag pour
ref, vous devez définirrefType("branch"|"tag"|"commit"|"refname"). Sans cela, seul"HEAD"se résout de manière fiable. pathsélectionne un sous-répertoire (par défaut la racine du repo).
literal:directory — Arborescences de fichiers en ligne
{
"resource": "literal:directory",
"name": "my-plugin",
"files": {
"plugin.php": "<?php /* Plugin Name: My Plugin */ ?>",
"includes": {
"helper.php": "<?php // helper code ?>"
}
}
}
filesutilise des objets imbriqués pour les sous-répertoires — les clés sont des noms de fichiers ou de répertoires, les valeurs sont des chaînes simples (contenu du fichier) ou des objets (sous-répertoires). N'utilisez jamais de références de ressources comme valeurs.- N'utilisez PAS de séparateurs de chemin dans les clés (ex.
"includes/helper.php"est faux — utilisez un objet"includes": { "helper.php": "..." }imbriqué).
Référence des étapes
Chaque étape nécessite "step": "<name>". Toute étape peut optionnellement inclure "progress": { "weight": 1, "caption": "Installing..." } pour les retours visuels.
Installation de plugins et thèmes
{
"step": "installPlugin",
"pluginData": { "resource": "wordpress.org/plugins", "slug": "gutenberg" },
"options": { "activate": true, "targetFolderName": "gutenberg" },
"ifAlreadyInstalled": "overwrite"
}
{
"step": "installTheme",
"themeData": { "resource": "wordpress.org/themes", "slug": "twentytwentyfour" },
"options": { "activate": true, "importStarterContent": true },
"ifAlreadyInstalled": "overwrite"
}
- Utilisez
pluginData/themeData— PAS les ancienspluginZipFile/themeZipFile. pluginData/themeDataacceptent toute FileReference ou DirectoryReference — une URL zip, un slugwordpress.org/plugins, ungit:directory, ou unliteral:directory(pas besoin d'enveloppezip).options.activatecontrôle l'activation. Pas besoin d'une étapeactivatePlugin/activateThemeséparée quand vous utilisezinstallPlugin/installTheme.ifAlreadyInstalled:"overwrite"|"skip"|"error"
Activation (autonome)
Nécessaire uniquement pour les plugins/thèmes déjà sur disque (ex. après writeFile/writeFiles) :
{ "step": "activatePlugin", "pluginPath": "my-plugin/my-plugin.php" }
{ "step": "activateTheme", "themeFolderName": "twentytwentyfour" }
Opérations sur fichiers
{ "step": "writeFile", "path": "/wordpress/wp-content/mu-plugins/custom.php", "data": "<?php // code" }
data accepte une chaîne simple (comme montré ci-dessus) ou une référence de ressource (ex. { "resource": "url", "url": "https://..." }).
{
"step": "writeFiles",
"writeToPath": "/wordpress/wp-content/plugins/",
"filesTree": {
"resource": "literal:directory",
"name": "my-plugin",
"files": {
"plugin.php": "<?php\n/*\nPlugin Name: My Plugin\n*/",
"includes": {
"helpers.php": "<?php // helpers"
}
}
}
}
writeFiles nécessite une DirectoryReference (literal:directory ou git:directory) comme filesTree — pas un objet simple.
Autres opérations sur fichiers : mkdir, cp, mv, rm, rmdir, unzip.
Exécution de code
runPHP :
{ "step": "runPHP", "code": "<?php require '/wordpress/wp-load.php'; update_option('key', 'value');" }
PIÈGES : Vous devez require '/wordpress/wp-load.php'; pour utiliser n'importe quelles fonctions WordPress.
wp-cli :
{ "step": "wp-cli", "command": "wp post create --post_type=page --post_title='Hello' --post_status=publish" }
Le nom de l'étape est wp-cli (avec tiret), PAS cli ou wpcli.
runSql :
{ "step": "runSql", "sql": { "resource": "literal", "name": "q.sql", "contents": "UPDATE wp_options SET option_value='val' WHERE option_name='key';" } }
Configuration du site
{ "step": "setSiteOptions", "options": { "blogname": "My Site", "blogdescription": "A tagline" } }
{ "step": "defineWpConfigConsts", "consts": { "WP_DEBUG": true } }
{ "step": "setSiteLanguage", "language": "en_US" }
{ "step": "defineSiteUrl", "siteUrl": "https://example.com" }
Autres étapes
| Étape | Propriétés clés |
|---|---|
login |
username?, password? (par défaut "admin" / "password") |
enableMultisite |
(pas de props obligatoires) |
importWxr |
file (FileReference) |
importThemeStarterContent |
themeSlug? |
importWordPressFiles |
wordPressFilesZip, pathInZip? — importe un répertoire WordPress complet depuis un zip |
request |
request: { url, method?, headers?, body? } |
updateUserMeta |
userId, meta |
runWpInstallationWizard |
options? — exécute l'assistant d'installation WP avec les options données |
resetData |
(pas de props) |
Modèles courants
Mu-plugin en ligne (code personnalisé rapide)
{
"step": "writeFile",
"path": "/wordpress/wp-content/mu-plugins/custom.php",
"data": "<?php\n// mu-plugins se chargent automatiquement — pas d'activation nécessaire, pas de require wp-load.php\nadd_filter('show_admin_bar', '__return_false');"
}
Plugin en ligne avec plusieurs fichiers
{
"step": "writeFiles",
"writeToPath": "/wordpress/wp-content/plugins/",
"filesTree": {
"resource": "literal:directory",
"name": "my-plugin",
"files": {
"my-plugin.php": "<?php\n/*\nPlugin Name: My Plugin\n*/\nrequire __DIR__ . '/includes/main.php';",
"includes": {
"main.php": "<?php // main logic"
}
}
}
}
Puis l'activez avec une étape séparée :
{ "step": "activatePlugin", "pluginPath": "my-plugin/my-plugin.php" }
Plugin depuis une branche GitHub
{
"step": "installPlugin",
"pluginData": {
"resource": "git:directory",
"url": "https://github.com/user/repo",
"ref": "feature-branch",
"refType": "branch",
"path": "/"
}
}
Erreurs courantes
| Erreur | Correct |
|---|---|
pluginZipFile / themeZipFile |
pluginData / themeData |
"step": "cli" |
"step": "wp-cli" |
Objet plat comme writeFiles.filesTree |
Doit être une ressource literal:directory ou git:directory |
Séparateurs de chemin dans les clés files |
Utilisez des objets imbriqués pour les sous-répertoires |
runPHP sans wp-load.php |
Toujours require '/wordpress/wp-load.php'; pour les fonctions WP |
| Clés de niveau supérieur inventées | Seules les clés documentées fonctionnent — le schéma rejette les propriétés inconnues |
| Inventer des URL proxy pour GitHub | Utilisez le type de ressource git:directory |
Oublier refType avec une branche/tag ref |
Obligatoire — seul "HEAD" fonctionne sans cela |
Références de ressources dans les valeurs files de literal:directory |
Les valeurs doivent être des chaînes simples (contenu) ou des objets (sous-répertoires) — jamais de refs de ressources |
features.debug ou autres clés de feature inventées |
features supporte uniquement networking et intl — utilisez constants: { "WP_DEBUG": true } pour le mode debug |
require wp-load.php dans le code mu-plugin |
Nécessaire uniquement dans les étapes runPHP — les mu-plugins s'exécutent déjà dans WordPress |
URL de schéma avec domaine .org |
Doit être playground.wordpress.net, pas playground.wordpress.org |
Référence complète
Cette compétence couvre les étapes et modèles les plus courants. Pour l'API complète, consultez :
- Documentation Blueprint : https://wordpress.github.io/wordpress-playground/blueprints
- Schéma JSON : https://playground.wordpress.net/blueprint-schema.json
Étapes supplémentaires non couvertes ci-dessus : runPHPWithOptions (exécuter PHP avec des paramètres ini personnalisés), runWpInstallationWizard, et types de ressources vfs et bundled (pour les scénarios d'intégration avancés).
Paquets Blueprint
Les paquets sont des packages autonomes qui incluent un blueprint.json ainsi que toutes les ressources qu'il référence (plugins, thèmes, fichiers WXR, etc.). Au lieu d'héberger les ressources en externe, empaquetez-les aux côtés du blueprint.
Structure du paquet
my-bundle/
├── blueprint.json ← doit être à la racine
├── my-plugin.zip ← répertoire plugin compressé
├── theme.zip
└── content/
└── sample-content.wxr
Les plugins et thèmes doivent être compressés avant empaquetage — installPlugin attend un zip, pas un répertoire brut. Pour créer le zip à partir d'un répertoire de plugin :
cd my-bundle
zip -r my-plugin.zip my-plugin/
Référencement des ressources empaquetées
Utilisez le type de ressource bundled pour référencer les fichiers du paquet :
{
"step": "installPlugin",
"pluginData": {
"resource": "bundled",
"path": "/my-plugin.zip"
},
"options": { "activate": true }
}
{
"step": "importWxr",
"file": {
"resource": "bundled",
"path": "/content/sample-content.wxr"
}
}
Création d'un paquet étape par étape
- Créez le répertoire du paquet et ajoutez
blueprint.jsonà sa racine. - Écrivez vos fichiers source de plugin/thème dans un sous-répertoire (ex.
my-plugin/my-plugin.php). - Compressez le répertoire du plugin :
zip -r my-plugin.zip my-plugin/ - Référencez-le dans
blueprint.jsonen utilisant{ "resource": "bundled", "path": "/my-plugin.zip" }.
Exemple complet — un paquet qui installe un plugin personnalisé :
dashboard-widget-bundle/
├── blueprint.json
├── dashboard-widget.zip ← zip de dashboard-widget/
└── dashboard-widget/ ← source du plugin (conservée pour l'édition)
└── dashboard-widget.php
{
"$schema": "https://playground.wordpress.net/blueprint-schema.json",
"landingPage": "/wp-admin/",
"preferredVersions": { "php": "8.3", "wp": "latest" },
"steps": [
{ "step": "login" },
{
"step": "installPlugin",
"pluginData": { "resource": "bundled", "path": "/dashboard-widget.zip" },
"options": { "activate": true }
}
]
}
Formats de distribution
| Format | Comment utiliser |
|---|---|
| Fichier ZIP (distant) | Site web : https://playground.wordpress.net/?blueprint-url=https://example.com/bundle.zip |
| Fichier ZIP (local) | CLI : npx @wp-playground/cli server --blueprint=./bundle.zip |
| Répertoire local | CLI : npx @wp-playground/cli server --blueprint=./my-bundle/ --blueprint-may-read-adjacent-files |
| Répertoire de repository Git | Pointez blueprint-url vers un répertoire de repo contenant blueprint.json |
PIÈGE : Les paquets de répertoire local nécessitent toujours --blueprint-may-read-adjacent-files pour que le CLI lise les ressources empaquetées. Sans cela, toute référence "resource": "bundled" échouera avec une erreur "File not found". Les paquets ZIP n'ont pas besoin de cet indicateur — tous les fichiers sont autonomes dans l'archive.
Test des Blueprints
Blueprints en ligne (test rapide, pas de paquets)
Minifiez le JSON Blueprint (pas d'espaces supplémentaires), ajoutez https://playground.wordpress.net/# au début, et ouvrez l'URL dans un navigateur :
https://playground.wordpress.net/#{"$schema":"https://playground.wordpress.net/blueprint-schema.json","preferredVersions":{"php":"8.3","wp":"latest"},"steps":[{"step":"login"}]}
Les très grands Blueprints peuvent dépasser les limites de longueur d'URL du navigateur ; utilisez le CLI à la place.
Test local avec CLI
Serveur interactif (continue à tourner, s'ouvre dans un navigateur) :
# Paquet répertoire — nécessite --blueprint-may-read-adjacent-files
npx @wp-playground/cli server --blueprint=./my-bundle/ --blueprint-may-read-adjacent-files
# Paquet ZIP — autonome, pas d'indicateurs supplémentaires nécessaires
npx @wp-playground/cli server --blueprint=./bundle.zip
Validation sans affichage (exécute le blueprint et quitte) :
npx @wp-playground/cli run-blueprint --blueprint=./my-bundle/ --blueprint-may-read-adjacent-files
Test avec la compétence wordpress-playground-server
Utilisez la compétence wordpress-playground-server pour démarrer une instance Playground locale avec --blueprint /path/to/blueprint.json, puis vérifiez l'état attendu avec MCP Playwright. Pour les paquets répertoire, passez --blueprint-may-read-adjacent-files comme argument supplémentaire.