The Block Bindings API is a formidable software within the block editor that allows you to attach any information supply to a block’s attributes.
This API used to be first offered in WordPress 6.5 and, in its preliminary implementation, enabled WordPress customers to show customized box values inside of posts and pages.
The Block Bindings API serves as the root for different tough WordPress options. Examples come with Synced trend overrides and the Submit Date block variation offered in WordPress 6.9.
So, precisely what’s the Block Bindings API? And what’s it used for? We can supply a easy advent and a real-world instance appearing how you can create bindings between Gutenberg blocks and exterior information assets.
Let’s get to paintings.
The Block Bindings API: Elementary ideas
As we discussed above, the Block Bindings API means that you can create bindings between a knowledge supply and the attributes of a block.
If you happen to’re no longer aware of block attributes, navigate to the src listing of the Gutenberg venture’s block library on GitHub, in finding the Paragraph block, and open the block.json report. The attributes assets supplies an inventory of the Paragraph block’s attributes.
"attributes": {
"content material": {
"sort": "rich-text",
"supply": "rich-text",
"selector": "p",
"position": "content material"
},
"dropCap": {
"sort": "boolean",
"default": false
},
"placeholder": {
"sort": "string"
},
"route": {
"sort": "string",
"enum": [ "ltr", "rtl" ]
}
},
The next blocks reinforce the Block Bindings API as of WordPress 6.9 and will due to this fact be related for your customized fields:
| Supported blocks | Attributes |
|---|---|
| Paragraph | content material |
| Name | content material |
| Imagin | identification, url, alt, name, caption |
| Button | textual content, url, linkTarget, rel |
To attach your customized fields to Gutenberg blocks, you should first sign in them. The next code registers a customized box by the use of a WordPress plugin or your theme’s purposes.php report:
add_action( 'init', serve as() {
register_post_meta( 'your-post-type', 'myplugin_meta_key', [
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'description' => __( 'City name', 'textdomain' ),
'auth_callback' => 'is_user_logged_in',
] );
} );
Attributes outline the traits of customized fields, and the documentation supplies a entire record of them. To make a customized box to be had to the Block Bindings API, you should set show_in_rest to true. As of WordPress 6.9, string is the one supported sort.
To look the Block Bindings API in motion with customized fields, create a brand new WordPress plugin and sign in a meta box with the code proven above.
true,
'unmarried' => true,
'sort' => 'string',
'description' => __( 'Town title', 'block-bindings-example' ),
'auth_callback' => 'is_user_logged_in',
] );
} );
For your WordPress dashboard, turn on the plugin. Then, navigate to the Posts display screen and create a brand new put up. When you choose a supported block, the Attributes panel within the Block Settings sidebar will show the record of attributes that may be certain to a registered customized box.

Open the Choices menu within the peak proper nook and choose Personal tastes. Within the Normal tab, find the Complicated phase and allow customized fields. Save your adjustments, look forward to the web page to reload, then go back to the editor.

The next step is to insert an Symbol block. With the block decided on, click on the + icon within the Attributes panel and choose the url characteristic. The Attributes panel will then display an inventory of to be had meta fields. Choose url once more. Now, you’re going to see the record of meta fields to be had for the present put up sort.

Choose your meta box and save the put up. You will have to now see your symbol in each the editor and the frontend.

Beginning with model 6.7 of WordPress, you’ll be able to use the Label characteristic to show textual content within the editor interface. The next code block presentations an instance:
add_action( 'init', serve as() {
register_post_meta( '', 'block_bindings_image_url', [
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'description' => __( 'City image', 'block-bindings-example' ),
'label' => __('Image URL'),
'auth_callback' => 'is_user_logged_in',
] );
} );

