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.

Help Us Test the New WordPress Playground UI!

The playground team has been working on a brand-new interface for WordPress Playground, and we would love your help testing it before it officially launches. Whether you are using a laptop or a mobile phone, we want to know how the new 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. feels, responds to, and works with your clicks and taps.

Image

You do not have to test everything. Pick one or two modules below, explore them, and tell us what worked well or what could be improved.

🔗 Test environment: Open the new Playground UI

What We Are Looking For

While testing, please pay attention to:

  • Clear text: Are buttons, labels, descriptions, and instructions easy to understand?
  • Logical mechanics: Do workflows behave as you expect? Is it clear what each action will do?
  • Design issues: Do you see overlapping text, clipped content, missing controls, or broken layouts?
  • Helpful feedback: What feature or small change would make the experience smoother?

Testing on Desktop and Mobile

If possible, try the UI in both a desktop browser and a mobile browser.

On mobile:

  • Swipe the bottom toolbar horizontally to find tools that are not currently visible, such as Files, Logs, or Export.
  • Tool panels open over the site. Use the X button to close a panel.
  • In the Files panel, tap Browse files to open the file tree.
  • Use the file upload control instead of drag and drop.

Please do not upload private files, passwords, 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. keys, or other sensitive information while testing.

Choose Your Testing Adventure

Module 1: Create and Manage Playgrounds

A good starting point for a five-minute test.

  1. Open the test environment and wait for the initial Playground to finish loading. A Playground is created automatically when the page opens.
  2. Select New in the bottom toolbar.
  3. In the Blueprint gallery, select Vanilla WordPress. Selecting the card immediately creates a fresh Playground.
  4. Open Site details. Change the WordPress version or 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, then select Create a fresh Playground. Verify that the new Playground uses the selected versions.
  5. In Site details, select Rename Playground and give it a recognizable name. You can also rename it from Playgrounds → Actions (⋮) → Rename.
  6. Open Playgrounds, open the current Playground’s Actions (⋮) menu, and select Save in browser storage. Confirm that its status changes from an autosave to a permanently saved Playground.
  7. Refresh the browser. Open Playgrounds, find the site under Saved, and open it again. Saved Playgrounds and Recent autosaves are listed separately.
  8. Open the saved Playground’s Actions (⋮) menu, select Delete, and confirm the deletion.

Note: Autosaves are periodic snapshots and may not include every recent change. Use Save in browser storage when you want to keep a Playground.

What to look out for:

  • Did the initial and fresh Playgrounds load successfully?
  • Was it clear that changing a version creates a fresh Playground?
  • Were rename, save, restore, and delete actions easy to find?
  • After refreshing, was the difference between Recent autosaves and
    Saved clear?
  • Could you reach every action comfortably on mobile?

Module 2: The Blueprint Experience

Test the different ways to start and inspect a custom setup.

  1. Select New → Blueprint gallery.
  2. Search or browse the gallery and read the descriptions shown on the cards.
  3. Select a Blueprint card. The card launches a fresh Playground immediately, so there is no separate details screen.
  4. After it loads, open Blueprint in the bottom toolbar to inspect its blueprint.json file.
  5. Select New → Blueprint URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org, enter a publicly accessible Blueprint URL, and select Create Playground.
  6. Select New → Write a Blueprint, edit the example 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., and select Create Playground.
  7. To keep the resulting site, use Playgrounds → Actions (⋮) → Save in browser storage. To download the Blueprint itself, open Blueprint and select Export.

Be careful: In an editable autosaved Playground, Run Blueprint and reset site recreates the Playground and replaces its files. In a permanently saved Playground, the Blueprint editor is read-only.

What to look out for:

  • Was the gallery easy to browse and search?
  • Was it clear that selecting a card would immediately create a Playground?
  • Did the Blueprint URL and raw JSON workflows show useful validation and error messages?
  • Was the difference between saving a Playground and exporting a Blueprint clear?
  • Did the selected Blueprint finish without crashing?

Module 3: Files, Database, and Logs

Test the developer tools.

  1. Launch a Playground and open Files.
  2. On mobile, select Browse files to reveal the file tree.
  3. Try Create new folder and Create new file. Enter a name, confirm it, and verify that the item remains visible after you select something else.
  4. Open a harmless file such as readme.html, or use the test file you just created. Add a short comment, select Save file, reopen the file, and confirm that the change remains. Avoid editing wp-config.php for this test.
  5. Use Upload files to upload a small, non-sensitive test file. On desktop, you may also try dragging a test file into the file manager and report whether that works.
  6. Open Database. Select Open Adminer or Open phpMyAdmin, then browse a table without changing its data. If the viewer cannot install or reports a download/fetch error, include the exact error in your feedback.
  7. Open Logs. Confirm that you see either a clear Nothing logged yet state or relevant PHP, WordPress, and Playground messages. If you are comfortable doing so, trigger a harmless warning in a test file and check whether it appears.

What to look out for:

  • Did newly created files and folders persist after focus moved elsewhere?
  • Was the editor comfortable to use with a mobile keyboard?
  • Were save and upload results clearly communicated?
  • Did Adminer or phpMyAdmin open successfully? Were installation errors useful?
  • Did the Logs panel clearly explain an empty state and distinguish message types?

Module 4: Import, Export, and Sharing

Test how Playground data moves between environments.

  1. In an active Playground, open Export.
  2. Under Download a copy, select Download as .zip. The ZIP should contain the current files, database, and edits.
  3. Select New → Import zip → Choose a .zip file… and import the ZIP you just downloaded.
  4. After the imported Playground loads, check that its pages, settings, files, and content were restored.
  5. Open Export and select Copy link. Paste the result somewhere safe and verify that it is a usable URL. Important: This link recreates the original Blueprint setup only. It does not include later edits to files or content.
  6. Optionally, test Export to 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/ using a disposable repository you can modify safely. Connect your GitHub account and try exporting 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, or wp-content directory. The GitHub connection is not retained after a browser refresh.

👀 What to look out for:

  • Did ZIP creation finish in a reasonable time?
  • Did importing the ZIP restore the current site accurately?
  • Did the UI clearly explain what the copied link includes and excludes?
  • Were clipboard permission errors understandable?
  • Was the scope of the GitHub export clear before anything was pushed?
  • Were success, progress, and error messages helpful?

How to Share Your Feedback

Found a bug or have an idea for a better workflow? Please include:

  • Your device, operating system, and browser.
  • The module and step you tested.
  • The steps needed to reproduce the problem.
  • What you expected to happen and what actually happened.
  • Your thoughts on text clarity, mechanics, and visual design.
  • Screenshots or short screen recordings, when possible.

Remove private information, access tokens, repository secrets, and personal files from screenshots or recordings before posting them.

👉 Share feedback, bugs, and ideas in the official GitHub issue:

New Dock UI review — Issue #4092

You will need to sign in to GitHub to post a comment.

Thank you for helping us make WordPress Playground better for everyone. Happy testing! 🚀

X-post: WordPress Credits Updates

X-comment from +make.wordpress.org/project: Comment on WordPress Credits Updates

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.