許可されたブロック

allowedBlocks プロパティを使用すると、block.jsonallowedBlocks フィールドに加えて、このブロックの直接の子孫として挿入できるブロックをさらに制限できます。これは、各ブロックごとに動的に許可されたブロックのリストを決定するのに役立ちます。たとえば、ブロック属性によって決定されます:

  1. const { allowedBlocks } = attributes;
  2. //...
  3. <InnerBlocks allowedBlocks={ allowedBlocks } />;

許可されたブロックのリストが常に同じである場合は、代わりに allowedBlocks ブロック設定 を使用してください。

方向

デフォルトでは、InnerBlocks はそのブロックが縦のリストで表示されることを期待します。有効な使用例は、内側のブロックが横に表示されるようにスタイルを設定することです。たとえば、内側のブロックラッパーに CSS フレックスまたはグリッドプロパティを追加することによってです。このようにブロックがスタイル設定されている場合、orientation プロパティを設定して、横レイアウトが使用されていることを示すことができます:

  1. <InnerBlocks orientation="horizontal" />

このプロパティを指定しても内側のブロックのレイアウトには影響しませんが、子ブロックのブロックムーバーアイコンが横に表示され、ドラッグアンドドロップが正しく機能することが保証されます。

デフォルトブロック

デフォルトでは、InnerBlocks はブロックアペンダーがクリックされたときに許可されたブロックのリストを開きます。defaultBlock プロパティを使用して、初期のブロックアペンダーがクリックされたときに挿入されるデフォルトブロックとその属性を変更できます。たとえば:

  1. <InnerBlocks defaultBlock={['core/paragraph', {placeholder: "Lorem ipsum..."}]} directInsert />

デフォルトでは、この動作は directInsert プロパティが true に設定されるまで無効です。これにより、デフォルトブロックを挿入すべきかどうかの条件を指定できます。

テンプレート

テンプレートプロパティを使用して、挿入時に InnerBlocks コンポーネントを事前に埋めるブロックのセットを定義します。ブロックに属性を設定してその使用を定義できます。以下の例は、InnerBlocks コンポーネントを使用した書評テンプレートで、ブロックの使用を示すためにプレースホルダー値を設定しています。

  1. const MY_TEMPLATE = [
  2. [ 'core/image', {} ],
  3. [ 'core/heading', { placeholder: 'Book Title' } ],
  4. [ 'core/paragraph', { placeholder: 'Summary' } ],
  5. ];
  6. //...
  7. edit: () => {
  8. return (
  9. <InnerBlocks
  10. template={ MY_TEMPLATE }
  11. templateLock="all"
  12. />
  13. );
  14. },

templateLock プロパティを使用してテンプレートをロックします。all を使用すると、テンプレートが完全にロックされ、変更できなくなります。insert を使用すると、追加のブロックの挿入が防止されますが、既存のブロックは再配置できます。詳細については、templateLock ドキュメントを参照してください。

投稿テンプレート

InnerBlocks とは無関係ですが、ここで言及する価値があります。投稿タイプによって 投稿テンプレート を作成でき、ブロックエディターを一連のブロックで事前にロードします。

InnerBlocks テンプレートは、作成した単一ブロック内のコンポーネント用であり、投稿の残りはユーザーが好きなブロックを含めることができます。投稿テンプレートを使用すると、定義したテンプレートだけに投稿全体をロックできます。

  1. add_action( 'init', function() {
  2. $post_type_object = get_post_type_object( 'post' );
  3. $post_type_object->template = array(
  4. array( 'core/image' ),
  5. array( 'core/heading' )
  6. );
  7. } );

ブロック内の親、先祖、子供の関係を使用する

InnerBlocks を使用する一般的なパターンは、親ブロックが挿入されている場合にのみ利用可能なカスタムブロックを作成することです。これにより、ビルダーはブロック間の関係を確立し、ネストされたブロックの発見可能性を制限できます。ビルダーが使用できる関係は、parentancestor、および allowedBlocks の 3 つです。違いは次のとおりです:

  • parent を割り当てると、ネストされたブロックは 親の直接の子孫 としてのみ使用および挿入できることを示します。
  • ancestor を割り当てると、ネストされたブロックは 親の子孫 としてのみ使用および挿入できることを示します。
  • allowedBlocks を割り当てると、逆方向の関係を示します。つまり、どのブロックがこのブロックの 直接の子孫 として使用および挿入できるかを示します。

parentancestor の主な違いは、parent がより細かい特異性を持ち、ancestor はネストされた階層においてより大きな柔軟性を持つことです。

親ブロック関係の定義

これの例は、parent ブロック設定が割り当てられたカラムブロックです。これにより、カラムブロックは親のカラムブロック内のネストされた直接の子孫としてのみ利用可能になります。そうでなければ、カラムブロックはブロックインサータ内のオプションとして利用できません。参照用に カラムコード を参照してください。

直接の子孫ブロックを定義する場合は、parent ブロック設定を使用して、どのブロックが親であるかを定義します。これにより、ネストされたブロックが定義された InnerBlock の外でインサータに表示されるのを防ぎます。

  1. {
  2. "title": "Column",
  3. "name": "core/column",
  4. "parent": [ "core/columns" ],
  5. // ...
  6. }

