【WordPress】ブロックエディタでカスタムクラスを選択できるようにする方法

【WordPress】ブロックエディタでカスタムクラスを選択できるようにする方法 WordPress

WordPressのブロックエディタ(Gutenberg)では、標準でも「追加CSSクラス」を手動で入力できますが、選択式でカスタムクラスを設定できると、誤入力を防ぎながら統一感のあるデザインを保つことができます。この記事では、カスタムクラスをドロップダウンで選べるようにするカスタマイズ方法を解説します。

スポンサーリンク

ブロックにカスタムクラス選択機能を追加するメリット

ブロックごとに事前に用意したクラス名を選択できるようにすると、以下のようなメリットがあります。

  • 誤ったクラス名の入力を防げる
  • 編集者が統一されたスタイルを選べる
  • スタイルの管理がしやすくなる

Step1:テーマにJavaScriptファイルを追加する

まずはブロックエディタにカスタムJSを読み込む準備をします。functions.php に以下を追加してください。

functions.php:エディタ用スクリプトの読み込み
function custom_block_class_control_enqueue_assets() {
  wp_enqueue_script(
    'custom-block-class-control',
    get_template_directory_uri() . '/js/block-class-control.js',
    array('wp-blocks', 'wp-dom-ready', 'wp-edit-post'),
    null,
    true
  );
}
add_action('enqueue_block_editor_assets', 'custom_block_class_control_enqueue_assets');
関数名はフック名と一致させない
コールバック関数名をアタッチ先のフック名(enqueue_block_editor_assets)と全く同じにすると、他のプラグインやテーマの別の場所で同名の関数が定義された場合に「Cannot redeclare」という致命的エラーになるリスクがあります。関数名には必ずテーマ・プラグイン固有のプレフィックスを付けましょう。

Step2:block-class-control.js の作成

/js/block-class-control.js に以下のコードを記述します。

js/block-class-control.js:カスタムクラス選択コントロール
(function (wp) {
  const { addFilter } = wp.hooks;
  const { Fragment } = wp.element;
  const { InspectorControls } = wp.blockEditor;
  const { PanelBody, SelectControl } = wp.components;

  const customClassOptions = [
    { label: '選択なし', value: '' },
    { label: '赤文字', value: 'is-red' },
    { label: '太字', value: 'is-bold' },
    { label: '枠付き', value: 'has-border' },
  ];

  const withCustomClassControl = wp.compose.createHigherOrderComponent((BlockEdit) => {
    return (props) => {
      if (!props.isSelected || !props.name.startsWith('core/')) {
        return <BlockEdit {...props} />;
      }

      const currentClass = props.attributes.className || '';

      return (
        <Fragment>
          <BlockEdit {...props} />
          <InspectorControls>
            <PanelBody title="カスタムクラス" initialOpen={true}>
              <SelectControl
                label="スタイル選択"
                value={currentClass}
                options={customClassOptions}
                onChange={(value) => {
                  props.setAttributes({ className: value });
                }}
              />
            </PanelBody>
          </InspectorControls>
        </Fragment>
      );
    };
  }, 'withCustomClassControl');

  addFilter(
    'editor.BlockEdit',
    'custom/block-class-control',
    withCustomClassControl
  );
})(window.wp);
読み込まれていないlodashを参照するとスクリプト全体が停止する
const { assign } = lodash;のようにlodashグローバルを参照するコードが元は含まれていましたが、wp_enqueue_script()の依存配列(wp-blocks・wp-dom-ready・wp-edit-post)にはlodashが含まれておらず、これらのパッケージ経由でも間接的に読み込まれません(WordPressコアは既にlodash依存を排除済みです)。読み込まれていないグローバルを参照するとReferenceError: lodash is not definedが発生し、それより後にあるaddFilter()の登録処理も実行されず、機能全体が動作しなくなります。今回使用するaddFilter・Fragment・InspectorControls・PanelBody・SelectControl・createHigherOrderComponentはいずれもwp-edit-postの依存関係経由で問題なく読み込まれるため、未使用だったlodashの参照は削除しています。

Step3:CSSを追加する

選択されたクラスに応じたスタイルをテーマのCSSファイルなどに定義しておきましょう。

style.css:カスタムクラスのスタイル
.is-red {
  color: red;
}
.is-bold {
  font-weight: bold;
}
.has-border {
  border: 1px solid #ccc;
  padding: 10px;
}

よくある質問(FAQ)

QGutenbergで独自のCSSクラスをドロップダウンで選択できるUIを追加するには?
Aregister_block_style()でブロックスタイルバリエーションを追加します。またはブロックのAdditional CSS classにクラス名を手動入力する標準機能も使えます。より高度なUIにはJavaScriptでeditor.BlockEditフィルターやPluginDocumentSettingPanelを追加します。
Q全てのブロックに共通のカスタムクラスセレクターを追加するには?
AregisterBlockTypeのsupports.classNameがtrueであることを確認し、blocks.registerBlockType フィルターで全ブロックのattributesにカスタム属性を追加します。
Q選択したクラスをブロックのHTML出力に反映するには?
ADynamic Blockのrender_callback内でget_block_wrapper_attributes()を使います。Static Blockのsave関数ではuseBlockProps({className: attributes.customClass})として出力します。

まとめ

Gutenbergブロックにカスタムクラスの選択機能を追加することで、編集者はスタイルの統一がしやすくなり、手入力によるミスも防げます。特に複数の編集者で運用するサイトや、スタイルガイドに従いたいサイトにおいて非常に有効なカスタマイズです。エディタ用スクリプトを読み込む際は、実際に使用するグローバル変数がすべて依存関係でカバーされているか確認しましょう。