Whilst you open the code editor, you’ll be able to see a JSON object inside the symbol block delimiter. The metadata.bindings.url assets presentations that the url of the picture block is related to a metadata box.
The supply assets specifies the information supply for the block bindings. The args.key assets establishes a reference for your meta box.
Essentially the most fascinating side of the Block Bindings API is its talent to sign in customized information assets, which opens up some thrilling new probabilities for builders. Subsequent, we’ll discover how you can use information from third-party products and services with the Block Bindings API.
The way to sign in customized Block Bindings information assets: An actual-life instance
As soon as you might be aware of the Block Bindings API’s elementary ideas, we will transfer directly to its extra complicated and fascinating facets for builders.
As discussed previous, the Block Bindings API means that you can sign in customized information assets. This lets you retrieve information from a far off supply and/or manipulate uncooked information to generate helpful knowledge that may be robotically inserted into your content material.
On this phase, you learn to maximize the possibility of Block Bindings via a realistic instance that you’ll be able to use as a basis for creating your personal customized packages.
Think you need to retrieve information from an exterior supply and show it for your posts, pages, or customized put up sorts. As an example, chances are you’ll question a climate carrier API by way of sending a request with the latitude and longitude of a town to get real-time climate information, which you have to then show for your website.
Due to the Block Bindings API, you’ll be able to show the present temperature or supply your readers with the elements forecast for the approaching days. You’ll be able to additionally programmatically exchange the url characteristic of a number of photographs at the web page relying on climate stipulations.
So as to add this option for your WordPress web site, you want to create a plugin. Observe those steps:
Step 1: Create a elementary plugin
Step one is to create the plugin information. Navigate to the wp-content/plugins listing of your WordPress set up and create a brand new folder known as block-bindings-example. Inside of this folder, upload the next information:
/wp-content/plugins/
└── /block-bindings-example/
├── block-bindings-example.php
└── /comprises/
├── binding-sources.php
├── meta-fields.php
└── weather-api.php
Open the block-bindings-example.php report for your favourite code editor and upload the next code:
Right here’s what this code does:
- The consistent
BB_WEATHER_CACHE_TIMEdetermines how lengthy climate information is cached. This reduces API calls, improves web page efficiency, and lowers carrier prices. - The
require_onceexpressions come with the vital scripts to sign in meta fields, sign in the binding supply, and retrieve information from the API. - The setup serve as calls two purposes that sign in the put up meta fields and the customized binding assets.
Step 2: Sign up put up meta fields
The next move is to sign in the meta fields you want to your use case. Open the meta-fields.php report within the comprises folder and upload the next code:
true,
'unmarried' => true,
'sort' => 'string',
'description' => __( 'Upload town title', 'block-bindings-example' ),
'label' => __( 'Town title', 'block-bindings-example' ),
'auth_callback' => 'is_user_logged_in',
] );
register_post_meta( 'put up', 'block_bindings_image_url', [
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'description' => __( 'Add city image URL', 'block-bindings-example' ),
'label' => __( 'City image URL', 'block-bindings-example' ),
'auth_callback' => 'is_user_logged_in',
] );
register_post_meta( 'put up', 'block_bindings_city_lat', [
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'description' => __( 'Add city latitude', 'block-bindings-example' ),
'label' => __( 'Latitude', 'block-bindings-example' ),
'auth_callback' => 'is_user_logged_in',
] );
register_post_meta( 'put up', 'block_bindings_city_lng', [
'show_in_rest' => true,
'single' => true,
'type' => 'string',
'description' => __( 'Add city longitude', 'block-bindings-example' ),
'label' => __( 'Longitude', 'block-bindings-example' ),
'auth_callback' => 'is_user_logged_in',
] );
}
The register_post_meta serve as registers a meta key to be used in posts. Observe that to make use of meta fields registered this manner with the Block Bindings API, you should set show_in_rest to true and sort to string. See the documentation for more info.
Step 3: Sign up Block Bindings supply
It’s time to sign in your binding supply. Open the binding-sources.php report and upload the next code:
__( 'Climate Situation', 'block-bindings-example' ),
'get_value_callback' => 'bb_get_weather_condition_value',
'uses_context' => [ 'postId' ], // We want postId to get meta values
]
);
}
The register_block_bindings_source() serve as calls for the supply title and a callback serve as that retrieves information from a supply and returns the manipulated price.
Then, in the similar binding-sources.php report, outline the callback serve as.
serve as bb_get_weather_condition_value( array $source_args, WP_Block $block_instance ) {
$key = $source_args['key'] ?? null;
if ( ! $key ) {
go back null;
}
// Get present put up ID from block context (all the time to be had in put up content material)
$post_id = $block_instance->context['postId'] ?? null;
// Fallback: use world loop if context is lacking
if ( ! $post_id && in_the_loop() ) {
$post_id = get_the_ID();
}
if ( ! $post_id || $post_id <= 0 ) {
error_log( 'BB DEBUG: May just no longer decide put up ID for climate binding' );
go back null;
}
$weather_data = bb_fetch_and_cache_weather_data( $post_id );
if ( ! is_array( $weather_data ) || ! isset( $weather_data[ $key ] ) ) {
go back null;
}
$price = $weather_data[ $key ];
// Append °C image for temperature
if ( $key === 'temperature' ) {
go back $price . '°C';
}
go back $price;
}
Let’s wreck down this serve as:
$source_args['key']identifies the information certain to the block characteristic.- The following line retrieves the ID of the present put up from the
context. If thecontextis lacking, as may well be the case with previews, the ID of the present put up is retrieved withget_the_ID(). - Then, it calls the
bb_fetch_and_cache_weather_dataserve as, which retrieves the information from the API. We can outline this serve as in your next step. $weather_data[$key]incorporates the information supplied by way of the API, akin to temperature and climate state.- If the secret's
temperature, it appends°Cto the supplied price. - The serve as then returns the overall price.
Step 4: Retrieve information from an exterior supply
As discussed above, we retrieve information from the Open-Meteo carrier (loose for non-commercial use).
To retrieve the present temperature and climate stipulations, you want to ship a request to the API that comes with the latitude and longitude of a given location and the question var present=weather_code,temperature_2m. Beneath is an instance request:
https://api.open-meteo.com/v1/forecast?latitude=-33.8717&longitude=151.2299&present=weather_code,temperature_2m
The API supplies a reaction very similar to the next:
{
"latitude": -33.8717,
"longitude": 151.2299,
"generationtime_ms": 0.030875205993652344,
"utc_offset_seconds": 0,
"timezone": "GMT",
"timezone_abbreviation": "GMT",
"elevation": 13.0,
"current_units": {
"time": "iso8601",
"period": "seconds",
"weather_code": "wmo code",
"temperature_2m":"°C"
},
"present": {
"time": "2025-12-01T16:00",
"period": 900,
"weather_code": 3,
"temperature_2m":7.3
}
}

