API

テンプレートは、JSまたはPHPでブロックタイプの配列(ブロック名とオプションの属性)として宣言できます。

最初のPHPの例では、画像ブロックを含む投稿用のテンプレートを作成します。必要に応じて、テンプレートにブロックを追加したり削除したりできます。

PHPの例:

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

次のJavaScriptの例では、InnerBlocksとテンプレートを使用して新しいブロックを作成し、挿入時にテンプレートに基づいたブロックのセットを作成します。

  1. const el = React.createElement;
  2. const { registerBlockType } = wp.blocks;
  3. const { InnerBlocks } = wp.blockEditor;
  4. const BLOCKS_TEMPLATE = [
  5. [ 'core/image', {} ],
  6. [ 'core/paragraph', { placeholder: 'Image Details' } ],
  7. ];
  8. registerBlockType( 'myplugin/template', {
  9. title: 'My Template Block',
  10. category: 'widgets',
  11. edit: ( props ) => {
  12. return el( InnerBlocks, {
  13. template: BLOCKS_TEMPLATE,
  14. templateLock: false,
  15. } );
  16. },
  17. save: ( props ) => {
  18. return el( InnerBlocks.Content, {} );
  19. },
  20. } );

テンプレートの使用例については、Meta Block Tutorialを参照してください。

Block attributes

テンプレートで定義できるすべてのブロック属性の包括的なリストを見つけるには、ブロックのblock.jsonファイルを参照し、attributesおよびsupportsの値を確認してください。

たとえば、packages/block-library/src/heading/block.jsonは、ブロックにlevel属性があり、anchorパラメータをサポートしていることを示しています。

Gutenbergプラグインがインストールされていない場合は、block.jsonファイルをwp-includes/blocks/heading/block.json内で見つけることができます。

Custom post types

カスタム投稿タイプは、登録中に独自のテンプレートを登録できます:

  1. function myplugin_register_book_post_type() {
  2. $args = array(
  3. 'public' => true,
  4. 'label' => 'Books',
  5. 'show_in_rest' => true,
  6. 'template' => array(
  7. array( 'core/image', array(
  8. 'align' => 'left',
  9. ) ),
  10. array( 'core/heading', array(
  11. 'placeholder' => 'Add Author...',
  12. ) ),
  13. array( 'core/paragraph', array(
  14. 'placeholder' => 'Add Description...',
  15. ) ),
  16. ),
  17. );
  18. register_post_type( 'book', $args );
  19. }
  20. add_action( 'init', 'myplugin_register_book_post_type' );

Locking

時には、UI上でテンプレートをロックして、表示されるブロックが操作できないようにすることが意図される場合があります。これは、template_lockプロパティを使用して実現されます。

  1. function myplugin_register_template() {
  2. $post_type_object = get_post_type_object( 'post' );
  3. $post_type_object->template = array(
  4. array( 'core/paragraph', array(
  5. 'placeholder' => 'Add Description...',
  6. ) ),
  7. );
  8. $post_type_object->template_lock = 'all';
  9. }
  10. add_action( 'init', 'myplugin_register_template' );

オプション:

  • contentOnly — すべての操作を防止します。さらに、コンテンツを持たないブロックタイプはリストビューから隠され、ブロックリスト内でフォーカスを得ることができません。他のロックタイプとは異なり、これは子によってオーバーライドできません。
  • all — すべての操作を防止します。新しいブロックを挿入したり、既存のブロックを移動したり、ブロックを削除したりすることはできません。
  • insert — ブロックの挿入または削除を防止しますが、既存のブロックを移動することは許可されます。

ロック設定はInnerBlocksによって継承されることがあります。InnerBlocksエリアにtemplateLockが設定されていない場合、親InnerBlocksエリアのロックが使用されます。ブロックがトップレベルのブロックである場合、現在の投稿タイプのロック設定が使用されます。

Individual block locking

テンプレートレベルのロックに加えて、個々のブロックをロックすることもできます。これは、属性レベルでlock属性を使用して行うことができます。ブロックレベルのロックはtemplateLock機能よりも優先されます。現在、ブロックの移動と削除をロックできます。

  1. attributes: {
  2. // Prevent a block from being moved or removed.
  3. lock: {
  4. remove: true,
  5. move: true,
  6. }
  7. }

オプション:

  • remove — ブロックを削除できないようにロックします。
  • move — ブロックを移動できないようにロックします。

これをtemplateLockと組み合わせて、falseremoveまたはmoveで使用することで、単一のブロックを除くすべてのブロックをロックできます。

  1. $template = array(
  2. array( 'core/image', array(
  3. 'align' => 'left',
  4. ) ),
  5. array( 'core/heading', array(
  6. 'placeholder' => 'Add Author...',
  7. ) ),
  8. // Allow a Paragraph block to be moved or removed.
  9. array( 'core/paragraph', array(
  10. 'placeholder' => 'Add Description...',
  11. 'lock' => array(
  12. 'move' => false,
  13. 'remove' => false,
  14. ),
  15. ) ),
  16. );

Nested templates

カラムブロックのようなコンテナブロックもテンプレートをサポートしています。これは、ブロックにネストされたテンプレートを割り当てることで実現されます。

  1. $template = array(
  2. array( 'core/paragraph', array(
  3. 'placeholder' => 'Add a root-level paragraph',
  4. ) ),
  5. array( 'core/columns', array(), array(
  6. array( 'core/column', array(), array(
  7. array( 'core/image', array() ),
  8. ) ),
  9. array( 'core/column', array(), array(
  10. array( 'core/paragraph', array(
  11. 'placeholder' => 'Add a inner paragraph'
  12. ) ),
  13. ) ),
  14. ) )
  15. );