registerBlockVariationで、WordPressのコアブロックを拡張したブロックを作ってみる
WordPressにはデフォルトでさまざまなブロックが用意されていますが、ブロックをカスタマイズしたい場合もあります。そのようなケースでは、「ブロックの拡張方法」が役立ちます。まず、create-blockコマンドなどを使用してブロックプラグインをセットアップし、registerBlockVariation関数を追加します。これにより新しいブロックが作成されます。また、コードでブロックの設定値をカスタマイズすることもできます。さらに、inserterプロパティを使用すると、コマンドや本文内からもブロックを追加できます。innerBlocksプロパティを利用すると、子ブロックも指定できます。カスタムブロックを作成する際には、保守コストに注意しながら検討することが重要です。
目次
WordPressには、デフォルトでさまざまなブロックが用意されています。しかし案件によっては、「このブロックをすこしカスタマイズしたブロックが欲しい。ただ、そのためにReactとかを書くのもなぁ・・・」というケースが稀によくあります。そんな時に使える、「ブロックの拡張方法」をまとめました。
registerBlockVariation
で、既存のブロックをカスタマイズする
create-block
コマンドなどでブロックプラグインをセットアップした後、src/index.js
にregisterBlockVariation
関数を追加しましょう。edit
やsave
は必要ありませんので、Reactなどを書く必要はありません。
import { registerBlockVariation } from '@wordpress/blocks';
registerBlockVariation(
'core/query',
{
name: "custom-plugin/custom-posts",
title: "Custom Posts",
description: "Custom post query",
}
)
とてもシンプルなコードですが、これを保存してビルドするだけで新しいブロックが増えています。
ブロックの設定値をカスタマイズする
デフォルトのブロックの値をコードでカスタマイズできます。例えば固定ページのデータを取得するブロックにしたい場合は、attributes.query.postType
をpage
に設定しましょう。
registerBlockVariation(
'core/query',
{
name: "custom-plugin/custom-posts",
title: "Custom Posts",
description: "Custom post query",
attributes: {
namespace: "custom-plugin/custom-posts",
query: {
postType: 'page',
}
}
}
)
この状態でブロックを追加すると、デフォルトで表示するデータが固定ページになっています。
エディタ内で追加できるようにする
scope
にinserter
を設定してみましょう。
registerBlockVariation(
'core/query',
{
name: "custom-plugin/custom-posts",
title: "Custom Posts",
description: "Custom post query",
attributes: {
namespace: "custom-plugin/custom-posts",
query: {
postType: 'page',
}
},
scope: ['inserter']
}
)
するとコマンドや本文内からも追加できるようになります。
子ブロックの内容も指定する
innerBlocks
を利用して、クエリーブロックで追加する子ブロックも指定できます。
registerBlockVariation(
'core/query',
{
name: "custom-plugin/custom-posts",
title: "Custom Posts",
description: "Custom post query",
attributes: {
namespace: "custom-plugin/custom-posts",
query: {
postType: 'page',
}
},
scope: ['inserter'],
innerBlocks: [
[
'core/post-template',
{},
[ [ 'core/post-title' ], [ 'core/post-excerpt' ] ],
],
[ 'core/query-pagination' ],
[ 'core/query-no-results' ],
],
}
)
この設定では、次のようなブロックがデフォルトで設定されています。
触ってみて
カスタムブロックを作ることで、自由にエディタや表示をカスタマイズできます。ただし作れば作るほどブロックの保守コストが発生するため、カスタマイズ内容によっては、registerBlockVariation
で対処できるものかどうかをまず検討するフローで進行した方がよいかもしれません。