Now that you understand how to get the information you want, open the weather-api.php report and upload the next code:
serve as bb_fetch_and_cache_weather_data( $post_id ) {
$lat = get_post_meta( $post_id, 'block_bindings_city_lat', true );
$lng = get_post_meta( $post_id, 'block_bindings_city_lng', true );
$lat = str_replace( ',', '.', trim( $lat ) );
$lng = str_replace( ',', '.', trim( $lng ) );
if ( ! is_numeric( $lat ) || ! is_numeric( $lng ) ) {
error_log( 'BB DEBUG: Invalid latitude/longitude values after normalization' );
go back false;
}
$transient_key = 'bb_weather_data_' . $post_id;
$cached_data = get_transient( $transient_key );
if ( $cached_data !== false ) {
error_log( "BB DEBUG: Cache hit for put up ID {$post_id}" );
go back $cached_data;
}
// Construct Open-Meteo API URL
$api_url = sprintf(
'https://api.open-meteo.com/v1/forecast?latitude=%s&longitude=%s&present=weather_code,temperature_2m',
rawurlencode( $lat ),
rawurlencode( $lng )
);
error_log( "BB DEBUG: Fetching climate information from: {$api_url}" );
$reaction = wp_remote_get( $api_url, [ 'timeout' => 10 ] );
if ( is_wp_error( $reaction ) ) {
error_log( 'BB DEBUG: API request failed – ' . $response->get_error_message() );
go back false;
}
if ( wp_remote_retrieve_response_code( $reaction ) !== 200 ) {
error_log( 'BB DEBUG: API returned non-200 standing code' );
go back false;
}
$frame = wp_remote_retrieve_body( $reaction );
$information = json_decode( $frame, true );
if ( ! $information || ! isset( $information['current'] ) ) {
error_log( 'BB DEBUG: Invalid or empty API reaction' );
go back false;
}
$temperature = $information['current']['temperature_2m'] ?? null;
$weather_code = $information['current']['weather_code'] ?? 0;
$mapped_data = [
'temperature' => round( (float) $temperature ),
'weather_state' => bb_map_wmo_code_to_state( (int) $weather_code ),
];
// Cache for half-hour
set_transient( $transient_key, $mapped_data, BB_WEATHER_CACHE_TIME );
error_log( 'BB DEBUG: Climate information fetched and cached effectively' );
go back $mapped_data;
}
This serve as retrieves present climate information from the Open-Meteo API and shops it within the cache the usage of transients. Let’s take a more in-depth glance.
- Two calls to
get_post_metaretrieve the latitude and longitude of your location. - The next two traces normalize the decimal separator in case the consumer enters a comma as an alternative of a duration.
- The conditional block tests if the values are in numerical structure the usage of
is_numeric(). - Subsequent, it tests if the information is in cache. If this is the case, it returns the cached information and forestalls the serve as with out sending any request to the API.
- If no information is located in cache, it builds the request and shops the reaction.
- The next traces supply
temperatureandweather_code. weather_codeis mapped toweather_statebecause of thebb_map_wmo_code_to_stateserve as, which is outlined underneath.- The knowledge is stored with
set_transient. - After all, the serve as returns the mapped information.
Ultimate, outline the serve as that interprets weather_code right into a human-readable string:
serve as bb_map_wmo_code_to_state( $code ) {
if ( $code >= 0 && $code <= 3 ) {
return 'clear';
} elseif ( $code >= 51 && $code <= 67 ) {
return 'rainy';
} elseif ( $code >= 71 && $code <= 77 ) {
return 'snowy';
} elseif ( $code >= 95 ) {
go back 'thunderstorm';
}
go back 'cloudy';
}
The code is entire, and your plugin is in a position for trying out.
The way to use the Block Bindings API
It’s time to learn to use the brand new options added for your website with the Block Bindings API!
For your WordPress dashboard, navigate to the Plugins display screen and turn on the Block Bindings Instance plugin you simply created.

