The 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. API An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. now recognizes the viewScriptModule
field in block.json
metadata. This provides an experience for script modules that’s analogous to what scripts and the viewScript
field currently provide. The script module declared in viewScriptModule
will be enqueued when a block is rendered for viewing on the frontend.
This new field is important so that developers can use script modules on the frontend. Scripts cannot depend on script modules, so script modules are necessary to use script modules like the Interactivity API (via the @wordpress/interactivity
script module).
Read more: Block metadata viewScriptModule field in 6.5
This post assumes a basic understanding of the Script Modules API, read more about it here.
Getting started
You can generate a simple block 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 using the @wordpress/create-block-interactive-template
package:
npx @wordpress/create-block --template @wordpress/create-block-interactive-template
This will generate an interactive block from a template that uses viewScriptModule
.
Usage
Add a viewScriptModule
field to the metadata in block.json
that points to the script module.
Here’s what a simple plugin might look like:
myplugin/
├── build/
│ ├── block.json
│ ├── …snip…
│ ├── view.asset.php
│ └── view.js
└── plugin.php
The only code in the plugin.php
file calls register_block_type
for the block:
add_action( 'init', function() {
register_block_type( __DIR__ . '/build/block.json' );
} );
The relevant metadata in build/block.json
includes viewScriptModule
:
{
"…snip…": "…",
"viewScriptModule": "file:./view.js"
}
build/view.js
is the script module that depends on @wordpress/interactivity
:
import { getContext, store } from '@wordpress/interactivity';
store( 'myplugin/demo', {
increment() {
getContext().val += 1;
},
decrement() {
getContext().val -= 1;
},
} );
The module asset file build/view.asset.php
declares the view script module’s dependency on @wordpress/interactivity
:
<?php return array(
'dependencies' => array('@wordpress/interactivity'),
);
REST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/.
A new field view_script_module_ids has been added to the Block Types REST API. The field is a list of the view script module IDs associated with a block type.
Tooling
The @wordpress/scripts package
is the standard way of compiling 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/. assets for use in WordPress. Experimental functionality has been added to the build and start scripts to support compiling modules. It can be enabled using --experimental-modules
on the command line, for example:
wp-scripts build --experimental-modules
Script module compilation with @wordpress/scripts
does not support using your own webpack file at this time.
The example plugin above was compiled using the experimental module build with @wordpress/scripts
.
@wordpress/dependency-extraction-webpack-plugin
has been updated to produce script module asset files. No special configuration is required. See the package documentation for details.
Relevant links
Props
#6-5, #dev-notes, #dev-notes-6-5