WordPress 6.8 introduces a new function wp_register_block_types_from_metadata_collection()
, which allows plugins to register multiple block Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. types with a single function call.
This function expands on the foundational capabilities of the wp_register_block_metadata_collection()
function, which was introduced in WordPress 6.7 to improve performance.
Context
To recap the relevant functionality added in WordPress 6.7:
Plugins can now optionally register a PHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher “manifest” file, which includes all the metadata for their block types. For any block type that is being registered, WordPress Core Core is the set of software required to run WordPress. The Core Development Team builds WordPress. will now check whether such a manifest file is present covering the block type, and if so, it will use the data from the manifest file instead of reading and parsing the block type’s block.json JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. file directly.
Since the blocks manifest file includes all the block type names, a logical next step after adding support for such a file is to make the requirement for individual block type registration calls obsolete. This is what the new wp_register_block_types_from_metadata_collection()
function implements.
Benefits
By using the new function, you no longer need to add individual register_block_type()
calls for every block type that you include in your plugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. This improves developer experience, especially when using the latest block development best practices where the block.json
file is used as the sole entrypoint for both PHP (server-side) and JavaScript JavaScript or JS is an object-oriented computer programming language commonly used to create interactive effects within web browsers. WordPress makes extensive use of JS for a better user experience. While PHP is executed on the server, JS executes within a user’s browser. https://www.javascript.com/. (client-side). Adding a new block type to an existing plugin is now possible by creating the block’s directory and working exclusively within that directory. You no longer need to remember to register the block type somewhere else in the PHP codebase of the surrounding plugin.
Example
Let’s say you have a plugin with 5 custom block types: “accordion”, “carousel”, “carousel-slide”, “dialog”, and “icon-button”. At the present, this means your plugin’s PHP code may look like this:
$block_types = array( 'accordion', 'carousel', 'carousel-slide', 'dialog', 'icon-button' );
foreach ( $block_types as $block_type ) {
register_block_type( __DIR__ . "/build/{$block_type}" );
}
With WordPress 6.8, you can now use the wp_register_block_types_from_metadata_collection()
function to eliminate the need for the list of block types in the PHP code so that all block types are recognized and registered automatically.
To do that, you need to generate a manifest file for your block types. You can use the build-blocks-manifest command from the @wordpress/scripts NPM package, which was also explained in the relevant WordPress 6.7 dev note. It can be easily integrated into your build process by changing the scripts in your package.json
file as follows:
- Change the “build” script from
wp-scripts build
to wp-scripts build && wp-scripts build-blocks-manifest
.
- Change the “start” script from
wp-scripts start
to wp-scripts start && wp-scripts build-blocks-manifest
.
With the generated manifest in place, the PHP code above can be simplified to no longer require a hard-coded list of block types:
wp_register_block_types_from_metadata_collection(
__DIR__ . '/build',
__DIR__ . '/build/blocks-manifest.php'
);
Backward compatibility with older WordPress versions
As the wp_register_block_types_from_metadata_collection()
function is only available in the latest WordPress 6.8 release, you may still want to support older WordPress versions. Fortunately, the function can be easily replaced by a few lines of code Lines of code. This is sometimes used as a poor metric for developer productivity, but can also have other uses., as long as you have a generated blocks manifest in place as described above.
Here is a code example that uses the respective best practices for WordPress 6.8, WordPress 6.7, and older versions:
if ( function_exists( 'wp_register_block_types_from_metadata_collection' ) ) {
wp_register_block_types_from_metadata_collection( __DIR__ . '/build', __DIR__ . '/build/blocks-manifest.php' );
} else {
if ( function_exists( 'wp_register_block_metadata_collection' ) ) {
wp_register_block_metadata_collection( __DIR__ . '/build', __DIR__ . '/build/blocks-manifest.php' );
}
$manifest_data = require __DIR__ . '/build/blocks-manifest.php';
foreach ( array_keys( $manifest_data ) as $block_type ) {
register_block_type( __DIR__ . "/build/{$block_type}" );
}
}
The @wordpress/create-block NPM package has been enhanced to use the new functions conditionally, using a similar code snippet as shown above.
Summary and further reading
The new wp_register_block_types_from_metadata_collection()
function is a very simple but neat way to eliminate individual block type registration calls from your PHP code, allowing you to focus exclusively on working on the block types in your plugin without having to modify anything else in the plugin.
Please see the following links for further reading:
- Trac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. ticket Created for both bug reports and feature development on the bug tracker. #62267
- Relevant WordPress 6.7 dev note about the previous block type registration enhancements
Props to @gziolo, @stevenlinx for review and proofreading.
#6-8, #dev-notes, #dev-notes-6-8