Meet the new WordPress Playground interface

WordPress Playground has a new interface for its web instance. A customizable Dock brings tools that were previously spread across sidebars, modals, and popovers into one consistent toolbar at the bottom of the screen.

The redesign addresses a discoverability problem. Playground can already save sites in the browser, switch between multiple sites, run Blueprints, edit files, inspect the database and logs, import complete sites, and export work in several formats. However, many of those features were easy to miss. Some users even assumed that every Playground was still temporary.

From exploration to a shared design

The new interface grew out of work at the WordPress Playground table during Contributor DayContributor Day Contributor Days are standalone days, frequently held before or after WordCamps but they can also happen at any time. They are events where people get together to work on various areas of https://make.wordpress.org/ There are many teams that people can participate in, each with a different focus. https://make.wordpress.org/support/handbook/getting-started/getting-started-at-a-contributor-day/ at WordCampWordCamp WordCamps are casual, locally-organized conferences covering everything related to WordPress. They're one of the places where the WordPress community comes together to teach one another what they’ve learned throughout the year and share the joy. Learn more. Europe 2026 in Kraków.

Before the event, Adam Zieliński used AI tools to explore more than 400 interface variations. Those experiments were not production-ready designs, but they helped the team identify promising directions. At Contributor Day, designers and other contributors sketched alternatives, discussed how different audiences use Playground, and narrowed the proposals to the Dock interface.

The goal was not only to refresh the visual design. The team wanted to reduce the space used by Playground controls, distinguish them from WordPress controls, and give every tool a predictable home. The Dock makes those capabilities visible without competing with the WordPress admin bar or taking space away from the site. It can appear as a compact toolbar, collapse to a minimal control, or expand into a full-width sticky bar.

The goal of this change

Beyond the visual aspect, the goal was to use less space and differentiate from the WordPress admin bar. The new UI lists all main options as icons for the user:

  • New: Start a Playground from a searchable Blueprint gallery, a Blueprint URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org, Blueprint JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML., a pull request preview, a GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the ‘pull request’ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ repository, or a previously exported ZIP file.
  • Playgrounds: Switch between sites and manage recent autosaves and permanently saved Playgrounds. You can rename, save, reopen, or delete a site from its Actions menu.
  • Blueprint: Inspect or edit the current site’s blueprint.json recipe and export it for reuse.
  • Site Settings: Choose the WordPress version, PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php version, and language, or rename the Playground. Changing the WordPress or PHP version creates a fresh Playground instead of silently changing the current site.
  • Database: Inspect or export the SQLite database with Adminer or phpMyAdmin. Both tools continue to open in a new tab to provide more working space.
  • Files: Browse, create, upload, edit, and download files from the WordPress instance. Desktop users can also drag files into the file manager; mobile users can use the upload control.
  • Logs: Review messages from PHP, WordPress, and Playground in one place.
  • Export: Download the current site as a ZIP file, copy a link to its original Blueprint setup, or export selected files to GitHub.

The new UI provides a consistent experience, with all functionality available in modals on desktop and slide panels on mobile. It took the best of the UI and made all options available at the bottom. It provides easy access for mobile users to navigate across all options with a single thumb.

Existing capabilities, fewer clicks

This release is primarily a navigation redesign, not a new set of Playground capabilities. Existing workflows now have a consistent entry point, and the autosave experience, file browser, and Blueprint editor received refinements. The New panel is one example. Workflows that previously lived in different parts of the interface now appear together. You can start with a Blueprint, preview a WordPress or GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses ‘blocks’ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ pull request, import from GitHub, or restore a Playground ZIP without searching through separate menus.

The Playgrounds panel also makes persistence easier to understand. Saved sites and recent autosaves appear in separate groups, with preview thumbnails and recognizable names that help you find earlier work.

New Your Playgrounds panel

Built with the community

Community collaboration helped to shape the Dock from early sketches through the final feedback cycle. The challenge remains the same: make advanced tools useful to developers without overwhelming people who only want a quick, safe place to explore WordPress. The Dock gives the team a more flexible foundation for serving both groups.

Thank you to @ashfame for co-leading the Playground table at Contributor Day; @berislavgrgicak and @zieladam for gathering and shaping the ideas; @corazondejaguar, @feedmymedia, @tibibuzdugan, and @maxtudio for the prototypes and design feedback; and @sufmitsingh and @muryam for helping with testing.

Contributor Day WordCamp Europe 2026

Share your feedback

Try the new interface on both desktop and mobile. If you find a bug or an unclear workflow, add it to the New Dock UI review issue. Helpful reports include:

  • Your device, operating system, and browser.
  • The steps you followed.
  • What you expected and what happened instead.
  • A screenshot or short recording, when possible.

#ui

One Playground, three workflows: Consistent agent guidance across surfaces

WordPress Playground is not a single interface. A developer may use the Playground CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress. for local work, a Blueprint to describe a reproducible site, or playground.wordpress.net to create and share a browser-based demo. An AI agent needs to know which surface owns each part of a request.

PR #56 in the WordPress agent-skills repository updates the wp-playground skill around that idea. Instead of keeping CLI commands, Blueprint advice, browser links, and debugging notes in one long procedure, the skill becomes a small routing layer with focused references.

The result gives agents a clearer model of the whole Playground ecosystem. In this post, we are going to cover the main updates on the WordPress Playground agent skill, which is present in the WordPress repository. If you want an introduction post, I do recommend reading the previous post about the Playground agent skill.

What changes for Playground users

  • A developer starting a pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. locally gets the current start workflow and a check that the plugin is active.
  • A reviewer receiving a demo link gets correct encoding, public hosting and CORS requirements, and a fresh-browser verification step.
  • A mixed request can move from Blueprint authoring to local execution and browser sharing without one skill pretending to own every concern.

The headline benefit is consistency across surfaces: the answer changes with the workflow, while the underlying model of Playground stays coherent.

Why the previous skill reached its limit

The previous 101-line SKILL.md put local execution, Blueprint guidance, browser sharing, and debugging in one procedure. That created three failure modes:

  • Browser support was too shallow to explain the Query API, persistence, or the difference between window.playgroundSites and the active window.playground client.
  • Blueprint guidance existed in both wp-playground and the dedicated blueprint skill, creating two sources of truth.
  • The common plugin and theme workflow still led with server --auto-mount after the Playground CLI documentation had moved the typical development loopLoop The Loop is PHP code used by WordPress to display posts. Using The Loop, WordPress processes each post to be displayed on the current page, and formats it according to how it matches specified criteria within The Loop tags. Any HTML or PHP code in the Loop will be processed on each post. https://codex.wordpress.org/The_Loop to start.

The current high-level workflow is:

cd <plugin-or-theme-root>
node -v
npx @wp-playground/cli@latest start

The server command remains useful when an agent needs explicit mounts, a disposable environment, CI behavior, or fine-grained runtime control. The important change is teaching the agent to choose, not treating one command as the answer to every local workflow.

Route by intent, then load the detail

The new wp-playground wrapper starts by classifying the request:

Request typeOwnerExpected outcome
Write or review Blueprint JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML.blueprint skillCurrent schema, supported steps, and valid resources
Run a plugin, theme, or Blueprint locallywp-playgroundCLI referenceAppropriate command, mount strategy, and verification
Debug Xdebug or a stuck CLI runwp-playgrounddebugging referenceRelevant logs, flags, and worker guidance
Create a browser link or automate a browser sitewp-playgroundwebsite referenceCorrect URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org or APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. surface with browser constraints
Combine authoring, local execution, and sharingWrapper composes the routesOne staged workflow with clear ownership

Mixed requests can use more than one route. For example, “write a Blueprint, run it locally, and give me a reviewer link” uses blueprint for the JSON, the CLI reference for local execution, and the website reference for sharing.

This is progressive disclosure in practice. The entry file drops from 101 to 52 lines. The complete bundle grows because it documents more capability, but an agent loads that depth only when the request needs it.

Browser sharing becomes a first-class route

The website reference distinguishes three control surfaces:

  1. URL setup through Query API parameters, Blueprint fragments, and blueprint-url.
  2. Browser site management through the Sites API at window.playgroundSites.
  3. Runtime interaction through the JavaScript API client exposed as window.playground.

That distinction prevents several common mistakes. playgroundSites manages site records, persistence, and the active site. The Playground client reads and writes the WordPress virtual filesystem, runs PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php, makes requests, and navigates the visible site. URL parameters configure a site before it boots.

The reference also documents boundaries that matter when an agent generates a share link:

  • Small inline Blueprints should be encoded once with encodeURIComponent(JSON.stringify(blueprint)).
  • Larger JSON files and ZIP bundles should use ?blueprint-url=<public-url>.
  • Hosted files must be public and allow cross-origin loading.
  • A browser Playground cannot read an arbitrary local filesystem path.
  • The final URL should be checked in a fresh browser session.

These details turn “make a Playground link” from a plausible-looking string into a repeatable handoff. The official troubleshooting guide confirms that raw JSON in a fragment, double encoding, private URLs, and missing CORS headers are frequent failure modes.