先祖ブロック関係の定義

これの例は、ancestor ブロック設定が割り当てられたコメント著者名ブロックです。これにより、コメント著者名ブロックは先祖のコメントテンプレートブロック内のネストされた子孫としてのみ利用可能になります。そうでなければ、コメント著者名ブロックはブロックインサータ内のオプションとして利用できません。参照用に コメント著者名コード を参照してください。

ancestor 関係により、コメント著者名ブロックは階層ツリーのどこにでも配置でき、親のコメントテンプレートブロックの直接の子供だけではなく、ブロックインサータ内での利用可能性を制限し、コメントテンプレートブロックが利用可能な場合にのみ挿入オプションとして表示されます。

子孫ブロックを定義する場合は、ancestor ブロック設定を使用します。これにより、ネストされたブロックが定義された InnerBlock の外でインサータに表示されるのを防ぎます。

  1. {
  2. "title": "Comment Author Name",
  3. "name": "core/comment-author-name",
  4. "ancestor": [ "core/comment-template" ],
  5. // ...
  6. }

子ブロック関係の定義

これの例は、allowedBlocks ブロック設定が割り当てられたナビゲーションブロックです。これにより、ナビゲーションブロックの直接の子孫として利用可能なブロックタイプの特定のサブセットのみが利用可能になります。参照用に ナビゲーションコード を参照してください。

allowedBlocks 設定は、カスタムブロックのビルダーによって拡張できます。カスタムブロックは、blocks.registerBlockType フィルターにフックして、ナビゲーションの利用可能な子供に自分自身を追加できます。

可能な子孫ブロックのセットを定義する場合は、allowedBlocks ブロック設定を使用します。これにより、新しい子ブロックを挿入する際にインサータに表示されるブロックが制限されます。

  1. {
  2. "title": "Navigation",
  3. "name": "core/navigation",
  4. "allowedBlocks": [ "core/navigation-link", "core/search", "core/social-links", "core/page-list", "core/spacer" ],
  5. // ...
  6. }

React フックの使用

InnerBlocks コンポーネントの代わりに、useInnerBlocksProps という React フックを使用できます。このフックを使用すると、内側のブロック領域のマークアップをより制御できます。

useInnerBlocksProps は、@wordpress/block-editor パッケージからエクスポートされ、InnerBlocks コンポーネント自体と同様に、コンポーネントが行うすべてのことをサポートします。また、useBlockProps フックのように機能します。

基本的な useInnerBlocksProps フックの使用法は次のとおりです。

  1. import { registerBlockType } from '@wordpress/blocks';
  2. import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';
  3. registerBlockType( 'gutenberg-examples/example-06', {
  4. // ...
  5. edit: () => {
  6. const blockProps = useBlockProps();
  7. const innerBlocksProps = useInnerBlocksProps();
  8. return (
  9. <div { ...blockProps }>
  10. <div {...innerBlocksProps} />
  11. </div>
  12. );
  13. },
  14. save: () => {
  15. const blockProps = useBlockProps.save();
  16. const innerBlocksProps = useInnerBlocksProps.save();
  17. return (
  18. <div { ...blockProps }>
  19. <div {...innerBlocksProps} />
  20. </div>
  21. );
  22. },
  23. } );

このフックは、useBlockProps フックから返されたオブジェクトを useInnerBlocksProps フックに渡すこともできます。これにより、作成する必要のある要素の数が減ります。

  1. import { registerBlockType } from '@wordpress/blocks';
  2. import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';
  3. registerBlockType( 'gutenberg-examples/example-06', {
  4. // ...
  5. edit: () => {
  6. const blockProps = useBlockProps();
  7. const innerBlocksProps = useInnerBlocksProps( blockProps );
  8. return (
  9. <div {...innerBlocksProps} />
  10. );
  11. },
  12. save: () => {
  13. const blockProps = useBlockProps.save();
  14. const innerBlocksProps = useInnerBlocksProps.save( blockProps );
  15. return (
  16. <div {...innerBlocksProps} />
  17. );
  18. },
  19. } );

上記のコードは、エディターで次のマークアップをレンダリングします:

  1. <div>
  2. <!-- Inner Blocks get inserted here -->
  3. </div>

フックアプローチを使用するもう一つの利点は、返された値が単なるオブジェクトであり、オブジェクトから React 子供を取得するために分解できることです。このプロパティには、実際の子内ブロックが含まれているため、内側のブロックと同じレベルに要素を配置できます。

  1. import { registerBlockType } from '@wordpress/blocks';
  2. import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';
  3. registerBlockType( 'gutenberg-examples/example-06', {
  4. // ...
  5. edit: () => {
  6. const blockProps = useBlockProps();
  7. const { children, ...innerBlocksProps } = useInnerBlocksProps( blockProps );
  8. return (
  9. <div {...innerBlocksProps}>
  10. { children }
  11. <!-- Insert any arbitrary html here at the same level as the children -->
  12. </div>
  13. );
  14. },
  15. // ...
  16. } );
  1. <div>
  2. <!-- Inner Blocks get inserted here -->
  3. <!-- The custom html gets rendered on the same level -->
  4. </div>