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.

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.

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

Connect AI coding agents to WordPress Playground with MCP

What if your coding agent could read WordPress files, execute 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, and manage sites directly in your browser? The @wp-playground/mcp package bridges AI coding agents and a browser-based Playground instance through the Model Context Protocol (MCP). Run one command to connect. No configuration needed in Playground.

How it works

The MCP server runs as a local Node.js process using stdio transport. Your AI client communicates with it directly, and the server forwards commands to a Playground instance running in your browser through a WebSocket connection.

AI Client (stdio) --> MCP Server (Node.js) --> WebSocket --> Browser (Playground)

When you open Playground in your browser, a WebSocket links the browser tab to the MCP server. The server assigns a random local port at startup and passes it to the browser through the URLURL A specific web address of a website or web page on the Internet, such as a websiteโ€™s URL www.wordpress.orgโ€™s mcp-port parameter. The server translates your agentโ€™s tool calls into direct Playground actions: reading files, executing PHP, and navigating pages.

The connection stays local to your machine. Origin restrictions and token-based authentication at startup prevent unauthorized access from other sites and browser extensions.

Set up the MCP server

Claude Code

claude mcp add --transport stdio --scope user wordpress-playground -- npx -y @wp-playground/mcp

The --scope user flag makes the server available across all your projects. Use --scope local to restrict it to the current project only.

Codex

Codex supports stdio MCP servers through the codex mcp command. Add WordPress Playground as a user-level MCP server with:

codex mcp add wordpress-playground -- npx -y @wp-playground/mcp

Then ask Codex to open the Playground site. The MCP server provides the exact Playground URL when it connects, including the local mcp-port parameter needed to link the browser tab to the MCP server.

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. configuration

You can also configure the server manually. Add this to your .mcp.json (Claude Code / Claude Desktop):

{
    "mcpServers": {
        "wordpress-playground": {
            "type": "stdio",
            "command": "npx",
            "args": ["-y", "@wp-playground/mcp"]
        }
    }
}

After setup, open Playground in your browser. The agent provides the exact URL when it connects.

Three practical workflows

Once connected, your agent manages WordPress through natural language.

1. Install, test and build 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.

Ask your agent to install and verify a plugin without touching the WordPress admin:

โ€œInstall the Classic Editor plugin on my Playground site and confirm it deactivates the 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. editor.โ€

The agent uses playground_execute_php to call wp_remote_get, download the plugin zip, and extract it to wp-content/plugins/. It activates the plugin with activate_plugin(), then fires playground_request against the post editor URL to confirm the classic interface loads. You see each step in your agentโ€™s output.

2. Debug site options with PHP

Need to check what a plugin stored in the database? Skip the admin 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. and query wp_options directly:

โ€œShow me all autoloaded options that contain โ€˜woocommerceโ€™ in the option name.โ€

The agent runs playground_execute_php with a short script:

global $wpdb;
$results = $wpdb->get_results(
    "SELECT option_name, option_value FROM $wpdb->options
     WHERE option_name LIKE '%woocommerce%'"
);
print_r($results);

Playground uses SQLite instead of 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, so avoid MySQL-specific column values in your queries. The $wpdb abstraction handles the translation, but filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. conditions like autoload = 'yes' may not return results as expected.

The output appears in your conversation. No phpMyAdmin or database client needed.

3. Scaffold theme files

Building a child themeChild theme A Child Theme is a customized theme based upon a Parent Theme. Itโ€™s considered best practice to create a child theme if you want to modify the CSS of your theme. https://developer.wordpress.org/themes/advanced-topics/child-themes/ from scratch involves creating directories, writing template files, and registering the theme. Let the agent handle the boilerplate:

โ€œCreate a child theme of Twenty Twenty-Five called โ€˜Studio Childโ€™ with a custom headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitorโ€™s opinion about your content and you/ your organizationโ€™s brand. It may also look different on different screen sizes. template part and a front-page template.โ€

The agent calls playground_mkdir to create the theme directory, playground_write_file to generate style.css, theme.json, and template files, then playground_execute_php to verify the theme appears in the admin. If a file contains an error, the agent reads it back with playground_read_file and corrects the mistake in the next step.

Available tools

The MCP server exposes these tools to your agent:

  • Site management: playground_get_website_url, playground_list_sites, playground_open_site, playground_rename_site, playground_save_site
  • Code execution: playground_execute_php, playground_request
  • Navigation: playground_navigate, playground_get_current_url, playground_get_site_info
  • Filesystem: playground_read_file, playground_write_file, playground_list_files, playground_mkdir, playground_delete_file, playground_delete_directory, playground_file_exists

Share your feedback

Try the @wp-playground/mcp package and tell us what you build. Share your experience in the #playground channel on Making WordPress Slack or open an issue on GitHub to suggest new tools.

Props to @berislavgrgicak for building the MCP server and reviewing the post.

#ai #playground

+make.wordpress.org/core/
+make.wordpress.org/ai/

Playground Team Meeting: July 25,2025

Location: #playground Slack Channel

The bi-weekly WordPress Playground team meeting on July 25, 2025, focused on recent developments and project updates. A significant number of new features and improvements were announced. The meeting was held on the #playground channel at wordpress.slack.com. Several improvements were implemented on the WordPress Playground Project.