At the same time, the blueprint skill now explicitly owns Blueprint JSON and bundles, and the debugging reference replaces stale worker advice with current flags. The router can therefore choose a source before the agent starts composing an answer.

What the benchmark showed

To measure the impact, I compared three configurations:

  • The new version.
  • The previous skill.
  • A control that answered from general model knowledge without consulting a skill.

The benchmark used the four scenarios added by the PR: CLI auto-mounting, website sharing, a mixed Blueprint/CLI/browser request, and current Blueprint schema authoring. Every configuration received the same prompts running on GPT 5.5 Sol. The two skill configurations could read only the files from their pinned revision, while the control could not read skill files or references.

On this four-scenario, 24-assertion regression suite:

ScenarioNew skillPrevious skillWithout skill
CLI auto-mount5/5 (100%)4/5 (80%)1/5 (20%)
Website share URL6/6 (100%)5/6 (83.3%)2/6 (33.3%)
Mixed Blueprint, CLI, and website workflow6/6 (100%)6/6 (100%)3/6 (50%)
Current Blueprint schema7/7 (100%)7/7 (100%)6/7 (85.7%)
All assertions24/24 (100%)22/24 (91.7%)12/24 (50%)

Six criteria inspect the execution trace rather than the final answer. Five explicitly require the agent to use or route through a skill, so they necessarily penalize the no-skill control. Removing all six produces a cleaner comparison of answer content:

Answer-content scoreNew skillPrevious skillWithout skill
Passed criteria18/18 (100%)16/18 (88.9%)11/18 (61.1%)

The final PR revision passed 24/24 checks: 100% on this four-scenario, 24-assertion regression suite. Only two content checks separated it from the previous skill:

  • It chose npx @wp-playground/cli@latest start for the common plugin-development workflow.
  • It required public, CORS-enabled hosting with Access-Control-Allow-Origin: * for Blueprint files, bundles, and referenced assets.

The Blueprint-only scenario did not distinguish answer quality; all three configurations passed its six content checks. That is evidence of preserved behavior, not improvement.

This is a focused regression suite, not a general model leaderboard. It uses one run per prompt, does not measure run-to-run variance, and grades guidance rather than live Playground execution.

Review improved the architecture

The pull request’s review history also shaped the final structure. Review feedback asked for an explicit routing procedure, top-level failure modes, stronger delegation to blueprint, and direct one-hop links from the wrapper to each reference.

The final revision removes reference-to-reference handoffs. A CLI or website reference now sends the agent back to the wrapper when the request changes direction. That keeps every focused file one hop from SKILL.md and makes the routing model easier to inspect.

Consistency across surfaces

The improvement is not merely a higher benchmark score. It is a more consistent developer experience across the CLI, Blueprints, and browser sharing. A request can move from a valid Blueprint to a local run and then to a reviewer link while each skill remains responsible for one concern.

PR #56 was merged on July 25, 2026. You can inspect the complete change set and use the four scenarios as starting points for testing real Playground tasks.

Manage WordPress Playground Sites Programmatically

WordPress Playground is often used as a one-off browser sandbox: open a link, test a pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party., close the tab.

That is useful, but plugin and theme development usually involves more than one sandbox. You may need a clean site for reproduction, a saved site for ongoing debugging, another site pinned to a different PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php version, and a way to inspect all of them without clicking through the interface.

Recent Playground updates make those workflows easier to automate. The Playground website now makes a site management object available to JavaScriptJavaScript JavaScript or JS is an object-oriented computer programming language commonly used to create interactive effects within web browsers. WordPress makes extensive use of JS for a better user experience. While PHP is executed on the server, JS executes within a user’s browser. https://www.javascript.com running on its top-level page. Code in the browser console or a browser automation tool can access it through window.playgroundSites to list and switch sites, save temporary sites, rename saved sites, change runtime settings, or get the active site’s PlaygroundClient.

This post shows how plugin and theme developers can use that APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. from the browser console to speed up real workflows.

One interface for site management

Before these updates, anything outside the Playground UIUI UI is an acronym for User Interface - the layout of the page the user interacts with. Think ‘how are they doing that’ and less about what they are doing. had to recreate site management behavior itself. MCP tools, browser-native WebMCP, DevTools experiments, and UI components all needed some way to list sites, save them, rename them, or switch the active site.

The new PlaygroundSitesAPI gives those workflows one shared interface. After the Playground website loads, JavaScript running on the page can call that interface through window.playgroundSites. This makes site management scriptable without relying on brittle UI automation.

In practical terms, you can now open DevTools and run:

window.playgroundSites.list();

The result is an array of site records:

[
  {
    slug: "quiet-river",
    name: "Quiet River",
    storage: "temporary",
    isActive: true,
  },
];

The storage field tells you whether the site is temporary, saved in browser storage, or saved to the local filesystem. Temporary sites disappear on reload unless you save them first.

The API at a glance

The workflows in this post use these coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. methods:

MethodWhat it does
list()Lists all known Playground sites and marks the active one.
getClient()Returns the PlaygroundClient for the active site, if it has booted.
isReady()Resolves when the active site has booted and its client is ready.
rename(newName)Renames the active saved site. Temporary sites must be saved first.
saveInBrowser(name?)Saves the active temporary site to browser storage.
saveToLocalFileSystem(name?, handle?)Saves the active temporary site to a local directory.
setPhpVersion(version)Changes the PHP version for the active saved site.
setNetworking(enabled)Enables or disables networking for the active saved site.
delete(siteSlug)Deletes a saved site by slug. Temporary sites cannot be deleted this way.
setActiveSite(siteSlug)Switches to another site and waits for it to boot.
createNewTemporarySite(siteSlug?, settings?)Creates and activates a new temporary site.

The API is available after Playground loads its saved sites. If window.playgroundSites is undefined, wait until the Playground UI has finished loading. Then call await window.playgroundSites.isReady() before running commands that need the active site’s client.

See the Sites API documentation for the complete reference, including methods for autosaved and explicitly saved sites.

Run the examples on the Playground website

The examples below use the Sites API on playground.wordpress.net. Open the website, wait for the Playground UI to load, open your browser’s DevTools console, and run await window.playgroundSites.isReady(). You can then paste the examples into the console. A browser automation tool such as Playwright can run the same JavaScript while it controls a tab open to the Playground website.

This API belongs to the Playground website. It is not part of the @wp-playground/client package or the Playground CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress., and it is not exposed by /remote.html when you embed Playground in another application. For embedded sites and test automation that starts its own Playground client, use the JavaScript API instead.

Scenario 1: Create a clean plugin test site

When debugging a plugin issue, start with a fresh site that matches the target environment. The example below creates a temporary site using PHP 8.4, the latest WordPress release, and networking enabled:

const slug = await window.playgroundSites.createNewTemporarySite(
  "plugin-test-php-84",
  {
    phpVersion: "8.4",
    wpVersion: "latest",
    networking: true,
  }
);

console.log(`Active test site: ${slug}`);

Use this when you need a clean environment before installing a plugin or reproducing a report. The site is temporary at this point, so changes will not survive a reload.

Scenario 2: Save and rename a reproducible bug report

Once you reproduce a bug, save the site before making more changes. Saving turns a temporary site into a browser-stored site:

const saved = await window.playgroundSites.saveInBrowser(
  "Plugin compatibility test"
);

console.log(saved);

The returned object includes the site slug and storage type:

{
  slug: "plugin-test-php-84",
  storage: "opfs",
}

After saving, you can rename the active site:

await window.playgroundSites.rename(
  "Plugin compatibility test - PHP 8.4"
);

That sequence matters. rename() only works on saved sites. If you call it on a temporary site, Playground throws:

Cannot rename a temporary site. Save it first.

Scenario 3: Switch between saved test sites

When you keep separate sites for different reproduction cases, list them and switch by slug:

const sites = window.playgroundSites.list();

console.table(
  sites.map((site) => ({
    slug: site.slug,
    name: site.name,
    storage: site.storage,
    active: site.isActive,
  }))
);

To activate one:

const target = window.playgroundSites
  .list()
  .find((site) => site.name.includes("Plugin compatibility"));

if (target) {
  await window.playgroundSites.setActiveSite(target.slug);
}

setActiveSite() waits for the selected site to boot before resolving, so follow-up commands can safely assume the active site is ready.

Scenario 4: Inspect plugin state with PHP

The site management API gives you access to the active site’s PlaygroundClient. That client can run PHP inside the WordPress environment.

function phpResponseText(response) {
  return "text" in response
    ? response.text
    : new TextDecoder().decode(response.bytes);
}

await window.playgroundSites.isReady();
const client = window.playgroundSites.getClient();

if (!client) {
  throw new Error("The active Playground site has not booted yet.");
}

const response = await client.run({
  code: `<?php
require_once "/wordpress/wp-load.php";

echo json_encode([
  "php" => phpversion(),
  "wp" => get_bloginfo("version"),
  "active_plugins" => get_option("active_plugins"),
]);
`,
});

console.log(phpResponseText(response));

This lets you query plugin data in the WordPress database directly, without navigating through wp-admin. You can replace the PHP with targeted checks for options, active theme data, custom post types, or plugin-specific database rows.

