Since WordPress 5.9, there is the new function wp_enqueue_block_style to enqueue block styles only if necessary, which means only if the associated block is rendered on the current page. While this is a huge benefit, there is no support for scripts. So if your block requires certain JavaScript only for the frontend, there’s no ready-to-use function within WordPress.

Fortunately, WordPress 5.9 also added the attribute view_script to the register_block_type function, which allows to set a script handle, that is only enqueued if the associated block is rendered on the current page. With WordPress 6.1, this attribute has been deprecated in favor of the new view_script_handles, which allows defining multiple script handles to add. So for compatibility reasons, we can use both variants for now:

register_block_type(
	'my/block',
	[
		// since WP 5.9
		'view_script' => 'my-block-script',
		// since WP 6.1
		'view_script_handles' => [
			'my-block-script',
		],
	],
);
Code language: PHP (php)

Here we register the block my/block (I left out the other attributes here) and define a view script with the handle my-block-script. This function can be called outside of any hooks.

We now need to make sure our frontend script is registered as per usual:

/**
 * Register frontend assets.
 */
public function my_register_frontend_assets(): void {
	$file_path = plugin_dir_path( __FILE__ ) . 'assets/js/file.js';
	$file_url = plugin_dir_url( __FILE__ ) . 'assets/js/file.js';
	
	wp_register_script( 'my-block-script', $file_url, [], filemtime( $file_path ), true );
}

add_action( 'init', 'my_register_frontend_assets' );
Code language: PHP (php)

Since the view script is enqueued via wp_enqueue_scripts, make sure you register your script before that and see the magic happen. ✨

Leave a Reply

Your email address will not be published. Required fields are marked *

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Learn more about webmentions)