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) 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.
4) 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.
5) 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.
- 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/directives-quickref.md
references/debugging.md
1---2name: wp-interactivity-api3description: "Use when building or debugging WordPress Interactivity API features (data-wp-* directives, @wordpress/interactivity store/state/actions, block viewScriptModule integration) including performance, hydration, and directive behavior."4compatibility: "Targets WordPress 6.9+ (PHP 7.2.24+). Filesystem-based agent with bash + node. Some workflows require WP-CLI."5---67# WP Interactivity API89## When to use1011Use this skill when the user mentions:1213- Interactivity API, `@wordpress/interactivity`,14- `data-wp-interactive`, `data-wp-on--*`, `data-wp-bind--*`, `data-wp-context`,15- block `viewScriptModule` / module-based view scripts,16- hydration issues or “directives don’t fire”.1718## Inputs required1920- Repo root + triage output (`wp-project-triage`).21- Which block/theme/plugin surfaces are affected (frontend, editor, both).22- Any constraints: WP version, whether modules are supported in the build.2324## Procedure2526### 1) Detect existing usage + integration style2728Search for:2930- `data-wp-interactive`31- `@wordpress/interactivity`32- `viewScriptModule`3334Decide:3536- Is this a block providing interactivity via `block.json` view script module?37- Is this theme-level interactivity?38- Is this plugin-side “enhance existing markup” usage?3940If you’re creating a new interactive block (not just debugging), prefer the official scaffold template:4142- `@wordpress/create-block-interactive-template` (via `@wordpress/create-block`)4344### 2) Identify the store(s)4546Locate store definitions and confirm:4748- state shape,49- actions (mutations),50- callbacks/event handlers used by `data-wp-on--*`.5152### 3) Implement or change directives safely5354When touching markup directives:5556- keep directive usage minimal and scoped,57- prefer stable data attributes that map clearly to store state,58- ensure server-rendered markup + client hydration align.5960**WordPress 6.9 changes:**6162- **`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.63- **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="..."`).64- **New TypeScript types**: `AsyncAction<ReturnType>` and `TypeYield<T>` help with async action typing.6566For quick directive reminders, see `references/directives-quickref.md`.6768### 4) Build/tooling alignment6970Verify the repo supports the required module build path:7172- if it uses `@wordpress/scripts`, prefer its conventions.73- if it uses custom bundling, confirm module output is supported.7475### 5) Debug common failure modes7677If “nothing happens” on interaction:7879- confirm the `viewScriptModule` is enqueued/loaded,80- confirm the DOM element has `data-wp-interactive`,81- confirm the store namespace matches the directive’s value,82- confirm there are no JS errors before hydration.8384See `references/debugging.md`.8586## Verification8788- `wp-project-triage` indicates `signals.usesInteractivityApi: true` after your change (if applicable).89- Manual smoke test: directive triggers and state updates as expected.90- If tests exist: add/extend Playwright E2E around the interaction path.9192## Failure modes / debugging9394- Directives present but inert:95 - view script not loading, wrong module entrypoint, or missing `data-wp-interactive`.96- Hydration mismatch / flicker:97 - server markup differs from client expectations; simplify or align initial state.98- Performance regressions:99 - overly broad interactive roots; scope interactivity to smaller subtrees.100- Client-side navigation issues (WordPress 6.9):101 - `getServerState()` and `getServerContext()` now reset between page transitions—ensure your code doesn't assume stale values persist.102 - Router regions now support `attachTo` for rendering overlays (modals, pop-ups) dynamically.103104## Escalation105106- If repo build constraints are unclear, ask: “Is this using `@wordpress/scripts` or a custom bundler (webpack/vite)?”107- Consult:108 - `references/directives-quickref.md`109 - `references/debugging.md`