Wp Interactivity API
WordPressOfficialPublished by WordPress
- Skill
- Tool integration
- Software development
- GPL-2.0-or-later
- No issues found
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
Download the skill as a ZIP:
https://autogineer.com/agent-skills/wordpress/wp-interactivity-api/downloadUnzip 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/interactivityviewScriptModule
Decide:
Is this a block providing interactivity via
block.jsonview 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-ignoreis 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="..."anddata-wp-on--click---plugin-b="...").New TypeScript types:
AsyncAction<ReturnType>andTypeYield<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
viewScriptModuleis 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-triageindicatessignals.usesInteractivityApi: trueafter 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.interactivitynot set inblock.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.hasItemsmissing on server, causinghiddenattribute to be absent.
Performance regressions:
overly broad interactive roots; scope interactivity to smaller subtrees.
Client-side navigation issues (WordPress 6.9):
getServerState()andgetServerContext()now reset between page transitions—ensure your code doesn't assume stale values persist.Router regions now support
attachTofor rendering overlays (modals, pop-ups) dynamically.
Escalation
If repo build constraints are unclear, ask: "Is this using
@wordpress/scriptsor a custom bundler (webpack/vite)?"Consult:
references/server-side-rendering.mdreferences/directives-quickref.mdreferences/debugging.md
Files
- ATTRIBUTION.mdAdded by AutoGineer904 B
- LICENSELicence file added by AutoGineer750 B
- SKILL.md6.0 KiB
- references/debugging.md1.3 KiB
- references/directives-quickref.md1.1 KiB
- references/server-side-rendering.md7.6 KiB
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 or WordPress.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download wp-interactivity-api.zip