For example, to inspect one option:

const response = await client.run({
  code: `<?php
require_once "/wordpress/wp-load.php";
echo wp_json_encode(get_option("woocommerce_currency"));
`,
});

console.log(phpResponseText(response));

Playground uses SQLite for WordPress storage, so prefer WordPress APIs like get_option() and $wpdb over database-specific SQL behavior.

Scenario 5: Change runtime settings for a saved site

Sometimes a bug only appears with a specific PHP version or with networking enabled. Once the active site is saved, you can update runtime settings directly:

await window.playgroundSites.setPhpVersion("8.3");
await window.playgroundSites.setNetworking(true);

These methods require a saved site. If the active site is temporary, save it first:

await window.playgroundSites.saveInBrowser("Network test");
await window.playgroundSites.setNetworking(true);

This is a good workflow for compatibility testing:

  1. Create a clean site.
  2. Install and configure the plugin.
  3. Save the site.
  4. Switch PHP versions.
  5. Re-run the same plugin checks.

Scenario 6: Create a small compatibility checklist

You can combine the API calls into a manual checklist from DevTools. This example creates a site, saves it, gathers basic version information, and leaves the result in the console:

async function prepareCompatibilitySite() {
  function phpResponseText(response) {
    return "text" in response
      ? response.text
      : new TextDecoder().decode(response.bytes);
  }

  const slug = await window.playgroundSites.createNewTemporarySite(
    "compatibility-check",
    {
      phpVersion: "8.4",
      wpVersion: "latest",
      networking: true,
    }
  );

  await window.playgroundSites.saveInBrowser(
    "Compatibility check - PHP 8.4"
  );

  await window.playgroundSites.isReady();
  const client = window.playgroundSites.getClient();
  if (!client) {
    throw new Error("The compatibility site has not booted yet.");
  }

  const response = await client.run({
    code: `<?php
require_once "/wordpress/wp-load.php";
echo wp_json_encode([
  "site_url" => get_site_url(),
  "php" => phpversion(),
  "wp" => get_bloginfo("version"),
  "theme" => wp_get_theme()->get("Name"),
]);
`,
  });

  return {
    site: window.playgroundSites
      .list()
      .find((site) => site.slug === slug),
    info: JSON.parse(phpResponseText(response)),
  };
}

console.log(await prepareCompatibilitySite());

This is not a replacement for a full test suite. It is a fast way to prepare and inspect a browser-based testing site when you are triaging a report.

How this fits recent Playground updates

Recent Playground work also added deeper AI and browser automation hooksHooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same. through MCP and WebMCP. The same centralized site management API supports those integrations, so AI agents and browser-native tools can manage Playground sites through explicit operations instead of clicking through menus.

For example:

  • list() maps naturally to “show me my Playground sites.”
  • setActiveSite(slug) maps to “open the site named Plugin compatibility test.”
  • saveInBrowser(name) maps to “save this reproduction so I can come back later.”
  • getClient() gives tool layers access to PHP execution, HTTPHTTP HTTP is an acronym for Hyper Text Transfer Protocol. HTTP is the underlying protocol used by the World Wide Web and this protocol defines how messages are formatted and transmitted, and what actions Web servers and browsers should take in response to various commands. requests, and filesystem operations.

The result is a cleaner foundation for agent workflows. A coding agent can keep one site for investigation, another for a clean reproduction, and another for verifying a fix, all without depending on visual UI state.

For setup instructions, see Connect AI coding agents to WordPress Playground with MCP. For URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org-based configuration options such as php, wp, networking, and site-slug, see the Query API documentation.

Practical limits

There are a few details to remember:

  • window.playgroundSites is only available after Playground finishes loading saved sites.
  • Temporary sites must be saved before you can rename them, delete them, or update their PHP/networking settings.
  • Call isReady() before getClient() when the active site may still be booting. Until the site is ready, getClient() can return undefined.
  • saveToLocalFileSystem() may open a browser directory picker when you do not pass a directory handle.
  • Browser storage is still browser storage. Clearing site data can remove saved Playground sites.

Try it

Open playground.wordpress.net, wait for the site to finish loading, then open DevTools and run:

await window.playgroundSites.isReady();
window.playgroundSites.list();

From there, create a temporary site, save it, switch between saved sites, and use getClient() to inspect WordPress state with PHP. For plugin and theme developers, this turns Playground from a single sandbox into a small fleet of browser-based test environments.

Playground Meetings Summaries – May 2026

This post covers the two Playground meetings held in May 2026. These are biweekly chats where contributors working on WordPress Playground gather to discuss updates, ongoing work, and plans for current and future releases. All are welcome to join.

Meeting – May 8, 2026

Facilitator: @fellyph

Announcements

Updates by area

Website

Website updates focused on the rollout and refinement of the new <php-snippet> experience. Snippets are now embeddable and editable, with support for expected output and non-runnable examples. The team also reduced loading flicker, fixed execution-related UIUI UI is an acronym for User Interface - the layout of the page the user interacts with. Think ‘how are they doing that’ and less about what they are doing. errors, improved Blueprint URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org handling, updated PR Preview documentation, improved AI discoverability, and refined site-management UXUX UX is an acronym for User Experience - the way the user uses the UI. Think ‘what they are doing’ and less about how they do it..

PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php-WASM

PHP-WASM work focused on making custom PHP extensions a first-class capability. Updates added extension build workflows, manifest improvements, support for additional files, exported symbols needed for extension compilation and loading, and tighter runtime constraints for external extensions. Several runtime fixes also improved stability across Node.js and the web, especially around networking, streaming responses, filesystem mounts, and compilation targets.

Blueprints

Blueprints became more flexible and easier to diagnose. The key improvements were support for PHP-only Playground instances without WordPress, support for .git repository URLs, and better surfacing of pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. activation errors.

SQLite

SQLite-related work focused on compatibility and boot reliability. Updates added support needed for the SQLite WASM extension, fixed boot issues for saved SQLite-backed sites, and registered an updated SQLite build for PHP 5.2 environments.

CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress.

CLI updates focused on reliability, configurability, and developer ergonomics. The team improved test stability, added a worker-thread configuration flag, improved certificate handling for network operations, and cleaned up Xdebug-related output behavior.

Documentation and internationalization

Documentation updates included improvements to the PR Preview button documentation, guidance for using @php-wasm/compile-extension, and changes that improve AI discoverability.

Contributor updates

@fellyph connected with the Plugins team at WordCamp Málaga to discuss ways WordPress Playground could support the plugin review process. Follow-up work included a new Query API for the file browser, documentation about using encodeURIComponent with URL fragments, continued migrationMigration Moving the code, database and media files for a website site from one server to another. Most typically done when changing hosting companies. of the documentation to the Handbook, and a Brazilian Portuguese translation for My WordPress.

My WordPress is also receiving UI updates. The top Playground bar is being removed, configuration is moving to the bottom left, and previous app options are being moved into the About section.

Meeting – May 22, 2026

Facilitator: @fellyph

Announcements

  • A new post is available on the Playground blog: Run PHP examples anywhere with WordPress Playground.
  • @akirk published “Why My WordPress? Personal software needs a home” and is continuing to improve the My WordPress user flow.
  • @zieladam shared an experiment exploring more than 400 WordPress Playground UI redesigns.
  • The Playground badge now counts 60 contributors.
  • Since the previous meeting, 39 pull requests have been merged into the Playground project.

Updates by area

Website

Website changes focused on authentication flow improvements, query and APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. capabilities, documentation, build correctness, and test updates to match newer WordPress behavior.

PHP snippets

PHP snippet work focused on run reliability, UI polish, expected output behavior, documentation, and support for PHP-only or non-runnable snippet modes.

PHP-WASM

PHP-WASM work centered on extension loading, side-module compatibility, browser networking fixes, runtime exports, and package reliability across Node.js and the web.

Blueprints

Blueprint work focused on making configuration steps behave more accurately inside WordPress.

SQLite

SQLite-related work supported extension loading, Markdown and editor integration, and runtime compatibility for native side modules.

CLI

CLI work focused on extension loading, static export tooling, and support for external runtime and editor workflows.

WP-Personal

WP-Personal updates improved app installation UX, dependent-tab behavior, and test stability as external app behavior evolved.

Contributor updates

@fellyph worked on the documentation migration, translation cleanups, MDX components, support for the file browser parameter in Playground, and an investigation into Playground CLI issues. A pull request was also started to add PR Previews to the Plugin Check plugin.

@bpayton continued exploring ways to run real server software in the browser. This work could open up more runtime options for Playground in the future, though there were no specific Playground pull requests to share during this meeting.

Open floor

The team noted that Playground continues to support easier testing for WordPress coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. and related projects. Following the WordPress 7.0 launch that week, contributors were encouraged to share plugins or projects that could benefit from Playground-powered PR Previews. The AI plugin is already using PR Previews as a straightforward way to support testing.

Contributors were also invited to share recent posts about WordPress Playground and to say hello to the team during WordCamp Europe Contributor Day.


