--- name: blueprint description: Use when creating, editing, or reviewing WordPress Playground blueprint JSON files. Triggers on mentions of blueprints, playground configuration, or requests to set up a WordPress demo environment. compatibility: "WordPress 6.9+, PHP 7.2.24+. Optionally Playground CLI or a browser" --- # WordPress Playground Blueprints ## Overview A Blueprint is a JSON file that declaratively configures a WordPress Playground instance — installing plugins/themes, setting options, running PHP/SQL, manipulating files, and more. **Core principle:** Blueprints are trusted JSON-only declarations. No arbitrary JavaScript. They work on web, Node.js, and CLI. ## Quick Start Template ```json { "$schema": "https://playground.wordpress.net/blueprint-schema.json", "landingPage": "/wp-admin/", "preferredVersions": { "php": "8.3", "wp": "latest" }, "steps": [{ "step": "login" }] } ``` ## Top-Level Properties All optional. Only documented keys are allowed — the schema rejects unknown properties. | Property | Type | Notes | |----------|------|-------| | `$schema` | string | Always `"https://playground.wordpress.net/blueprint-schema.json"` | | `landingPage` | string | Relative path, e.g. `/wp-admin/` | | `meta` | object | `{ title, author, description?, categories? }` — title and author required | | `preferredVersions` | object | `{ php, wp }` — both required when present | | `features` | object | `{ networking?: boolean, intl?: boolean }` — **only** these two keys, nothing else. Networking defaults to `true` | | `extraLibraries` | array | `["wp-cli"]` — auto-included when any `wp-cli` step is present | | `constants` | object | Shorthand for `defineWpConfigConsts`. Values: string/boolean/number | | `plugins` | array | Shorthand for `installPlugin` steps. Strings = wp.org slugs | | `siteOptions` | object | Shorthand for `setSiteOptions` | | `login` | boolean or object | `true` = login as admin. Object = `{ username?, password? }` (both default to `"admin"`/`"password"`) | | `steps` | array | Main execution pipeline. Runs after shorthands | ### preferredVersions Values - **php:** Major.minor only (e.g. `"8.3"`, `"7.4"`), or `"latest"`. Patch versions like `"7.4.1"` are invalid. Check the schema for currently supported versions. - **wp:** Recent major versions (e.g. `"6.7"`, `"6.8"`), `"latest"`, `"nightly"`, `"beta"`, or a URL to a custom zip. Check the schema for the full list. ### Shorthands vs Steps Shorthands (`login`, `plugins`, `siteOptions`, `constants`) are expanded and prepended to `steps` in an **unspecified order**. Use explicit steps when execution order matters. ## Resource References Resources tell Playground where to find files. Used by `installPlugin`, `installTheme`, `writeFile`, `writeFiles`, `importWxr`, etc. | Resource Type | Required Fields | Example | |--------------|----------------|---------| | `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` | See below | | `literal` | `name`, `contents` | `{ "resource": "literal", "name": "file.txt", "contents": "hello" }` | | `literal:directory` | `name`, `files` | See below | | `bundled` | `path` | References a file within a blueprint bundle (e.g. `{ "resource": "bundled", "path": "/plugin.zip" }`) | | `zip` | `inner` | Wraps another resource in a ZIP — use when a step expects a zip but your source isn't one (e.g. wrapping a `url` resource pointing to a raw directory) | ### git:directory — Installing from GitHub ```json { "resource": "git:directory", "url": "https://github.com/WordPress/gutenberg", "ref": "trunk", "refType": "branch", "path": "/" } ``` - When using a branch or tag name for `ref`, you **must** set `refType` (`"branch"` | `"tag"` | `"commit"` | `"refname"`). Without it, only `"HEAD"` resolves reliably. - `path` selects a subdirectory (defaults to repo root). ### literal:directory — Inline File Trees ```json { "resource": "literal:directory", "name": "my-plugin", "files": { "plugin.php": "", "includes": { "helper.php": "" } } } ``` - `files` uses nested objects for subdirectories — keys are filenames or directory names, values are **plain strings** (file content) or **objects** (subdirectories). Never use resource references as values. - **Do NOT use path separators in keys** (e.g. `"includes/helper.php"` is wrong — use a nested `"includes": { "helper.php": "..." }` object). ## Steps Reference Every step requires `"step": ""`. Any step can optionally include `"progress": { "weight": 1, "caption": "Installing..." }` for UI feedback. ### Plugin & Theme Installation ```json { "step": "installPlugin", "pluginData": { "resource": "wordpress.org/plugins", "slug": "gutenberg" }, "options": { "activate": true, "targetFolderName": "gutenberg" }, "ifAlreadyInstalled": "overwrite" } ``` ```json { "step": "installTheme", "themeData": { "resource": "wordpress.org/themes", "slug": "twentytwentyfour" }, "options": { "activate": true, "importStarterContent": true }, "ifAlreadyInstalled": "overwrite" } ``` - Use `pluginData` / `themeData` — **NOT** the deprecated `pluginZipFile` / `themeZipFile`. - `pluginData` / `themeData` accept any FileReference or DirectoryReference — a zip URL, a `wordpress.org/plugins` slug, a `git:directory`, or a `literal:directory` (no `zip` wrapper needed). - `options.activate` controls activation. No need for a separate `activatePlugin`/`activateTheme` step when using `installPlugin`/`installTheme`. - `ifAlreadyInstalled`: `"overwrite"` | `"skip"` | `"error"` ### Activation (standalone) Only needed for plugins/themes already on disk (e.g. after `writeFile`/`writeFiles`): ```json { "step": "activatePlugin", "pluginPath": "my-plugin/my-plugin.php" } ``` ```json { "step": "activateTheme", "themeFolderName": "twentytwentyfour" } ``` ### File Operations ```json { "step": "writeFile", "path": "/wordpress/wp-content/mu-plugins/custom.php", "data": "