Interactivity API Hooks

Filters for customizing Interactivity API behavior.

Source: wp-includes/interactivity-api/class-wp-interactivity-api.php


Filters

script_module_data_@wordpress/interactivity

Filters the data passed to the @wordpress/interactivity script module.

apply_filters( 'script_module_data_@wordpress/interactivity', array $data )

Since: 6.7.0 (via WP_Interactivity_API::add_hooks())

Parameters:

Name Type Description
$data array Data to pass to the script module

Default Data Structure:

array(
    'state'  => array(
        'namespace1' => array( /* state data */ ),
        'namespace2' => array( /* state data */ ),
    ),
    'config' => array(
        'namespace1' => array( /* config data */ ),
    ),
    'derivedStateClosures' => array(
        'namespace1' => array( 'path.to.derived', 'another.derived' ),
    ),
)

Example:

add_filter(
    'script_module_data_@wordpress/interactivity',
    function( $data ) {
        // Add global state
        $data['state']['myPlugin'] = array(
            'apiRoot' => rest_url(),
            'nonce'   => wp_create_nonce( 'wp_rest' ),
        );
        return $data;
    }
);

script_module_data_@wordpress/interactivity-router

Filters the data passed to the @wordpress/interactivity-router script module.

apply_filters( 'script_module_data_@wordpress/interactivity-router', array $data )

Since: 6.7.0

Parameters:

Name Type Description
$data array Data to pass to the router module

Default Data Structure:

array(
    'i18n' => array(
        'loading' => 'Loading page, please wait.',
        'loaded'  => 'Page Loaded.',
    ),
)

Example:

add_filter(
    'script_module_data_@wordpress/interactivity-router',
    function( $data ) {
        // Customize loading messages
        $data['i18n']['loading'] = __( 'Loading...', 'my-plugin' );
        return $data;
    }
);

wp_script_attributes

Filters script tag attributes (used to add router options).

apply_filters( 'wp_script_attributes', array $attributes )

Since: 6.9.0 (via WP_Interactivity_API::add_hooks())

Parameters:

Name Type Description
$attributes array Script tag attributes

Interactivity API Usage:
The Interactivity API uses this filter to add data-wp-router-options to script modules marked as compatible with client-side navigation.

Resulting Attribute:

<script type="module" id="my-module-js-module" data-wp-router-options='{"loadOnClientNavigation":true}' src="..."></script>

Actions

wp_footer

Used to output router loading bar markup.

add_action( 'wp_footer', array( $this, 'print_router_markup' ) )

Since: 6.5.0 (triggered by data-wp-router-region processing)

Condition: Only added when data-wp-router-region directive is found.

Output:

<div
    class="wp-interactivity-router-loading-bar"
    data-wp-interactive="core/router"
    data-wp-class--start-animation="state.navigation.hasStarted"
    data-wp-class--finish-animation="state.navigation.hasFinished"
></div>

Internal Hooks

These are used internally but can be observed:

Inline Style Registration

When data-wp-router-region is processed:

wp_register_style( 'wp-interactivity-router-animations', false );
wp_add_inline_style( 'wp-interactivity-router-animations', $css );
wp_enqueue_style( 'wp-interactivity-router-animations' );

This adds the loading bar animation CSS to the page.


Usage Patterns

Adding Custom State Server-Side

add_action( 'wp_enqueue_scripts', function() {
    wp_interactivity_state( 'myPlugin', array(
        'userId'   => get_current_user_id(),
        'isAdmin'  => current_user_can( 'manage_options' ),
        'settings' => get_option( 'my_plugin_settings', array() ),
    ) );
} );

Adding Custom Config

add_action( 'wp_enqueue_scripts', function() {
    wp_interactivity_config( 'myPlugin', array(
        'apiEndpoint' => rest_url( 'my-plugin/v1/' ),
        'maxItems'    => 10,
    ) );
} );

Enabling Client Navigation for Script Modules

add_action( 'init', function() {
    wp_interactivity()->add_client_navigation_support_to_script_module( 'my-module' );
} );