The next Playground chat will be on June 26th in the #playground SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/ channel. All are welcome.

wp-now is deprecated: migrate to Playground CLI

@wp-now/wp-now is now deprecated and will not receive future updates. If you use wp-now for local WordPress development, the recommended replacement is @wp-playground/cli. The process took a few months because the Playground team was working to replace all the capabilities from wp-now.

This change is now reflected in the Playground documentation through PR #3767, which documents the migrationMigration Moving the code, database and media files for a website site from one server to another. Most typically done when changing hosting companies. path from wp-now to Playground CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress. and updates the CLI docs to lead with the new start command for familiar wp-now-style workflows. server command still available for more complex workflows.

Why this change

wp-now helped make local WordPress development fast and portable by running WordPress with the Playground runtime, without Docker, MySQLMySQL MySQL is a relational database management system. A database is a structured collection of data where content, configuration and other options are stored. https://www.mysql.com, or ApacheApache Apache is the most widely used web server software. Developed and maintained by Apache Software Foundation. Apache is an Open Source software available for free.. Over the last few years, though, new local development work has moved toward the official Playground CLI.

With the recent implementation of start command, it means the remaining gap has closed: Playground CLI now supports the familiar wp-now behavior and adds more room for customization through the broader WordPress Playground toolchain.

What to use instead

For most local development workflows, use:

npx @wp-playground/cli@latest start

It automatically detects whether the current directory is a pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party., theme, wp-content directory, or full WordPress installation. It also persists the site between runs, enables login, and opens the browser by default.

For lower-level control, use:

npx @wp-playground/cli@latest server

The server command is best when you want to define mounts, storage behavior, versions, Blueprints, or automation explicitly. It is also a better fit for CI and scripted development environments.

Migration guide

Most wp-now commands map directly to @wp-playground/cli start:

wp-nowPlayground CLI
npx @wp-now/wp-now startnpx @wp-playground/cli@latest start
npx @wp-now/wp-now start --path=./plugincd ./plugin && npx @wp-playground/cli@latest start
npx @wp-now/wp-now start --wp=6.8 --php=8.3npx @wp-playground/cli@latest start --wp=6.8 --php=8.3
npx @wp-now/wp-now start --blueprint=./blueprint.jsonnpx @wp-playground/cli@latest start --blueprint=./blueprint.json
npx @wp-now/wp-now start --skip-browsernpx @wp-playground/cli@latest start --skip-browser
npx @wp-now/wp-now start --resetnpx @wp-playground/cli@latest start --reset

1. Replace the package name

If you currently run:

npx @wp-now/wp-now start

Run this instead:

npx @wp-playground/cli@latest start

You do not need to install the package globally. Using npx keeps your workflow on the latest Playground CLI release.

2. Run start from the project directory

The main workflow difference is how saved sites are associated with local paths.

With wp-now, --path=./plugin selected both the project and the saved site. With Playground CLI, start saves the site for the current working directory. For the closest match to wp-now --path, change into the project directory first:

cd ./plugin
npx @wp-playground/cli@latest start

start --path=./plugin still mounts that folder, but the saved site belongs to the directory where the command was run. If you want one persistent site per project, run the command from that project directory.

3. Keep version and Blueprint flags

Common version and Blueprint flags continue to work:

npx @wp-playground/cli@latest start --wp=6.8 --php=8.3
npx @wp-playground/cli@latest start --blueprint=./blueprint.json

Use --skip-browser if you do not want the browser to open automatically:

npx @wp-playground/cli@latest start --skip-browser

Use --reset to delete the stored site and start fresh:

npx @wp-playground/cli@latest start --reset

4. Understand persistence

When Playground CLI creates WordPress for you, start stores the site in:

~/.wordpress-playground/sites/<path-hash>/

The <path-hash> is derived from the command’s current working directory. This keeps projects isolated from one another while preserving the site between CLI runs.

If you run Playground CLI on a full WordPress directory, or mount a directory at /wordpress, that directory becomes the WordPress site and changes are written there instead.

What this means for existing wp-now users

Existing wp-now workflows should move to Playground CLI. The migration is intentionally small for common use cases: replace the package, use start, and run it from the project directory you want to persist.

For more advanced workflows, Playground CLI offers a larger surface area than wp-now, including server, run-blueprint, build-snapshot, custom mounts, and deeper configuration options.

See the updated documentation:

PR Preview with WordPress Playground: What changes in version 3 of the GitHub Action

Reviewing a pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. or theme Pull Request has always carried a bit of friction. To actually test the change, someone had to pull the branch, spin up a local WordPress, and activate the code by hand. That is exactly why the WordPress Playground PR Preview GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the ‘pull request’ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ Action exists: it adds a “Preview in WordPress Playground” button straight to the PR. As a result, any reviewer opens the environment with the code already applied in the browser, without installing anything.

The action already existed in v2. However, version 3 underwent an important simplification: the manual “glue” that each project had to write for builds was replaced by ready-made, reusable workflows. In this post, therefore, I’ll cover what the action does, why it’s worth it, how to set it up in the two possible scenarios, practical examples, and the step-by-step path to migrate from v2.

What the WordPress Playground PR Preview action does

In short, it publishes a preview link on the Pull Request. That link points to a WordPress Playground instance, in other words, a full WordPress running through WebAssembly (WASM) in the browser of whoever clicks it. Playground boots clean, installs the plugin or theme from the PR branch, and automatically activates everything.

The result, then, is a disposable, isolated environment created on demand that mirrors the state of that branch exactly.

Why use it

  • One-click testing: the reviewer needs no local setup and no WordPress installed.
  • Works with forks: external contributions get a preview without exposing repository secrets.
  • Plugin, theme, or both: you can create scenarios that combine several artifacts.
  • Handles complex builds: projects that rely on Composer, npm, or Vite are supported too, through dedicated workflows.
  • Real sandbox: the code runs in the user’s browser, isolated, without touching any server.

Scenario 1: no build step

This is the simplest path. Use it when the files committed to the repository run as-is, without compilation, for example, a plain PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php plugin.

First, create .github/workflows/pr-preview.yml:

name: PR Preview
on:
  pull_request:
    types: [opened, synchronize, reopened, edited]

jobs:
  preview:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: WordPress/action-wp-playground-pr-preview@v3
        with:
          plugin-path: .
          github-token: ${{ secrets.GITHUB_TOKEN }}

For a theme, swap plugin-path: . for theme-path: .. Besides that, the permissions blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. is mandatory: the action needs pull-requests: write to write the link on the PR and contents: read to read the code.

Main inputs of the direct action

InputRequiredDefaultPurpose
plugin-pathone of fourRelative path to the plugin directory
theme-pathone of fourRelative path to the theme directory
blueprintone of fourCustom Blueprint JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. (string)
blueprint-urlone of fourURLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org to a hosted Blueprint
modenoappend-to-descriptionappend-to-description or comment
github-tokenyesToken with PR write access
playground-hostnohttps://playground.wordpress.netBase Playground URL

You provide one of plugin-path, theme-path, blueprint, or blueprint-url. The mode, in turn, decides whether the link goes into the PR description body or as a comment.

Scenario 2: with a build step

When the preview depends on compilation (npm run build, Composer, etc.), v3 uses two workflows that talk to each other. First, one builds the untrusted PR code with read-only permissions. Then, the other publishes the result from the default branch, with write permissions, without ever executing the PR code. The only point of contact between them is the generated ZIP file — and that is precisely what keeps the flow secure.

The build workflow lives in .github/workflows/pr-preview-build.yml:

name: PR Preview - Build
on:
  pull_request:
    types: [opened, synchronize, reopened, edited]

jobs:
  build:
    uses: WordPress/action-wp-playground-pr-preview/.github/workflows/preview-build.yml@v3
    with:
      artifacts: my-plugin=build/my-plugin.zip
      node-version: '20'
      build-command: |
        npm ci
        npm run build:plugin-zip

The publish workflow, in turn, lives in .github/workflows/pr-preview-publish.yml:

name: PR Preview - Publish
on:
  workflow_run:
    workflows: ["PR Preview - Build"]
    types: [completed]

permissions:
  contents: write
  pull-requests: write

jobs:
  publish:
    permissions:
      contents: write
      pull-requests: write
    uses: WordPress/action-wp-playground-pr-preview/.github/workflows/preview-publish.yml@v3
    with:
      kind: plugin

The artifacts field uses the name=path/to/file.zip format — one per line, if you have several. The kind in publish, meanwhile, tells whether the artifact is a plugin or a theme. Besides that, the reusable workflows take care of automatically creating a ci-artifacts prerelease to host the ZIPs publicly. After all, Playground needs to download the asset, so it can’t be in a draft release.

Build workflow inputs

InputRequiredPurpose
artifactsyesname=path.zip entries, one per line
build-commandyesShell commands that produce the ZIPs
node-versionnoRuns actions/setup-node@v4 if set
php-versionnoRuns shivammathur/setup-php@v2 if set
fetch-depthnoPassed to actions/checkout@v4 (default: 1)

Practical example: custom Blueprint