After that, create a brand new put up or web page. Upload an Symbol block, a name, and 4 Row blocks containing two paragraphs each and every, as proven within the symbol underneath. Then, save the put up.

Following, upload your customized fields and save the put up once more.

Choose the Symbol block and in finding the Attributes panel within the Block Settings sidebar. Click on the + button to open the dropdown menu, which presentations the record of Symbol block attributes that reinforce Block Bindings. Choose the url merchandise.

After settling on the block characteristic, the Complicated tab will show a brand new URL part with the outline “Now not attached.” Click on at the url merchandise once more to view the record of to be had binding assets. Submit Meta supplies the 4 customized fields registered for the put up sort, in conjunction with their respective values. Choose Town Symbol URL.

You assigned the Town Symbol URL meta box to the url characteristic of the Symbol block. You will have to now see a photograph of the town you selected.
Observe the similar procedure for the opposite meta fields. Assign the Town Title box to the content material characteristic of the Heading block and the Latitude and Longitude fields to the corresponding Paragraph blocks.
Now, attach the remaining two blocks for your customized binding supply. Sadly, as you noticed within the earlier screenshots, this selection isn't to be had within the editor UI.
Lately, you want to modify to the code editor and manually write the markup for the 2 blocks related for your binding supply. Beneath is the code to show the temperature supplied by way of the Open-Meteo carrier:
Placeholder
With this technique, the title of your binding supply will seem within the editor as Climate Situation, however the real information will most effective be visual within the entrance finish.

