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() :
false ) ; ?>< div
- >
- ...
- </
- 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