Sometimes you need more than “install and activate”. Say, a plugin from the PR running alongside WooCommerce and already logged in as admin. In that case, use a Blueprint. It’s a JSON recipe that describes the site’s initial state.

- uses: WordPress/action-wp-playground-pr-preview@v3
  with:
    blueprint: |
      {
        "$schema": "https://playground.wordpress.net/blueprint-schema.json",
        "preferredVersions": { "php": "8.3", "wp": "6.6" },
        "steps": [
          { "step": "installPlugin",
            "pluginData": {
              "resource": "git:directory",
              "url": "https://github.com/${{ github.repository }}.git",
              "ref": "${{ github.event.pull_request.head.ref }}",
              "path": "/"
            },
            "options": { "activate": true } },
          { "step": "installPlugin",
            "pluginData": { "resource": "wordpress.org/plugins", "slug": "woocommerce" },
            "options": { "activate": true } },
          { "step": "login", "username": "admin" }
        ]
      }
    github-token: ${{ secrets.GITHUB_TOKEN }}

This Blueprint pins PHP 8.3 and WordPress 6.6, installs the code from the PR branch, adds WooCommerce from the official repository, and hands over an already-logged-in environment. For build scenarios, moreover, you can reference the generated ZIPs inside the Blueprint using the {{ARTIFACT_URL:<name>}} placeholder. That way, v3 resolves the public artifact URL for you.

Migrating from v2 to v3

In practice, the migrationMigration Moving the code, database and media files for a website site from one server to another. Most typically done when changing hosting companies. varies with the complexity of your setup.

Simple plugins and themes (no build): here, almost nothing changes. Switch the action reference from @v2 to @v3 and keep the same inputs.

# works the same in v2 and v3
- uses: WordPress/action-wp-playground-pr-preview@v3
  with:
    plugin-path: .
    github-token: ${{ secrets.GITHUB_TOKEN }}

Projects with a build: this is where the real gain is. On v2 you needed a build workflow, plus manual parsing of the artifact name, plus an expose-artifact-on-public-url helper, plus manual Blueprint generation, and still the manual release publishing. v3, by contrast, replaces all of that with the two reusable workflows (preview-build.yml and preview-publish.yml) shown above. The step-by-step, therefore, looks like this:

  1. Create pr-preview-build.yml with the build workflow template.
  2. Create pr-preview-publish.yml with the publish workflow template.
  3. Define the artifacts in the artifacts field (name=path format).
  4. Set kind: plugin or kind: theme in publish — or, alternatively, use blueprint with {{ARTIFACT_URL:<name>}} placeholders for setups with multiple ZIPs.

Inputs such as artifact-name, artifact-filename, artifact-source-run-id, pr-number, and commit-sha, which existed only for the manual glue, are no longer needed in most cases.

Finally, watch out for the mandatory release cleanup: the change that breaks the most in practice is that draft releases no longer work. After all, Playground can’t download assets from a draft release without authentication. Therefore, if you have ci-artifacts releases in draft, convert them to prerelease or delete them.

Common gotchas

  • 404 error when opening the preview: the release is probably set as a draft instead of a prerelease. Fix it on the repository’s Releases tab.
  • Plugin doesn’t show up as installed: the ZIP must be extracted to a folder named after the slug. Make sure your build does that. For example:
    bash mkdir -p stage/my-plugin && rsync -a ./ stage/my-plugin/ && (cd stage && zip -r ../my-plugin.zip my-plugin)
  • Build failing when comparing against the base: if you use git diff against the base branch, set fetch-depth: 0 in the build workflow. After all, the default checkout brings only the latest commit.
  • Permission error: the permissions block is missing at the workflow or job level.

Conclusion

If you already used v2 for builds, migrating is worth it: you delete dozens of lines of manual glue and get tested, community-maintained workflows in their place. On the other hand, if you don’t use PR preview in your plugin or theme repository yet, the no-build scenario solves it with a few lines of YAML — and noticeably improves the experience for whoever reviews code in your project.

The full documentation lives at wordpress.github.io/action-wp-playground-pr-preview. For the more specific cases, also check the detailed migration guide.

WordPress Playground table at Contributor Day WCEU 2026

The WordPress Playground team is excited to be part of Contributor DayContributor Day Contributor Days are standalone days, frequently held before or after WordCamps but they can also happen at any time. They are events where people get together to work on various areas of https://make.wordpress.org/ There are many teams that people can participate in, each with a different focus. https://make.wordpress.org/support/handbook/getting-started/getting-started-at-a-contributor-day/ at WordCamp Europe 2026, taking place June 4, 2026, at ICE Kraków. Whether you’re a developer, designer, writer, tester, pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. author, translator, marketer, or simply interested in Playground, there will be several ways to get involved.

Read on to find out how to prepare and what to expect at the WordPress Playground table.

Important Times

All times are in Central European Summer Time (CEST).

  • 08:30 – Registration
  • 09:15 – Opening and welcome
  • 10:00 – Contributing to WordPress
  • 12:15 – Group photo
  • 12:30 – Lunch
  • 14:00 – Contributing to WordPress
  • 16:30 – Team summaries and wrap-up

Remote contributors are welcome to join via the #playground and #contributor-day channels on WordPress SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/.

Meet the Table Leads

Playground team will have three team reps during the event, who will be leading the WordPress Playground table:

In-person table leads

Berislav Grgicak (@berislavgrgicak) will also be supporting the Playground table.

Part of the team will be participating remotely throughout the day, answering questions and supporting contributors in the #playground Slack channel.

WordPress Playground Table Focus

There are many ways to contribute to WordPress Playground depending on your background and comfort level.

  • Testing and feedback: Help test Playground features, including PR Previews V3, the new SQLite integration, and tools powered by Playground such as My WordPress.
  • WordPress Studio: Help test the new version of WordPress Studio on Linux and provide feedback on the local development experience.
  • Blueprints: Help plugin developers create their own Blueprints and enable the Live Preview button for their plugins.
  • Documentation: Improve existing docs, suggest new guides, or help make Playground easier to understand for new users and contributors.
  • Translations: Playground documentation is currently available in several languages, and translation contributions are always welcome.
  • Good first issues: New contributors can start with issues labeled Good First Issue.
  • Design, marketing, and product feedback: You don’t need to write code to contribute. Designers, marketers, writers, educators, and site builders can help review the UIUI UI is an acronym for User Interface - the layout of the page the user interacts with. Think ‘how are they doing that’ and less about what they are doing., improve onboarding, suggest new features, and identify opportunities for clearer communication.

A good quote from Jonathan Bossenger(@psykro):

Remember: it’s “Contributor Day,” not “Contribution Day.” The goal is to find meaningful ways to contribute and help move the project forward. Some work may continue after the event, and that’s expected. Open sourceOpen Source Open Source denotes software for which the original source code is made freely available and may be redistributed and modified. Open Source **must be** delivered via a licensing model, see GPL. is iterative.

If you’re not sure where to start, talk to a table lead in person or ask in the #playground Slack channel.

What WordPress Playground Is Building

WordPress Playground lets you run WordPress directly in the browser, without setting up a traditional local server. It helps people test WordPress, try plugins and themes, create demos, review pull requests, and build new contribution workflows with less setup friction.

Some of the key areas contributors may work with include:

  • Playground web instance: The public browser-based Playground available at playground.wordpress.net.
  • Blueprints: JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. files that define how a Playground instance should be configured, including plugins, themes, content, settings, and setup steps.
  • PR Previews: Playground-powered previews that make it easier to test WordPress pull requests directly in the browser.
  • SQLite integration: Ongoing work around improving WordPress support for SQLite-powered environments.
  • Playground CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress.: A Node.js package that allows contributors and developers to run WordPress locally without Docker, MySQLMySQL MySQL is a relational database management system. A database is a structured collection of data where content, configuration and other options are stored. https://www.mysql.com, or ApacheApache Apache is the most widely used web server software. Developed and maintained by Apache Software Foundation. Apache is an Open Source software available for free..
  • WordPress Studio integration: Local development workflows powered by Playground, including ongoing testing for Linux support.
  • Documentation and translations: Contributor-friendly docs that help more people understand and use Playground across different languages and workflows.

You can learn more in the Playground documentation and the dedicated Contributor Day page.

Prepare at Home

To make the most of Contributor Day, please prepare before arriving. Wi-Fi at large events can be unreliable, and many contributors may be cloning repositories or installing dependencies simultaneously.

For most Playground contribution tasks, you will need:

  • A laptop
  • A GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the ‘pull request’ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ account
  • A WordPress.orgWordPress.org The community site where WordPress code is created and shared by the users. This is where you can download the source code for WordPress core, plugins and themes as well as the central location for community conversations and organization. https://wordpress.org/ account
  • GitGit Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git is easy to learn and has a tiny footprint with lightning fast performance. Most modern plugin and theme development is being done with this version control system. https://git-scm.com/ installed
  • Node.js and npm are installed
  • A local copy of the Playground repository

We recommend cloning the Playground repository before Contributor Day:

github.com/wordpress/playground

Docker and Composer are not required for most Playground Contributor Day tasks.

