Generated banner for Wp Interactivity API
Generated logo for Wp Interactivity API

Wp Interactivity API

WordPressOfficialPublished by WordPress

  • Skill
  • Tool integration
  • Software development
  • GPL-2.0-or-later
  • No issues found

From the author

Use when building or debugging WordPress Interactivity API features (data-wp-* directives, @wordpress/interactivity store/state/actions, block viewScriptModule integration, wp_interactivity_*()) including performance, hydration, and directive behavior.
— the description by WordPress

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured approach to working with the WordPress Interactivity API. It covers the implementation of data-wp-* directives, store management, and server-side rendering best practices to ensure seamless hydration and performance. It also addresses common debugging scenarios, version-specific changes like the deprecation of data-wp-ignore, and the use of unique directive IDs for plugin compatibility.

What it does

  • Guides the implementation of interactive blocks using viewScriptModule.
  • Provides patterns for server-side rendering and state initialization in PHP.
  • Offers a debugging checklist for hydration issues and inert directives.
  • Explains how to use unique directive IDs to prevent attribute collisions.
  • Details the transition from deprecated directives to modern alternatives.
  • Assists in aligning build tooling with WordPress script conventions.

When to use it

  • When developing or debugging features using @wordpress/interactivity.
  • When troubleshooting hydration mismatches or layout shifts.
  • When implementing server-side state for SEO and performance.
  • When resolving conflicts between multiple plugins on the same DOM element.
  • When migrating legacy code away from deprecated directives like data-wp-ignore.

Advantages

  • Ensures consistent state between server-rendered HTML and client-side hydration.
  • Reduces layout shifts through proper server-side directive processing.
  • Provides clear patterns for managing complex state and derived data.
  • Facilitates easier debugging of interactive regions and event handlers.
  • Promotes best practices for modern WordPress block development.

Usage examples

“My interactive block is not responding to clicks. How do I debug this?”
The agent will guide you to verify the interactive root, check for view script module loading, confirm store namespace alignment, and inspect the console for errors.
“How do I initialize state in PHP for my interactive component?”
The agent will provide code examples using wp_interactivity_state() and wp_interactivity_data_wp_context() to ensure initial state is present in the server-rendered HTML.
“I have two plugins trying to attach a click handler to the same button. How do I fix this?”
The agent will explain how to use the --- separator to create unique directive IDs, allowing both handlers to coexist on the same element.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/wordpress/wp-interactivity-api/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip wp-interactivity-api.zip -d .agents/skills

Documentation by WordPress

WP Interactivity API

When to use

Use this skill when the user mentions:

  • Interactivity API, @wordpress/interactivity,

  • data-wp-interactive, data-wp-on--*, data-wp-bind--*, data-wp-context,

  • block viewScriptModule / module-based view scripts,

  • hydration issues or “directives don’t fire”.

Inputs required

  • Repo root + triage output (wp-project-triage).

  • Which block/theme/plugin surfaces are affected (frontend, editor, both).

  • Any constraints: WP version, whether modules are supported in the build.

Procedure

1) Detect existing usage + integration style

Search for:

  • data-wp-interactive

  • @wordpress/interactivity

  • viewScriptModule

Decide:

  • Is this a block providing interactivity via block.json view script module?

  • Is this theme-level interactivity?

  • Is this plugin-side “enhance existing markup” usage?

If you’re creating a new interactive block (not just debugging), prefer the official scaffold template:

  • @wordpress/create-block-interactive-template (via @wordpress/create-block)

2) Identify the store(s)

Locate store definitions and confirm:

  • state shape,

  • actions (mutations),

  • callbacks/event handlers used by data-wp-on--*.

3) Server-side rendering (best practice)

Pre-render HTML on the server before outputting to ensure:

  • Correct initial state in the HTML before JavaScript loads (no layout shift).

  • SEO benefits and faster perceived load time.

  • Seamless hydration when the client-side JavaScript takes over.

Enable server directive processing

For components using block.json, add supports.interactivity:

{
  "supports": {
    "interactivity": true
  }
}

