WordPress のブロックエディタ(Gutenberg)はデフォルトでも便利ですが、カスタマイズすることでさらに使いやすくすることができます。

この記事では、ブロックエディタのインスペクター(右サイドバー)にカラーバリエーションを選べるボタンを追加して、見た目の切り替えが簡単にできるようにする方法を紹介します。

しかもこの方法は、Node.js のインストールなどは一切不要!functions.phpからスクリプトを読み込むだけでOKの、最低限の JavaScript で完結するのがポイントです。

使用バージョン:WordPress 6.8

LINE着せかえ「回るお寿司」販売中!

カスタマイズ方法

今回は例として、見出しブロック(H1~H6)のみを対象としてカラーバリエーションを選べるボタンを追加するコードを紹介します。ステップは全部で 4 つです。

  • JavaScript ファイルの作成と読み込み
  • インスペクターにボタンを追加する
  • ブロックコメントに情報を追加する
  • 出力されるタグにクラスを反映する

JavaScript ファイルの作成と読み込み

まず、JavaScript のファイルを作成し、そのファイルをブロックエディタに読み込むようにします。今回は、テーマフォルダ/js/custom-editor.jsにファイルを作成します。作成したら、functions.phpに以下のように追加します。

add_action('enqueue_block_editor_assets', function() {
  wp_enqueue_script('custom-editor', get_template_directory_uri() . '/js/custom-editor.js');
});

これで、準備はOKです。

インスペクターにボタンを追加するコード

次は、インスペクターに選択ボタンを追加するコードです。作成したcustom-editor.jsに以下のコードを記述します。

// インスペクターにカラー選択ボタンを追加
wp.hooks.addFilter(
  'editor.BlockEdit',
  'my-plugin/heading-color-control',
  wp.compose.createHigherOrderComponent(
    (BlockEdit) => (props) => {
      // 見出し以外ならそのまま返す
      if (props.name !== 'core/heading') return wp.element.createElement(BlockEdit, props);

      const { attributes, setAttributes } = props;
      const { colorClass } = attributes;

      const options = [
        { label: 'デフォルト', value: '' },
        { label: '赤', value: 'red' },
        { label: '黄色', value: 'yellow' },
        { label: '緑', value: 'green' },
      ];

      const handleClick = (value) => {
        // 同じ値をクリックしたらリセット、それ以外ならセット
        if (colorClass === value) {
          setAttributes({ colorClass: '' });
        } else {
          setAttributes({ colorClass: value });
        }
      };

      return wp.element.createElement(
        wp.element.Fragment,
        null,
        wp.element.createElement(BlockEdit, props),
        wp.element.createElement(
          wp.blockEditor.InspectorControls,
          null,
          wp.element.createElement(
            wp.components.PanelBody,
            {
              title: 'カラーバリエーション',
              initialOpen: true // デフォルトで開いているかどうか
            },
            wp.element.createElement(wp.components.ButtonGroup, {},
              options.map((option) =>
                wp.element.createElement(wp.components.Button, {
                  key: option.value || 'default',
                  isPrimary: colorClass === option.value,
                  isSecondary: colorClass !== option.value,
                  onClick: () => handleClick(option.value),
                }, option.label)
              )
            )
          )
        )
      );
    },
    'headingColorControl'
  )
);

これで、ブロックエディタで見出しを選択した際に、インスペクターにボタンが表示されるようになりました。

ブロックコメントに情報を追加するコード

このままだと、ただ押せるボタンがインスペクターに表示されるようになっただけです。次に、ボタンで選んだ値を保存できるように、ブロックコメントに情報を追加するコードをcustom-editor.jsに追記します。

// ブロックコメントに選択した情報を保存
wp.hooks.addFilter(
  'blocks.registerBlockType',
  'my-plugin/heading-color-add-comment',
  function(settings, name) {
    if (name === 'core/heading') {
      settings.attributes = {
        ...settings.attributes,
        colorClass: {
          type: 'string',
          default: '',
        },
      };
    }
    return settings;
  }
);

ブロックコメントとは?