If you want to work with plugin demos or Live Preview support, it may also help to review the Playground Step Library before the event.

Helpful Resources

Looking Ahead

At WCEU Contributor Day, we’ll focus on testing new features, improving documentation, supporting plugin developers with Blueprints and Live Preview, reviewing the user experience, and helping new contributors find their first meaningful contribution.

Contributors whose pull requests are merged may also be eligible for the WordPress Playground contributor badge on their WordPress.org profile. If you’re interested in Playground but unsure where to begin, join us at the Playground table or ask in the #playground Slack channel.

Run PHP examples anywhere with WordPress Playground

WordPress Playground is expanding beyond full WordPress sites. A recent set of changes makes Playground a useful lightweight PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php runtime for documentation, tutorials, examples, and shareable demos.

The headline feature is the new <php-snippet> web component. It lets you embed runnable PHP examples in any web page with one script tag. Readers can edit the code, click Run, see the output in place, and experiment without installing PHP, configuring a server, or leaving the page.

This opens up a new way to teach WordPress and PHP APIs: examples can now be both readable and executable.

What changed

In an HTMLHTML HTML is an acronym for Hyper Text Markup Language. It is a markup language that is used in the development of web pages and websites. page, such as index.html, the new snippet embed is loaded from Playground:

<!-- index.html -->
<script
    type="module"
    src="https://playground.wordpress.net/php-code-snippet.js"
></script>

<php-snippet name="hello.php">
    <script type="application/x-php">
<?php
echo "Hello from PHP " . phpversion();
    </script>
</php-snippet>

This example is meant to be served as HTML, not evaluated as PHP on the server. If you paste the same markup into a .php template, the server-side PHP interpreter will see the raw <?php opening tag before the browser does. In that case, escape the opening tag as &lt;?php, load the snippet from an external file with src, or otherwise make sure the browser receives the PHP code as literal text.

The component renders an editable, syntax-highlighted code blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. with a Run button. When the reader clicks Run for the first time, Playground lazy-loads the runtime in a hidden iframeiframe iFrame is an acronym for an inline frame. An iFrame is used inside a webpage to load another HTML document and render it. This HTML document may also contain JavaScript and/or CSS which is loaded at the time when iframe tag is parsed by the user’s browser., runs the PHP, and displays the output below the snippet.

Multiple snippets on the same page can share the same runtime. That means a tutorial can include several examples without downloading and booting a separate PHP environment for each one.

WordPress APIs work too

By default, snippets run inside a real WordPress environment. That means examples can call WordPress APIs, not only plain PHP functions.

For example, a documentation page can demonstrate the HTML APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.:

<php-snippet name="lazy-load-images.php">
    <script type="application/x-php">
<?php
require '/wordpress/wp-load.php';

$html = '<article>
    <img src="hero.jpg" alt="Hero">
    <img src="inline.jpg" alt="Inline">
</article>';

$tags = new WP_HTML_Tag_Processor( $html );
while ( $tags->next_tag( 'img' ) ) {
    $tags->set_attribute( 'loading', 'lazy' );
    $tags->add_class( 'responsive' );
}

echo $tags->get_updated_html();
    </script>
</php-snippet>

That changes the role of code examples in WordPress documentation. Instead of asking readers to copy code into a local site, the example can run where they are already reading.

PHP-only mode

Not every example needs WordPress. For plain PHP language features, snippets can skip the WordPress download entirely:

<php-snippet name="just-php.php" wp="none">
    <script type="application/x-php">
<?php
echo "PHP " . phpversion() . "\n";
echo "WordPress installed: " .
    ( file_exists( '/wordpress/wp-includes/version.php' ) ? 'yes' : 'no' );
    </script>
</php-snippet>

Under the hood, this maps to the new Blueprint option:

{
    "preferredVersions": {
        "php": "latest",
        "wp": false
    }
}

When preferredVersions.wp is false, Playground boots PHP without downloading or installing WordPress. WordPress-specific Blueprint fields and steps are rejected, which keeps PHP-only examples explicit and predictable.

From demo page to documentation guide

The snippets work also moves beyond the original test/demo page. The PHP snippets guide is becoming the canonical reference for this feature, with live-rendered examples alongside copyable code.

That matters because the guide can show the feature in the same shape that authors will use it: basic embeds, precomputed output, selector-based snippets, WordPress snippets, pure PHP snippets, and option-by-option usage. The old demo page redirects readers to the guide, and the component’s attribution link points there too.

How to use it

Add the module script once on the page, then place each example in a <php-snippet> element. The recommended pattern is to put PHP inside a child <script type="application/x-php"> element when the surrounding document is HTML, MDX, or another format that will deliver the PHP code to the browser unchanged:

<php-snippet name="site-title.php">
    <script type="application/x-php">
<?php
require '/wordpress/wp-load.php';

update_option( 'blogname', 'Snippet Docs' );
echo get_bloginfo( 'name' );
    </script>
    <script type="text/expected-output">
Snippet Docs
    </script>
</php-snippet>

The application/x-php wrapper is useful because browsers ignore unknown script types. That lets authors include PHP strings containing HTML without escaping every < character.

For very short examples, inline text works too, but the PHP opening tag must be escaped:

<php-snippet name="sum.php" expected-output="42">
    &lt;?php echo 20 + 22;
</php-snippet>

Show output before Run

Use expected output when you want the result visible immediately. The placeholder is replaced by the real runtime output after the reader clicks Run.

<php-snippet name="precomputed.php">
    <script type="application/x-php">
<?php
echo "2 + 2 = " . ( 2 + 2 );
    </script>
    <script type="text/expected-output">
2 + 2 = 4
    </script>
</php-snippet>

For one-line output, use the expected-output attribute:

<php-snippet name="ready.php" expected-output="Ready">
    <script type="application/x-php">
<?php echo "Ready";
    </script>
</php-snippet>

Prepare examples with a Blueprint

Use blueprint when snippets need to be set up before the PHP code runs. The Blueprint can create files, add a mu-pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party., configure options, install plugins, or prepare sample content.

<script id="setup-blueprint" type="application/json">
{
    "steps": [
        {
            "step": "writeFile",
            "path": "/wordpress/wp-content/mu-plugins/helpers.php",
            "data": "<?php\nfunction docs_greet($name) { return 'Hello, ' . $name; }\n"
        }
    ]
}
</script>

<php-snippet name="greeting.php" blueprint="setup-blueprint">
    <script type="application/x-php">
<?php
require '/wordpress/wp-load.php';
echo docs_greet( 'Ada' );
    </script>
    <script type="text/expected-output">
Hello, Ada
    </script>
</php-snippet>

The blueprint attribute accepts an element id or a CSSCSS CSS is an acronym for cascading style sheets. This is what controls the design or look and feel of a site. selector. Use <script type="application/json"> for the Blueprint because its contents are treated as raw text, which keeps embedded PHP strings predictable.

Load PHP from another file

Use src when the PHP source should live in a separate file:

<php-snippet
    name="external-example.php"
    src="/snippets/external-example.php"
    expected-output="Loaded from an external file"
></php-snippet>

The URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org resolves from the page that contains the snippet. If the PHP file is hosted on another origin, that server needs to allow cross-origin access. Use a Blueprint instead when the example needs support files, plugins, options, or other setup.

Pin versions or self-host the runtime

The default PHP version is 8.4, and the default WordPress version is latest. Use the php and wp attributes when the example depends on a specific version:

<php-snippet name="wp-version.php" php="8.4" wp="6.8">
    <script type="application/x-php">
<?php
require '/wordpress/wp-load.php';
echo get_bloginfo( 'version' );
    </script>
</php-snippet>

Most pages should use the hosted runtime from https://playground.wordpress.net. For local development, self-hosting, or pinned infrastructure, use playground-origin:

<php-snippet
    name="local-runtime.php"
    playground-origin="http://localhost:5400"
>
    <script type="application/x-php">
<?php
echo phpversion();
    </script>
</php-snippet>

More control for authors

The snippet component includes a few authoring tools that make it practical for real documentation:

  • Snippets are editable by default, so readers can change the code before running it.
  • Use Ctrl+Enter or Cmd+Enter to run a focused editable snippet from the keyboard.
  • Use readonly for runnable examples that should stay locked.
  • Use editable="false" as a compatibility alias for older examples that already use that pattern.
  • Use src to load PHP from a separate file.
  • Use expected-output or a <script type="text/expected-output"> child to show expected output before the reader clicks Run.
  • Use runnable="false" for syntax-highlighted examples that should not execute.
  • Use php and wp attributes to choose the PHP and WordPress versions for a snippet.
  • Use a shared Blueprint when multiple snippets need the same setup, such as a mu-plugin, site option, or file.

That last point is especially useful for longer tutorials. A page can define one JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. Blueprint and point several snippets at it. Playground boots the shared environment once, then each snippet runs against the same prepared runtime.

Runtime sharing and troubleshooting

The first run clicks on a page, loads the Playground client, creates a hidden iframe, boots PHP, and installs WordPress unless the snippet uses wp="none". Later runs reuse an existing runtime when playground-origin, php, wp, and the resolved Blueprint JSON all match.

