Block Bindings API

Framework for connecting block attributes to external data sources, allowing dynamic content override during block rendering.

Since: 6.5.0
Source: wp-includes/block-bindings.php, wp-includes/block-bindings/

Components

ComponentDescription
functions.mdCore registration and retrieval functions
class-wp-block-bindings-registry.mdRegistry singleton for managing sources
class-wp-block-bindings-source.mdIndividual source instance
hooks.mdFilters for customization

Registration Flow

php
init action
    └── register_block_bindings_source()
            └── WP_Block_Bindings_Registry::register()
                    └── new WP_Block_Bindings_Source()

Value Resolution Flow

Block rendering
    └── WP_Block_Bindings_Source::get_value()
            ├── get_value_callback( $source_args, $block_instance, $attribute_name )
            └── apply_filters( 'block_bindings_source_value', $value, ... )

Supported Blocks (Default)

BlockSupported Attributes
core/paragraphcontent
core/headingcontent
core/imageid, url, title, alt, caption
core/buttonurl, text, linkTarget, rel
core/post-datedatetime
core/navigation-linkurl
core/navigation-submenuurl

Built-in Sources

SourceSinceDescription
core/post-meta6.5.0Post custom field values
core/pattern-overrides6.5.0Pattern content overrides
core/post-data6.9.0Post date, modified, link
core/term-data6.9.0Term name, link, slug, description, parent, count

Block Markup Example

html
<!-- wp:paragraph {
  "metadata": {
    "bindings": {
      "content": {
        "source": "my-plugin/my-source",
        "args": {
          "key": "custom_value"
        }
      }
    }
  }
} -->
<p>Fallback text replaced by binding.</p>
<!-- /wp:paragraph -->

Quick Start

php
// Register a custom source
add_action( 'init', function() {
    register_block_bindings_source( 'my-plugin/site-info', array(
        'label'              => __( 'Site Info', 'my-plugin' ),
        'get_value_callback' => function( $source_args, $block_instance, $attribute_name ) {
            switch ( $source_args['field'] ?? '' ) {
                case 'name':
                    return get_bloginfo( 'name' );
                case 'description':
                    return get_bloginfo( 'description' );
                default:
                    return null;
            }
        },
    ) );
} );