WordPressのカスタムブロックで、子ブロック(InnerBlock)を扱えるようにする覚書
レイアウト系や認証エリアなどの機能を備えたブロックを作成する場合、InnerBlocksを使用する必要があります。InnerBlocksを編集画面に配置し、コードをビルドすると、ブロックの中にブロックを配置できるようになります。保存時にもInnerBlocksに対応し、配置した子ブロックも保存されます。また、allowedBlocksを使用して追加できる子ブロックの種類を制限したり、templateを使用して子ブロックの初期配置をカスタマイズすることもできます。詳細は参考記事をご覧ください。
目次
レイアウト系や認証エリアなどの機能を備えたブロックを作りたい場合、「中にブロックを配置できるブロック」を作る必要があります。その場合に利用するInnerBlock
について簡単にまとめました。
ブロックプラグインはcreate-block
で作成する
ブロックプラグインはcreate-block
を使うのが簡単です。
npx @wordpress/create-block@latest inner-test
編集画面にInnerBlock
を配置する
まず編集画面にブロックを追加できる機能を実装しましょう。といってもsrc/edit.js
にInnerBlocks
コンポーネントを配置するだけです。
import { InnerBlocks, useBlockProps } from '@wordpress/block-editor';
...
export default function Edit() {
return (
<div>
<p { ...useBlockProps() }>
{ __(
'Wp Block Playground – hello from the editor!',
'wp-block-playground'
) }
</p>
<InnerBlocks />
</div>
);
}
配置した状態でコードをビルドすると、ブロックの中にブロックが配置できるようになります。
保存処理をInnerBlock
に対応する
編集した内容を保存できるようにしましょう。こちらもsrc/save.js
にInnerBlocks
コンポーネントを配置するだけです。
import { InnerBlocks, useBlockProps } from '@wordpress/block-editor';
export default function save() {
return (
<div>
<p { ...useBlockProps.save() }>
{ 'Wp Block Playground – hello from the saved content!' }
</p>
<InnerBlocks.Content />
</div>
);
}
これで配置した子ブロックも保存されるようになります。
追加できる子ブロックの種類を指定する
ある程度用途を制限したい場合は、src/edit.js
のInnerBlocks
でallowedBlocks
を指定しましょう。
export default function Edit() {
return (
<div>
<p { ...useBlockProps() }>
{ __(
'Wp Block Playground – hello from the editor!',
'wp-block-playground'
) }
</p>
<InnerBlocks
allowedBlocks={[
'core/heading',
'core/paragraph',
]}
/>
</div>
);
}
このサンプルコードでは、Paragraph
とHeading
ブロックのみ子ブロックとして追加できるようになります。
子ブロックのテンプレートを作る
店舗情報など、ある程度子ブロックの初期配置を決めておきたいケースでは、template
を利用します。次の例ではヘッダー・画像・文章の3ブロックがデフォルトで配置されるように定義しています。
<InnerBlocks
allowedBlocks={[
'core/heading',
'core/paragraph',
'core/image',
]}
template={[
['core/heading', { placeholder: 'Title'}],
['core/image', {}],
['core/paragraph', { placeholder: 'text in here'}]
]}
/>
ブロックを追加するだけで、指定した3ブロックが出てくるようになりました。