registerBlockVariationで、WordPressのコアブロックを拡張したブロックを作ってみる

WordPressにはデフォルトでさまざまなブロックが用意されていますが、ブロックをカスタマイズしたい場合もあります。そのようなケースでは、「ブロックの拡張方法」が役立ちます。まず、create-blockコマンドなどを使用してブロックプラグインをセットアップし、registerBlockVariation関数を追加します。これにより新しいブロックが作成されます。また、コードでブロックの設定値をカスタマイズすることもできます。さらに、inserterプロパティを使用すると、コマンドや本文内からもブロックを追加できます。innerBlocksプロパティを利用すると、子ブロックも指定できます。カスタムブロックを作成する際には、保守コストに注意しながら検討することが重要です。

広告ここから
広告ここまで

目次

    WordPressには、デフォルトでさまざまなブロックが用意されています。しかし案件によっては、「このブロックをすこしカスタマイズしたブロックが欲しい。ただ、そのためにReactとかを書くのもなぁ・・・」というケースが稀によくあります。そんな時に使える、「ブロックの拡張方法」をまとめました。

    registerBlockVariationで、既存のブロックをカスタマイズする

    create-blockコマンドなどでブロックプラグインをセットアップした後、src/index.jsregisterBlockVariation関数を追加しましょう。editsaveは必要ありませんので、Reactなどを書く必要はありません。

    import { registerBlockVariation } from '@wordpress/blocks';
    
    registerBlockVariation(
        'core/query', 
        {
            name: "custom-plugin/custom-posts",
            title: "Custom Posts",
            description: "Custom post query",
        }
    )

    とてもシンプルなコードですが、これを保存してビルドするだけで新しいブロックが増えています。

    ブロックの設定値をカスタマイズする

    デフォルトのブロックの値をコードでカスタマイズできます。例えば固定ページのデータを取得するブロックにしたい場合は、attributes.query.postTypepageに設定しましょう。

    registerBlockVariation(
        'core/query', 
        {
            name: "custom-plugin/custom-posts",
            title: "Custom Posts",
            description: "Custom post query",
            attributes: {
                namespace: "custom-plugin/custom-posts",
                query: {
                    postType: 'page',
                }
            }
        }
    )

    この状態でブロックを追加すると、デフォルトで表示するデータが固定ページになっています。

    エディタ内で追加できるようにする

    scopeinserterを設定してみましょう。

    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で対処できるものかどうかをまず検討するフローで進行した方がよいかもしれません。

    参考にした記事

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark