WPのブロックエディタでブロック追加用ボタンを表示させる:メモ

理解しきれていませんがエラーなく動作するところまで作れたのでメモとして。

実現したいこと

  • ブロックエディタでブロック追加用ボタンを表示させる

少々わかりにくいと思いますが、ブロックエディタでカラムやグループなど枠を作るブロックを入れると、十字マークのついた空のブロックが表示されると思います。
この十字マークをクリックすることでブロック追加用のポップアップが表示されます。

今回作成したいのはこの初期ブロックのようなブロックです。

サンプルコード


import {
  InnerBlocks,
  store as blockEditorStore,
} from '@wordpress/block-editor';
import { useSelect } from '@wordpress/data';

export default function Edit() {
  const hasInnerBlocks = useSelect(
    ( select ) => {
      const { getBlock } = select( blockEditorStore );
      const block = getBlock( clientId );
      if ( block && block.innerBlocks.length ) {
        return undefined;
      }
      return InnerBlocks.ButtonBlockAppender;
    },
    [ clientId ]
  );

  return (
    <div {...blockProps}>
      <InnerBlocks renderAppender={ hasInnerBlocks } />
    </div>
  );
}

ボタン自体はButtonBlockAppenderが該当しますが、そのままではInnerBlocksの外側に追加されてしまいます。そこでInnerBlocks.ButtonBlockAppenderという形で用いることで、InnerBlocksの内側に表示させることができました。

なお、ブロックが一つでもあればボタンブロックが不要な場合、該当ブロックのInnerBlocks内にブロックがあるかどうかを判定する必要があります。
後述するページのコードを参考にして、InnerBlocksの有無を調べるhasInnerBlocksを作成して用いています。

参考資料

結び

今回のブロックの大元の目的は、InnerBlocksdivなどのラッパー要素で囲んだだけのブロックが必要だったためです。

グループブロックがあるのになぜ作るのかと思われるかもしれませんが、グループブロック内にさらにdivがもう一つ加わったことで、CSSのflexgridが使いにくくなったためです。

無意味にインナー要素を作ったとは考えていませんが、レイアウト用にただの枠が欲しいという時には邪魔になり、使えるブロックがないなら作るしかないと考えた次第です。

0人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