Key Highlights

  • Performance Improvements: OPCache is now enabled by default. This is a significant change that will significantly improve performance.
  • Xdebug Support: A lot of work has been done to improve Xdebug support, including a new โ€”experimental-devtools option in the Playground CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress. and a mock @php-wasm/xdebug-bridge package. #2411, #2408 and #2402.
  • Blueprint v2: The team is getting Blueprint v2 ready, with a focus on improving error messages and handling relative paths and Blueprints v2 support was added to Playground CLI via theย --experimental-blueprints-v2-runnerย flag.
  • CLI Enhancements: New flags have been added to the Playground CLI, along with better error reporting.
  • PHP 8.3: 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 8.3 is now the default version for playground.wordpress.net and Playground CLI.
  • Localization: Translations have been added for Brazilian Portuguese and Japanese.
  • Contributor Badge: The team is discussing criteria for earning a contributor badge.

Recent Contributions

  • bpayton has been working on fixes for mounted symlinks in the CLI, multi-worker performance testing, and other small fixes.
  • zaerl will be working on a pull request to address issue #2124.
  • Fellyph Cintra is developing a new landing page for the web instance, documenting new features, and addressing PWA configuration issues.

For more information, join our #playground Slack Channel, and see you in our next chat, which is scheduled for August 8th.

#playground, #docs, #polyglots #summary

Playground Meeting Summary: June 27, 2025

The WordPress Playground team convened on June 27, 2025, to discuss recent advancements, ongoing work, and future plans. Key updates included significant enhancements to Playgroundโ€™s coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. functionalities, particularly around networking and Blueprints, along with improvements to the CLICLI Command Line Interface. Terminal (Bash) in Mac, Command Prompt in Windows, or WP-CLI for WordPress. and documentation.

Key Announcements & Highlights

Playground Enhancements

A major highlight was the default enabling of networking on playground.wordpress.net. This highly requested feature, now active by default, allows new Playground instances immediate network access, greatly enhancing its utility for various demos and use cases. This was made possible by performance improvements in the initial /wp-admin/ loading, specifically from PR #2296 and PR #2295.

Other significant Playground updates include Improved 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 Instance Handling, where the PHP Process Manager now offers better support for acquiring non-primary PHP instances(PR #2274), improving stability for ad-hoc PHP runs and resolving a race condition. Simultaneous Network Calls are now possible(PR #2286), allowing multiple, asynchronous network calls to run concurrently across co-existing PHP instances within the same web worker.

Blueprints v2 Runner Shipped

The Blueprints v2 runner (blueprints.phar) has been added to the @wp-playground/blueprints package. While the v1 runner remains the default for now, this addition paves the way for the next generation of Playground Blueprints.

CLI & File System Updates

The team also shipped several improvements to the Playground CLI and file system, including:

  • CLI Help Message Clarity with updated help messages for --mount-dir and related flags for better user understanding(PR #2287)
  • PHP_BINARY Defined to consistently define the constant when running PHP.wasm in php.cli() mode for compatibility (PR #2288)
  • Shared Filesystem Fix to ensure only NODEFS nodes are considered shared filesystems within the PHP Node environment, resolving a FS error 44 (PR #2300)
  • CLI Code Refactor where the parseOptionsAndRunCLI() logic was moved to run-cli.ts to streamline future development(PR #2297).

More Translations Added

Thanks to @shimotomoki for significant progress has been made on internationalization, with Japanese translations added to theโ€About Playgroundโ€ (PR #2282), โ€œBuildโ€ (PR #2290), and โ€œLaunchโ€ (PR #2292) sections of the documentation. The team encourages further contributions from community members interested in translating the Playground documentation into their native languages.

Team Contributions

Team members shared their ongoing work and discussed various topics:

  • SQLite Driver Adoption: @janjakes is focusing on adopting the new SQLite driver and further testing 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. compatibility.
  • Blueprints v2 Polishing: @zieladam is polishing the Blueprints v2 for Playground CLI Pull Request. The team noted the potential for Playground CLI to run plugin tests, specifically mentioning the Plugin Check (PCP) plugin as a promising use case.
  • CLI README Update: @fellyph is adding a new README to the CLI, inviting collaboration for reviews.
  • OPcache Support: @zaerl is actively testing OPcache support and measuring performance, while also investigating an out-of-memory error. The discussion touched upon the potential performance gains and the challenges of debugging WASM memory issues.
  • Xdebug Support: Work on Xdebug continues, with a recent PR enabling it on Node 23. The goal is to extend support to Node < 23 and then to browsers, with exciting prospects for connecting Xdebug to Chrome DevTools.
  • 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./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. Discussions: The team discussed the Playground web versionโ€™s menu structure, particularly the presence of two menus with similar options. While acknowledging the current discoverability benefits of the top-right popup, it was recognized that the Playground UI could benefit from further UX work, referencing existing โ€œwebsite redesignโ€ issues on 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/.
  • PHP Version Support: The team discussed the strategy for dropping support for older PHP versions (like 7.2) once WordPress core ceases to support them. The consensus was to likely drop support on the first major problem with that version, rather than immediately on day one of a new core release.

The meeting was productive and full of discussions around new features and improvements, until the next meeting. To keep the discussion going. Please join our #playground channel at wordpress.slack.com