WordPress のブロックエディタは、ブロックの構造を HTML のコメント形式で保存しています。

<!-- wp:heading {"colorClass":"red"} -->
<h2 class="wp-block-heading">見出しタイトル</h2>
<!-- /wp:heading -->

このコメント部分に含まれる JSON のようなデータが、このブロックが持つ追加のデータの情報です。今回の場合、上のコードを追記したことで、ボタンで選んだ値がcolorClassという名前でブロックコメントに保存されるようになりました。

出力されるタグにクラスを反映するコード

最後に、ブロックコメントに保存した値を、出力されるタグに反映するためのコードです。

// タグにクラスを追加
wp.hooks.addFilter(
  'blocks.getSaveContent.extraProps',
  'my-plugin/heading-color-add-tag',
  function(props, blockType, attributes) {
    if (blockType.name === 'core/heading' && attributes.colorClass) {
      const existingClass = props.className || '';
      props.className = `${existingClass} ${attributes.colorClass}`.trim();
    }
    return props;
  }
);

これで、選択した値が実際に出力される HTML に反映されるようになりました。

<!-- wp:heading {"colorClass":"red"} -->
<h2 class="wp-block-heading red">見出しタイトル</h2>
<!-- /wp:heading -->

一つずつコードを追加しながら動作を確認していった場合、「このブロックには、想定されていないか無効なコンテンツが含まれています」というエラーが出るかと思いますが、その場合は復旧のボタンを押してください。

あとは、CSS でクラス名に応じたスタイルを指定すれば完成です!

ブロックエディタ内の要素にもクラスを反映させる場合

上記の手順で、サイト表示側には選択したクラスが付与されるようになりましたが、ブロックエディタ内に表示される要素には、まだ選択したクラスが付いていません。

ブロックエディタの CSS をカスタマイズしている場合は、ここの要素にもクラスが反映されてほしいところです。その場合は以下のコードをcustom-editor.jsに追記してください。

// ブロックエディタ内の要素にクラスを追加
wp.hooks.addFilter(
  'editor.BlockListBlock',
  'my-plugin/heading-color-add-editor',
  function(BlockListBlock) {
    return (props) => {
      if (props.name === 'core/heading') {
        const customClass = props.attributes.colorClass;
        if (customClass) {
          props.className = [props.className, customClass].filter(Boolean).join(' ');
        }
      }
      return wp.element.createElement(BlockListBlock, props);
    };
  }
);

これで、ブロックエディタ内の要素にも選択したクラスが付与されるようになりました。

ブロックエディタに CSS を読み込んでサイト側の見た目と合わせる方法については過去の記事で解説しているので、よかったらそちらもご参照ください!

見出し以外のコアブロックについて

今回は見出しのみを対象にしたコードについて紹介しましたが、core/headingの部分を変更すればその他の要素についても対応可能です。

core/paragraph段落テキストの基本的な文章ブロック。
core/heading見出しH2〜H6の見出しを作成。
core/image画像画像の挿入とキャプション。
core/galleryギャラリー複数画像のレイアウト表示。
core/listリスト箇条書き・番号付きリストの作成。
core/quote引用引用やセリフなど。
core/codeコードプレーンなコード表示。整形される。
core/preformatted整形済みテキスト改行や空白もそのまま表示されるテキストブロック。
core/tableテーブル行と列を持つ表の作成。
core/groupグループ複数ブロックを1つのまとまりとして扱う。

さらに詳しく知りたい方は、WordPress の公式リファレンスをご参照ください。
コアブロックリファレンス – Japanese Team – WordPress.org 日本語

終わりに

今回は、プレーンな JavaScript だけで WordPress のブロックエディタをカスタマイズする方法をご紹介しました。Node.js や JSX の知識がなくても、functions.phpだけでブロックエディタをカスタマイズできるのは大きなメリットです。

これを応用すれば、サイズの切り替え、独自の設定パネルなど、アイディア次第でいろいろ拡張できます。ぜひ、あなたのウェブサイトにも取り入れてみてください!

参考