That sharing keeps related snippets fast while still isolating examples that need a different PHP version, WordPress version, or setup Blueprint.

If a snippet does not render, check that the module script is loaded and that the browser supports custom elements. If Run never finishes, open DevTools and look for failed requests to remote.html, PHP .wasm files, WordPress zip files, Blueprint resources, or cross-origin src files.

Sites with a strict Content Security Policy need to allow the module script and hidden iframe from https://playground.wordpress.net, plus the runtime assets that Playground downloads. For stricter environments, self-host the snippet script and point playground-origin at that deployment.

Standalone PHP Playground

For full-page examples, Playground also includes a standalone PHP editor:

playground.wordpress.net/php-playground.html

It provides a side-by-side editor and preview with PHP and WordPress version selectors. The current code and version choices are encoded in the URL fragment, so examples can be shared as links or embedded in an iframe.

Use the standalone editor for a single larger demo. Use <php-snippet> when a post, handbook page, or tutorial needs several small runnable examples inline.

Why this matters

Runnable snippets make Playground useful in a new layer of the WordPress learning experience.

For doc authors, it reduces the gap between explanation and verification. A reader can run the example immediately.

For contributors, it creates a low-friction way to demonstrate WordPress APIs, PHP behavior, Blueprint setup steps, or bug reproductions.

For learners, it removes the setup barrier. They can try PHP and WordPress code in the browser first, then move to a local environment when they are ready.

This also broadens the meaning of Playground. It is still a full WordPress runtime in the browser, but it can now act as a small, embeddable PHP execution layer for the web.

Try it and share feedback

Try the snippet embed in a local HTML file, a documentation page, or a tutorial draft:

<script
    type="module"
    src="https://playground.wordpress.net/php-code-snippet.js"
></script>

For deeper examples, see the new PHP snippets guide in the Playground documentation:

PHP code snippets and embeds

Feedback is welcome in the #playground channel on Making WordPress Slack or in the WordPress Playground GitHub repository.

Playground Meetings Summaries – April 2026

This post covers the two Playground meetings held in April 2026. These are biweekly chats where contributors working on WordPress Playground gather to discuss updates, ongoing work, and plans for current and future releases. All are welcome to join.

Meeting – April 10, 2026

Facilitator: @fellyph

Announcements

  • WordCampWordCamp WordCamps are casual, locally-organized conferences covering everything related to WordPress. They're one of the places where the WordPress community comes together to teach one another what they’ve learned throughout the year and share the joy. Learn more. Asia 2026 was still running during the meeting. Talks were available via livestream. Thanks to @dilipmodhavadiya, @gauravbhai, @rimaprajapati, @shailmehta, and @arslan for joining the Contributor DayContributor Day Contributor Days are standalone days, frequently held before or after WordCamps but they can also happen at any time. They are events where people get together to work on various areas of https://make.wordpress.org/ There are many teams that people can participate in, each with a different focus. https://make.wordpress.org/support/handbook/getting-started/getting-started-at-a-contributor-day/ table.
  • @Bero published a new Agent Skill to help coding agents write Blueprints. Read the announcement: Teach your coding agent to write WordPress Playground Blueprints.
  • The Playground team has started the process to migrate the documentation to the WordPress.orgWordPress.org The community site where WordPress code is created and shared by the users. This is where you can download the source code for WordPress core, plugins and themes as well as the central location for community conversations and organization. https://wordpress.org/ Handbook format. Read the announcement: Migrating WordPress Playground Documentation to WordPress.org.
  • Two new contributors received the Playground badge, bringing the total to 55 contributors.
  • Since the last meeting, through April 10, 2026, 19 pull requests have been merged, with several others still under review.

Updates by area

PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php-WASM and Xdebug
Improvements to the PHP.wasm tooling, including AI-friendly build documentation and enhanced Xdebug support. Critical Node.js host crashes caused by closed streams were fixed. phpMyAdmin and Adminer were upgraded to support PHP 8.5 and now read SQLite settings directly from the WordPress configuration rather than from hardcoded paths.

CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress.
Recent CLI updates improved stability and configuration flexibility. An intermittent boot crash caused by directory mount conflicts was fixed, along with a false database error reported by users running an external MySQLMySQL MySQL is a relational database management system. A database is a structured collection of data where content, configuration and other options are stored. https://www.mysql.com. Developers can now override WP_DEBUG settings using boolean or numeric values, and beta is now accepted as a valid WordPress version slug.

Playground website
Updates introduced a global site management APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways., enabled browser-native AI interaction through WebMCP, and clarified the error messages shown when a PR preview has expired.

Documentation
The migrationMigration Moving the code, database and media files for a website site from one server to another. Most typically done when changing hosting companies. to the Handbook is underway. Current work focuses on making the existing Markdown content compatible with the WordPress Handbook format.

Internationalization
New translations landed for Japanese and Bengali.

SQLite
Database handling improvements prevent unexpected wp-config.php rewrites. The SQLite build scripts were also adapted to support the new monorepo structure.

Contributor updates

@fellyph — Worked on recent posts and documentation, fixed the issue with the beta flag in the WordPress CLI, and submitted a fix for the preview button in the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. AI pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. after spotting an issue while testing it. Also identified several documentation improvements while preparing the talk for WordCamp Asia.

@zieladam — Finalizing site importing for WordPress, with plans to start integrating it shortly with other tools, including WP-CLI, Playground web, and possibly Playground CLI.

@bpayton — Focused on Playground CLI performance improvements and reviewing pull requests. There is still a backlog of pull requests awaiting review.

@janjakes — Preparing a new major version release of the SQLite integration, along with new features coming soon to Playground web.

@ydecat — Cleaning up a package that is no longer needed, making room for new packages. Also working on improving the generation of package.json files across the project, with Xdebug usage examples next on the list and a possible exploration of bringing Xdebug to PHP.wasm Web.

Closing

A recurring piece of feedback heard at WordCamp Asia was about the recent stability and performance improvements in Playground. Thanks to everyone for keeping that work moving.

Meeting – April 24, 2026

Facilitator: @fellyph

Announcements

  • From April 10, 2026, through April 24, 2026, 35 pull requests were merged. The Playground badge now counts 57 community members.
  • The documentation migration to the Handbook is ongoing, with several important pull requests merged this week.
  • WordCamp Europe is coming up, and the team is looking for community members to co-lead the Playground table. If you are interested, send a direct message to @fellyph.

Updates by area

Website
The main activity focused on improving the site-management UIUI UI is an acronym for User Interface - the layout of the page the user interacts with. Think ‘how are they doing that’ and less about what they are doing., restoring browser compatibility, fixing a tricky Safari cross-origin bug, and re-enabling media processing that had been disabled as a workaround.

PHP-WASM
A highly active period for the PHP runtime layer. PHP 5.2 support was added, and several crash bugs were fixed (MEMFS symlinks, gzip/zlib, and TSRMLS_CC). The node-polyfills package was removed as a cleanup, and the bundler documentation was improved.

Blueprints
Activity was mostly documentation and internationalization. The Blueprint bundles reference page was updated, and Bengali and Gujarati translations of the Blueprint tutorial pages were added.

SQLite
One merged pull request shifted the scheduled refresh of the SQLite integration to a different time slot to avoid conflicts.

CLI
Several quality-of-life improvements landed: a new --workers flag, a fix for --no-auto-mount, a test parallelism pin to prevent flaky CI, restored missing mount specs, and Xdebug usage examples.

Documentation and i18n
Improvements continued on making the docs compatible with the WordPress Handbook, including updates around Asyncfy and the overlay property implemented by @bph. New translations landed in Gujarati, Portuguese, Spanish, and French.

Thanks to @shailmehta, @shimomura, @béryl, @ydecat, and @nilovelez for the translation contributions.

Contributor updates

@fellyph — Worked on the documentation migration to the Handbook, updating several pages in English and Portuguese. Reviewed pull requests for the Blueprints library and created an About page for My WordPress in Portuguese.

@zieladam — No major updates this week, except for a new SQLite extension that treats Markdown files as tables. It could make a nice tool for editing Markdown with WordPress.

@mosescursor — Recently focused on organizing WordCamp Asia and contributing to other teams. Now available to contribute to Playground again.

