WordPress のブロックは通常プラグインにバンドルされ、block.json メタデータを使用してサーバーサイドとクライアントサイドの両方で登録されます。
ブロックはクライアントサイドのみに登録できますが、ベストプラクティスとして、サーバーとクライアントの両方で登録することを強く推奨します。この2つの登録により、動的レンダリング、ブロックサポート、ブロックフック、スタイルバリエーションなどのサーバーサイドの機能が可能となるため、非常に重要です。サーバーサイドに登録がなければ、これらの機能は正しく動作しません。
例えば、あるブロックを theme.json を介してスタイルを設定するには、そのブロックをサーバに登録する必要があります。そうしなければ、ブロックは theme.json で割り当てられたスタイルを認識、適用できません。
次の図は、ブロックの登録プロセスの詳細を示します。

PHP によるブロックの登録 (サーバーサイド)
サーバー上でのブロック登録は通常、プラグインのメイン PHP ファイルの、init フックで呼ばれる register_block_type() 関数で行われます。この関数は block.json ファイルに保存されたメタデータを読み込むことで、ブロックタイプの登録を簡素化します。
この関数はブロックタイプの登録のために設計されており、このコンテキストでは主に2つのパラメータを使用しますが、より多くのバリエーションがあります。
$block_type(string):block.jsonファイルがあるディレクトリへのパスか、名前が異なる場合はメタデータファイルの完全なパスです。このパラメータは WordPress にブロックの構成の場所を伝えます。$args(array): オプションのパラメータで、ブロックタイプの追加の引数を指定できます。デフォルトでは空の配列ですが、様々なオプションを指定でき、その1つが$render_callbackです。このコールバックはフロントエンドでのブロックのレンダーに使用され、block.jsonのrenderプロパティの代替となります。
開発プロセスにおいて、block.json ファイルは通常、コードのコンパイルの一環として src (ソース) ディレクトリから build (ビルド) ディレクトリに移動されます。このため、ブロックを登録する際には、 $block_type パスが build ディレクトリ内の block.json ファイルを指していることを確認してください。
register_block_type() 関数は成功すると登録したブロックタイプ (WP_Block_Type) を返し、失敗すると false を返します。以下は render_callback を使用した簡単な例です。
register_block_type(
__DIR__ . '/build',
array(
'render_callback' => 'render_block_core_notice',
)
);
以下は init フックを含む、より完全な例です。
function minimal_block_ca6eda___register_block() {
register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'minimal_block_ca6eda___register_block' );
JavaScript によるブロックの登録(クライアントサイド)
ブロックがすでにサーバーに登録されている場合は、@wordpress/blocks パッケージの registerBlockType メソッドを使用して、JavaScript でクライアントサイドの設定を登録するだけで済みます。一点、ブロックの block.json ファイルで定義されたブロック名と同じ名前を使用することに注意してください。以下はその例です。
import { registerBlockType } from '@wordpress/blocks';
registerBlockType( 'my-plugin/notice', {
edit: Edit,
// ... 他のクライアントサイドの設定
} );
一般には、メタデータファイルを使用する利点 セクションで説明した特徴により、PHP を使用したサーバー上でのブロックの登録が推奨ですが、クライアントサイドのみでブロックを登録することもできます。registerBlockType メソッドを使用すると、メタデータを使用してブロックタイプを登録できます。
関数は2つの引数を取ります。
$blockNameOrMetadata(string|Object): ブロックタイプ名の文字列か、ブロックのメタデータを含むオブジェクト。メタデータは通常block.jsonファイルから読み込まれます。$settings(Object): ブロックのクライアントサイドの設定を含むオブジェクト。
wp-scriptsなどのビルドプロセスを使用する場合には、block.jsonの内容 (またはその他の.jsonファイルの内容) を直接 JavaScript ファイル内にインポートできます。
2番目のパラメータとして渡される settings オブジェクトには多くのプロパティがありますが、最も重要なのは以下の2つです。
edit: ブロックのエディターで使用される React コンポーネント。save: データベースに保存される静的な HTML マークアップを返す関数。
registerBlockType() 関数は成功した場合に登録したブロックタイプ (WPBlock)、失敗した場合に undefined を返します。以下に例を示します。
import { registerBlockType } from '@wordpress/blocks';
import { useBlockProps } from '@wordpress/block-editor';
import metadata from './block.json';
const Edit = () => <p { ...useBlockProps() }>Hello World - Block Editor</p>;
const save = () => <p { ...useBlockProps.save() }>Hello World - Frontend</p>;
registerBlockType( metadata.name, {
edit: Edit,
save,
} );
その他の情報
register_block_typePHP 関数registerBlockTypeJS 関数- Why a block needs to be registered in both the server and the client?(なぜブロックはサーバーとクライアントの両方に登録する必要があるのか ?) | GitHub での議論
- ブロック登録の図解