Obviously, manually including a JSON object to the block markup isn’t a user-friendly procedure. Thankfully, WordPress 6.9 offered vital enhancements to the Block Bindings API, making it imaginable to create a UI for customized information assets. Let’s take a look at bettering our plugin with a customized UI.
The way to create a UI to your customized Block Bindings assets
To create a UI to your customized binding supply, you want to put in writing some JavaScript code. First, create a js subfolder underneath /comprises after which create a block-bindings-ui.js report within it. The plugin construction is now the next:
/wp-content/plugins/
└── /block-bindings-example/
├── block-bindings-example.php
└── /comprises/
├── binding-sources.php
├── meta-fields.php
└── weather-api.php
└── /js/
└── block-bindings-ui.js
As a primary step, upload the JS script to the primary report of your plugin:
serve as bb_enqueue_weather_bindings_ui() {
if ( ! function_exists( 'register_block_bindings_source' ) ) {
go back;
}
$js_file_path = plugin_dir_path( __FILE__ ) . 'comprises/js/block-bindings-ui.js';
if ( ! file_exists( $js_file_path ) ) {
go back;
}
// Enqueue the script most effective within the editor
wp_enqueue_script(
'bb-weather-bindings-ui',
plugin_dir_url( __FILE__ ) . 'comprises/js/block-bindings-ui.js',
[ 'wp-blocks', 'wp-element', 'wp-dom-ready', 'wp-block-bindings' ],
filemtime( $js_file_path ),
true
);
}
add_action( 'enqueue_block_editor_assets', 'bb_enqueue_weather_bindings_ui' );
Right here’s what this serve as does:
- First, it tests that the
register_block_bindings_source()serve as exists. - Subsequent, it tests that the
block-bindings-ui.jsreport exists within the plugin’s/comprises/jsfolder. - The
wp_enqueue_script()serve as enqueues the script to be used within the editor. For an in depth description of the serve as, please check with the documentation. - It makes use of the
enqueue_block_editor_assetshook to queue scripts for the enhancing interface.
Ora aprite il report block-bindings-ui.js e scrivete il seguente codice:
wp.blocks.registerBlockBindingsSource({
title: 'bb/weather-condition',
label: 'Climate Situation',
useContext: [ 'postId', 'postType' ],
getValues: ( { bindings } ) => {
if ( bindings.content material?.args?.key === 'temperature' ) {
go back {
content material: 'Present temperature supplied by way of Open-Meteo.',
};
}
if ( bindings.content material?.args?.key === 'weather_state' ) {
go back {
content material: 'Present stipulations.',
};
}
go back {
content material: bindings.content material,
};
},
getFieldsList() {
go back [
{ label: 'Temperature (°C)', type: 'string', args: { key: 'temperature' } },
{ label: 'Weather Conditions', type: 'string', args: { key: 'weather_state' } }
];
}
});
- The
registerBlockBindingsSource()serve as registers a binding supply within the block editor. titleis a novel identifier to your binding supply. It should fit precisely the title utilized in PHP withregister_block_bindings_source().labelis a human-readable title displayed within the Supply dropdown of the Attributes panel.useContextunits the context values this supply wishes from the block.postIdis needed in order that the supply is aware of which put up’s meta/climate information to learn.getValuessupplies a preview of the bounded price within the block editor. It returns the choices that seem within the dropdown after the consumer selects the binding supply (“Climate Situation” in our instance). This technique is to be had since WordPress 6.9.getFieldsListreturns the choices that seem within the dropdown after the consumer selects the binding supply (“Climate Prerequisites” in our instance).
Save the report and go back to the editor. Your Climate Prerequisites supply is now to be had within the editor UI, along Submit Meta. Reload the web page, then attach a Paragraph or Header block for your binding supply. The picture underneath presentations the outcome.

The overall symbol presentations the outcome at the web site’s frontend.

What else are you able to do with the Block Bindings API?
This text most effective scratches the skin of what you'll be able to construct with the Block Bindings API. The good factor is that the advance of this tough WordPress function is a long way from over, and we will be expecting new implementations and additions sooner or later.
Integrating the Block Bindings API with different tough WordPress APIs, such because the Interactivity API, means that you can construct dynamic, interactive packages that stretch well past the standard running a blog options that made WordPress widespread in its early years.
WordPress is now not only a running a blog platform or a web site builder. It's now set to transform a multipurpose construction platform for every type of internet packages.
The extra tough your packages are, the extra essential your webhosting carrier turns into. Kinsta provides Top class controlled webhosting with prime efficiency, tough safety, intensive automation, and top-notch reinforce identified as industry-leading by way of G2 customers.
Essentially the most tough internet packages require the most productive webhosting infrastructure. Check out Kinsta plans to search out the only that most nearly fits your website’s wishes.
The put up The WordPress Block Bindings API: What it's and how you can use it to construct dynamic web pages seemed first on Kinsta®.
WP Hosting