For themes/plugins without block.json, use wp_interactivity_process_directives() to process directives.

Initialize state/context in PHP

Use wp_interactivity_state() to define initial global state:

wp_interactivity_state( 'myPlugin', array(
  'items'    => array( 'Apple', 'Banana', 'Cherry' ),
  'hasItems' => true,
));

For local context, use wp_interactivity_data_wp_context():

<?php
$context = array( 'isOpen' => false );
?>
<div <?php echo wp_interactivity_data_wp_context( $context ); ?>>
  ...
</div>
Define derived state in PHP

When derived state affects initial HTML rendering, replicate the logic in PHP:

wp_interactivity_state( 'myPlugin', array(
  'items'    => array( 'Apple', 'Banana' ),
  'hasItems' => function() {
    $state = wp_interactivity_state();
    return count( $state['items'] ) > 0;
  }
));

This ensures directives like data-wp-bind--hidden="!state.hasItems" render correctly on first load.

For detailed examples and patterns, see references/server-side-rendering.md.

4) Implement or change directives safely

When touching markup directives:

  • keep directive usage minimal and scoped,

  • prefer stable data attributes that map clearly to store state,

  • ensure server-rendered markup + client hydration align.

WordPress 6.9 changes:

  • data-wp-ignore is deprecated and will be removed in future versions. It broke context inheritance and caused issues with client-side navigation. Avoid using it.

  • Unique directive IDs: Multiple directives of the same type can now exist on one element using the --- separator (e.g., data-wp-on--click---plugin-a="..." and data-wp-on--click---plugin-b="...").

  • New TypeScript types: AsyncAction<ReturnType> and TypeYield<T> help with async action typing.

For quick directive reminders, see references/directives-quickref.md.

5) Build/tooling alignment

Verify the repo supports the required module build path:

  • if it uses @wordpress/scripts, prefer its conventions.

  • if it uses custom bundling, confirm module output is supported.

6) Debug common failure modes

If “nothing happens” on interaction:

  • confirm the viewScriptModule is enqueued/loaded,

  • confirm the DOM element has data-wp-interactive,

  • confirm the store namespace matches the directive’s value,

  • confirm there are no JS errors before hydration.

See references/debugging.md.

Verification

  • wp-project-triage indicates signals.usesInteractivityApi: true after your change (if applicable).

  • Manual smoke test: directive triggers and state updates as expected.

  • If tests exist: add/extend Playwright E2E around the interaction path.

Failure modes / debugging

  • Directives present but inert:

    • view script not loading, wrong module entrypoint, or missing data-wp-interactive.

  • Hydration mismatch / flicker:

    • server markup differs from client expectations; simplify or align initial state.

    • derived state not defined in PHP: use wp_interactivity_state() with closures.

  • Initial content missing or wrong:

    • supports.interactivity not set in block.json (for blocks).

    • wp_interactivity_process_directives() not called (for themes/plugins).

    • state/context not initialized in PHP before render.

  • Layout shift on load:

    • derived state like state.hasItems missing on server, causing hidden attribute to be absent.

  • Performance regressions:

    • overly broad interactive roots; scope interactivity to smaller subtrees.

  • Client-side navigation issues (WordPress 6.9):

    • getServerState() and getServerContext() now reset between page transitions—ensure your code doesn't assume stale values persist.

    • Router regions now support attachTo for rendering overlays (modals, pop-ups) dynamically.

Escalation

  • If repo build constraints are unclear, ask: "Is this using @wordpress/scripts or a custom bundler (webpack/vite)?"

  • Consult:

    • references/server-side-rendering.md

    • references/directives-quickref.md

    • references/debugging.md

Files

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

The author says: Targets WordPress 7.0+ (PHP 7.4.0+). Filesystem-based agent with bash + node. Some workflows require WP-CLI.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
WordPress
Publisher
WordPress (Official)
Source
WordPress/agent-skills · skills/wp-interactivity-api · commit 7374e6f
Licence
GNU General Public License v2.0 or later (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by WordPress.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download wp-interactivity-api.zip