ブロックコンテキストの定義

ブロックコンテキストは、ブロックの登録設定で定義されます。ブロックはコンテキスト値を提供するか、継承したい値を消費することができます。

ブロックコンテキストの提供

ブロックは、登録設定に providesContext プロパティを割り当てることでコンテキスト値を提供できます。これは、コンテキスト名をブロック自身の属性の1つにマッピングするオブジェクトです。その属性値に対応する値は、子孫ブロックに利用可能であり、同じコンテキスト名で参照できます。現在、ブロックコンテキストはブロック自身の属性から派生した値のみをサポートしています。将来的には、追加のコンテキスト値のソースをサポートするように拡張される可能性があります。

  1. attributes: {
  2. recordId: {
  3. type: 'number',
  4. },
  5. },
  6. providesContext: {
  7. 'my-plugin/recordId': 'recordId',
  8. },

完全な例については、以下のセクションを参照してください。

名前空間の含め方

上記の例に見られるように、他のプラグインやWordPressが提供するデフォルトのコンテキスト値との潜在的な競合を避けるために、コンテキストキーの名前の一部として名前空間を含めることをお勧めします。コンテキストの名前空間は、プラグインに特有であるべきであり、ほとんどの場合、ブロック自体の名前で使用されるものと同じにすることができます。

ブロックコンテキストの消費

ブロックは、登録設定に usesContext プロパティを割り当てることで、祖先プロバイダーからコンテキスト値を継承できます。これは、ブロックが継承したいコンテキスト名の配列として割り当てる必要があります。

  1. registerBlockType('my-plugin/record-title', {
  2. title: 'Record Title',
  3. category: 'widgets',
  4. usesContext: ['my-plugin/recordId'],

ブロックコンテキストの使用

ブロックが継承したいコンテキストを定義すると、edit (JavaScript) および render_callback (PHP) の実装でアクセスできます。これは、ブロックのために定義されたコンテキスト値のオブジェクト (JavaScript) または連想配列 (PHP) として提供されます。コンテキスト値は、ブロックがその値を継承したいと明示的に定義した場合にのみ利用可能になります。

注意: ブロックコンテキストは save には利用できません。

JavaScript

  1. registerBlockType('my-plugin/record-title', {
  2. edit({ context }) {
  3. return 'The record ID: ' + context['my-plugin/recordId'];
  4. },

PHP

ブロックのコンテキスト値は、context プロパティから $block 引数の3番目の引数として render_callback 関数に渡されます。

  1. register_block_type( 'my-plugin/record-title', array(
  2. 'render_callback' => function( $attributes, $content, $block ) {
  3. return 'The current record ID is: ' . $block->context['my-plugin/recordId'];
  4. },
  5. ) );

  • 1. record ブロックを作成します。
  1. npm init @wordpress/block --namespace my-plugin record
  2. cd record
  • 1. src/index.js を編集します。recordId 属性と providesContext プロパティを registerBlockType 関数に挿入し、record-title ブロックの登録を下部に追加します:
  1. registerBlockType( 'my-plugin/record', {
  2. // ... cut ...
  3. attributes: {
  4. recordId: {
  5. type: 'number',
  6. },
  7. },
  8. providesContext: {
  9. 'my-plugin/recordId': 'recordId',
  10. },
  11. /**
  12. * @see ./edit.js
  13. */
  14. edit: Edit,
  15. /**
  16. * @see ./save.js
  17. */
  18. save,
  19. } );
  20. registerBlockType( 'my-plugin/record-title', {
  21. title: 'Record Title',
  22. category: 'widgets',
  23. usesContext: [ 'my-plugin/recordId' ],
  24. edit( { context } ) {
  25. return 'The record ID: ' + context[ 'my-plugin/recordId' ];
  26. },
  27. save() {
  28. return null;
  29. },
  30. } );
  • 1. src/edit.jsrecord ブロックのために編集します。Edit 関数を次のコードに置き換えます:
  1. import { TextControl } from '@wordpress/components';
  2. import { InnerBlocks } from '@wordpress/block-editor';
  3. export default function Edit( props ) {
  4. const MY_TEMPLATE = [ [ 'my-plugin/record-title', {} ] ];
  5. const {
  6. attributes: { recordId },
  7. setAttributes,
  8. } = props;
  9. return (
  10. <div>
  11. <TextControl
  12. label={ __( 'Record ID' ) }
  13. value={ recordId }
  14. onChange={ ( val ) =>
  15. setAttributes( { recordId: Number( val ) } )
  16. }
  17. />
  18. <InnerBlocks template={ MY_TEMPLATE } templateLock="all" />
  19. </div>
  20. );
  21. }
  • 1. src/save.jsrecord ブロックのために編集します。save 関数を次のコードに置き換えます:
  1. export default function save( props ) {
  2. return <p>The record ID: { props.attributes.recordId }</p>;
  3. }
  • 1. 新しい投稿を作成し、record ブロックを追加します。テキストボックスに数字を入力すると、下の record-title ブロックに同じ数字が表示されます。

ブロックコンテキストの例