@janjakes — On the SQLite side, tagged 3.0.0-rc.1 and 3.0.0-rc.2 with the following improvements:

  • Remove legacy SQLite driver (#358)
  • Improve concurrent database access (#361)
  • Support MySQL BINARY operator (#369)
  • Add support for AUTO_INCREMENT value management (#367)
  • Add support for DELETE with LIMIT and ORDER BY (#365)
  • Add Query Monitor 4.0 support (#357)
  • Translate MySQL CONVERT() expressions to SQLite (#356)

@bpayton — Exploring a Wasm-based kernel to run Playground in the browser on top of traditional server software, such as nginxNGINX NGINX is open source software for web serving, reverse proxying, caching, load balancing, media streaming, and more. It started out as a web server designed for maximum performance and stability. In addition to its HTTP server capabilities, NGINX can also function as a proxy server for email (IMAP, POP3, and SMTP) and a reverse proxy and load balancer for HTTP, TCP, and UDP servers. https://www.nginx.com/., PHP-FPM, and MariaDB. Early results are promising. The goal is to have a query parameter that switches playground.wordpress.net between the current PHP-WASM runtime and the kernel-based runtime. More to share next time.


The next Playground chat will be announced in the #playground SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/ channel. All are welcome.

Teach your coding agent to write WordPress Playground Blueprints

The new blueprint agent skill teaches your coding agent the Playground Blueprint schema, which defines valid property names, resource types, and step sequencing. No more pluginZipFile instead of pluginData. No more runPHP steps missing require '/wordpress/wp-load.php'.

Install it once, and your agent generates valid Blueprint JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. with a high success rate, and the best part of it all with natural language. That is perfect for testing new ideas, finding edge cases in your Plugins and Themes, and creating demos from your projects.

What the blueprint skill does

The skill is a structured Markdown reference that your coding agent loads into its context. It covers:

  • Every top-level property: landingPage, preferredVersions, features, steps, shorthands (login, plugins, siteOptions, constants)
  • All resource types: wordpress.org/plugins, wordpress.org/themes, url, git:directory, literal:directory, bundled
  • Step reference: installPlugin, writeFile, writeFiles, runPHP, wp-cli, runSql, and more
  • Common mistakes: a table of pitfalls the agent checks against before generating output
  • Blueprint bundles: self-contained packages with bundled resources

The agent reads this reference before writing any Blueprint. Instead of guessing property names, it follows the documented schema.

How to install the skill

For a quick install, use the npx skills CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress. to add the blueprint skill to your project:

npx skills add wordpress/agent-skills --skill blueprint

Or install manually by cloning the agent-skills repository and running the build script:

git clone https://github.com/WordPress/agent-skills.git
cd agent-skills
node shared/scripts/skillpack-build.mjs --clean
node shared/scripts/skillpack-install.mjs --dest=../your-wp-project --targets=claude,gemini,codex,cursor,vscode

The skill works with Claude Code, Gemini CLI, GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the ‘pull request’ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ Copilot, Cursor, and Codex.

Five examples

Each example below shows a prompt you give your agent and the Blueprint it produces. These are real-world scenarios where the blueprint skill prevents common errors.

1. Quick development environment

Prompt:

Create a Blueprint that sets up a development environment with
debug mode, the Developer plugin, and landing on the admin dashboard.

Generated Blueprint:

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/wp-admin/",
  "preferredVersions": { "php": "8.3", "wp": "latest" },
  "features": { "networking": true },
  "constants": {
    "WP_DEBUG": true,
    "WP_DEBUG_LOG": true
  },
  "login": true,
  "plugins": ["developer"],
  "steps": []
}

Notice how the agent uses the constants shorthand instead of a defineWpConfigConsts step, and login: true instead of a separate login step. The skill teaches agents to pick shorthands for simple cases and explicit steps when order matters.

WordPress Admin panel showing the Developer plugin enabled via blueprint

2. PluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. from a GitHub branch

Prompt:

Write a Blueprint that installs my plugin from the feature/checkout-v2
branch on GitHub and activates it.

Generated Blueprint:

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/wp-admin/plugins.php",
  "preferredVersions": { "php": "8.3", "wp": "latest" },
  "steps": [
    { "step": "login" },
    {
      "step": "installPlugin",
      "pluginData": {
        "resource": "git:directory",
        "url": "https://github.com/your-org/your-plugin",
        "ref": "feature/checkout-v2",
        "refType": "branch",
        "path": "/"
      },
      "options": { "activate": true }
    }
  ]
}

Without the skill, agents commonly omit refType, which causes git:directory to fail for branch names. The skill’s common mistakes table flags this explicitly: “Omitting refType with branch/tag ref — required; only HEAD works without it.”

3. WooCommerce store with sample products

Prompt:

Create a Blueprint for a WooCommerce store with 5 sample products
across 2 categories, running on PHP 8.2.

Generated Blueprint:

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/shop/",
  "preferredVersions": { "php": "8.2", "wp": "latest" },
  "features": { "networking": true },
  "steps": [
    { "step": "login" },
    {
      "step": "installPlugin",
      "pluginData": { "resource": "wordpress.org/plugins", "slug": "woocommerce" },
      "options": { "activate": true }
    },
    {
      "step": "runPHP",
      "code": "<?php\nrequire '/wordpress/wp-load.php';\n\n// Create categories\n$cat_clothing = wp_insert_term('Clothing', 'product_cat');\n$cat_accessories = wp_insert_term('Accessories', 'product_cat');\n\n$products = [\n  ['T-Shirt', 29.99, $cat_clothing['term_id']],\n  ['Hoodie', 59.99, $cat_clothing['term_id']],\n  ['Jeans', 49.99, $cat_clothing['term_id']],\n  ['Watch', 89.99, $cat_accessories['term_id']],\n  ['Backpack', 39.99, $cat_accessories['term_id']]\n];\n\nforeach ($products as [$title, $price, $cat_id]) {\n  $post_id = wp_insert_post([\n    'post_title' => $title,\n    'post_type' => 'product',\n    'post_status' => 'publish'\n  ]);\n  update_post_meta($post_id, '_regular_price', $price);\n  update_post_meta($post_id, '_price', $price);\n  wp_set_object_terms($post_id, [$cat_id], 'product_cat');\n}\n"
    }
  ]
}

The skill ensures the agent includes require '/wordpress/wp-load.php' at the top of every runPHP step. Without this line, all WordPress functions fail silently — a mistake agents make frequently without the skill reference.

WordPress Playground Loading a store with 5 products in a woo store.

4. Inline mu-plugin for custom behavior

Prompt:

Write a Blueprint that disables the admin bar and adds a custom
dashboard widget showing the server's PHP version.

Generated Blueprint:

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/wp-admin/",
  "preferredVersions": { "php": "8.3", "wp": "latest" },
  "steps": [
    { "step": "login" },
    {
      "step": "writeFile",
      "path": "/wordpress/wp-content/mu-plugins/custom-dashboard.php",
      "data": "<?php\nadd_filter('show_admin_bar', '__return_false');\n\nadd_action('wp_dashboard_setup', function() {\n  wp_add_dashboard_widget(\n    'php_version_widget',\n    'PHP Version',\n    function() {\n      echo '<p>Running PHP ' . phpversion() . '</p>';\n    }\n  );\n});"
    }
  ]
}

The agent uses writeFile to create a mu-plugin, which loads automatically without activation. The skill explicitly documents this pattern and warns agents not to add require wp-load.php inside mu-plugin code (that line is only needed in runPHP steps).

5. Blueprint bundle with a custom plugin

Prompt:

Create a Blueprint bundle that installs a custom analytics plugin
from a local zip file.

Generated bundle structure:

analytics-bundle/
├── blueprint.json
└── analytics-plugin.zip

blueprint.json:

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/wp-admin/plugins.php",
  "preferredVersions": { "php": "8.3", "wp": "latest" },
  "steps": [
    { "step": "login" },
    {
      "step": "installPlugin",
      "pluginData": {
        "resource": "bundled",
        "path": "/analytics-plugin.zip"
      },
      "options": { "activate": true }
    }
  ]
}

Run it locally:

npx @wp-playground/cli server --blueprint=./analytics-bundle/ --blueprint-may-read-adjacent-files

The --blueprint-may-read-adjacent-files flag is required for directory bundles. Without it, any bundled resource reference fails with a “File not found” error. The skill documents this gotcha, so agents include the flag automatically.

How the blueprint skill fits with other tools

The blueprint skill works alongside two other Playground tools for AI agents:

ToolWhat it doesWhen to use it
Blueprint skillGenerates valid Blueprint JSONWhen you need a Blueprint file for sharing, version control, or CI
wp-playground skillRuns CLI commands, manages servers, debugs instancesWhen you need a running Playground instance with live interaction
MCP serverConnects agents directly to a browser PlaygroundWhen you need real-time PHPPHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/index.php execution and file manipulation

Use the blueprint skill when you want a portable, reproducible configuration. Use the wp-playground skill when you need a running server. Combine them: generate a Blueprint with the blueprint skill, then launch it with the wp-playground skill’s CLI commands.

Test your Blueprints

Inline URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org (quick test)

Minify the Blueprint JSON and append it to the Playground URL:

https://playground.wordpress.net/#{"preferredVersions":{"php":"8.3","wp":"latest"},"steps":[{"step":"login"}]}

Local CLI (full test)

# Start a server with your Blueprint
npx @wp-playground/cli server --blueprint=./blueprint.json

# Headless validation (runs and exits)
npx @wp-playground/cli run-blueprint --blueprint=./blueprint.json

Get started

Install the blueprint skill in your project:

npx skills add wordpress/agent-skills --skill blueprint

Then ask your agent to write a Blueprint. Describe what you need: plugins, themes, content, configuration, and the agent produces valid JSON that runs on the first try.

Share what you build in the #playground channel on Making WordPress Slack or open an issue on GitHub.

#agent-skills, #ai