【WordPress】Gutenbergに見出しテンプレートやショートコードを挿入できるカスタムブロックを追加する方法

【WordPress】Gutenbergに見出しテンプレートやショートコードを挿入できるカスタムブロックを追加する方法 WordPress

WordPressのGutenberg(ブロックエディタ)では、独自のカスタムブロックを追加することで、よく使う定型文やショートコードをワンクリックで挿入できるようになります。

この記事では、Gutenbergにオリジナルの「テンプレート挿入ボタン付きブロック」を作成し、見出しや本文を手軽に挿入する方法を紹介します。

スポンサーリンク

ブロック開発に必要な準備

まずはWordPressテーマ内に block-template などのフォルダを作成し、必要なJavaScriptファイルやブロック情報を配置します。

以下は構成例です:

ディレクトリ構成
/your-theme/
├── functions.php
└── block-template/
    └── block.js

functions.php にスクリプト読み込みを追加

テーマの functions.php に以下を追加して、Gutenberg用スクリプトを読み込みます。

functions.php:ブロックの登録
<?php
function register_custom_gutenberg_block() {
    wp_register_script(
        'custom-template-block',
        get_template_directory_uri() . '/block-template/block.js',
        array( 'wp-blocks', 'wp-element', 'wp-data' ),
        filemtime( get_template_directory() . '/block-template/block.js' )
    );

    register_block_type( 'mytheme/template-button', array(
        'editor_script' => 'custom-template-block',
    ) );
}
add_action( 'init', 'register_custom_gutenberg_block' );
?>

block.js の内容(カスタムブロックの定義)

block.js に以下のような内容を記述し、テンプレートを挿入するボタン付きのブロックを作成します。

block.js:テンプレート挿入ブロック
(function (blocks, element, data) {
    var el = element.createElement;
    var createBlock = blocks.createBlock;

    blocks.registerBlockType('mytheme/template-button', {
        title: 'テンプレート挿入',
        icon: 'editor-insertmore',
        category: 'widgets',
        edit: function (props) {
            return el(
                'button',
                {
                    className: 'components-button is-primary',
                    onClick: function () {
                        var headingBlock = createBlock('core/heading', {
                            content: '見出しタイトル',
                            level: 2
                        });
                        var paragraphBlock = createBlock('core/paragraph', {
                            content: 'ここに本文を入力してください。'
                        });

                        // このブロック自身を、生成した実ブロックに置き換える
                        data.dispatch('core/block-editor').replaceBlock(
                            props.clientId,
                            [headingBlock, paragraphBlock]
                        );
                    }
                },
                'テンプレートを挿入'
            );
        },
        save: function () {
            return null; // クリック後に実ブロックへ置き換わるため出力不要
        }
    });
})(
    window.wp.blocks,
    window.wp.element,
    window.wp.data
);
RichText.insert()は存在しないAPI
RichTextはReactコンポーネント(<RichText value={...} onChange={...} />のようにJSXで使う)であり、静的なinsert()メソッドは存在しません。ボタンのクリック時に生のHTML文字列を挿入したい場合は、wp.blocks.createBlock()で実際のネイティブブロック(core/heading・core/paragraphなど)を生成し、wp.data.dispatch('core/block-editor').replaceBlock()でこのユーティリティブロック自体をその実ブロックに置き換えるのが正しい方法です。こうすることで、挿入されたブロックは通常のブロックとして正しく保存・表示されます。

このカスタムブロックを使うことで、「テンプレートを挿入」ボタンをGutenberg上に追加し、クリックするだけで見出し・段落ブロックを本文に追加できます。

よくある質問(FAQ)

QPHPのみでGutenbergカスタムブロックを動的に登録する最小構成は?
Aregister_block_type()にrender_callbackを指定します。block.jsonでブロックのメタデータを定義し、register_block_type(__DIR__ . ‘/block.json’)として登録します。JavaScriptのeditコンポーネントは別途必要です。
Q@wordpress/create-blockで生成したスキャフォールドの構成は?
Asrc/edit.js(エディターUI)・src/save.js(フロント出力)・src/index.js(ブロック登録)・block.json(メタデータ)・src/style.scss(スタイル)の基本構成です。
Qカスタムブロックをプラグインではなくテーマに含めるには?
Aテーマのfunctions.phpでregister_block_type()を呼び出します。ブロック単位でスタイルシートを読み込みたい場合はwp_enqueue_block_style()(WordPress 5.9以降)が使えます。テーマに含めるとテーマ削除時にブロックも無効になります。

まとめ

Gutenbergでは、カスタムブロックを使って投稿エディタにテンプレートを簡単に挿入できるボタンを追加できます。よく使う定型文や構造がある場合は、エディタの操作性を高めるために、こうしたカスタマイズを導入すると便利です。ボタンのクリック時には、実際のネイティブブロックに置き換える設計にすることで、保存・表示まで正しく機能させられます。

本格的な開発には @wordpress/create-block パッケージを使ったブロックプラグイン開発もおすすめですが、テーマ内で軽量に実装したい場合は今回の方法で十分対応可能です。