ブロックコンテキストの定義
ブロックコンテキストは、ブロックの登録設定で定義されます。ブロックはコンテキスト値を提供するか、継承したい値を消費することができます。
ブロックコンテキストの提供
ブロックは、登録設定に providesContext
プロパティを割り当てることでコンテキスト値を提供できます。これは、コンテキスト名をブロック自身の属性の1つにマッピングするオブジェクトです。その属性値に対応する値は、子孫ブロックに利用可能であり、同じコンテキスト名で参照できます。現在、ブロックコンテキストはブロック自身の属性から派生した値のみをサポートしています。将来的には、追加のコンテキスト値のソースをサポートするように拡張される可能性があります。
attributes: {
recordId: {
type: 'number',
},
},
providesContext: {
'my-plugin/recordId': 'recordId',
},
完全な例については、以下のセクションを参照してください。
名前空間の含め方
上記の例に見られるように、他のプラグインやWordPressが提供するデフォルトのコンテキスト値との潜在的な競合を避けるために、コンテキストキーの名前の一部として名前空間を含めることをお勧めします。コンテキストの名前空間は、プラグインに特有であるべきであり、ほとんどの場合、ブロック自体の名前で使用されるものと同じにすることができます。
ブロックコンテキストの消費
ブロックは、登録設定に usesContext
プロパティを割り当てることで、祖先プロバイダーからコンテキスト値を継承できます。これは、ブロックが継承したいコンテキスト名の配列として割り当てる必要があります。
registerBlockType('my-plugin/record-title', {
title: 'Record Title',
category: 'widgets',
usesContext: ['my-plugin/recordId'],
ブロックコンテキストの使用
ブロックが継承したいコンテキストを定義すると、edit
(JavaScript) および render_callback
(PHP) の実装でアクセスできます。これは、ブロックのために定義されたコンテキスト値のオブジェクト (JavaScript) または連想配列 (PHP) として提供されます。コンテキスト値は、ブロックがその値を継承したいと明示的に定義した場合にのみ利用可能になります。
注意: ブロックコンテキストは save
には利用できません。
JavaScript
registerBlockType('my-plugin/record-title', {
edit({ context }) {
return 'The record ID: ' + context['my-plugin/recordId'];
},
PHP
ブロックのコンテキスト値は、context
プロパティから $block
引数の3番目の引数として render_callback
関数に渡されます。
register_block_type( 'my-plugin/record-title', array(
'render_callback' => function( $attributes, $content, $block ) {
return 'The current record ID is: ' . $block->context['my-plugin/recordId'];
},
) );
例
- 1.
record
ブロックを作成します。
npm init @wordpress/block --namespace my-plugin record
cd record
- 1.
src/index.js
を編集します。recordId
属性とprovidesContext
プロパティをregisterBlockType
関数に挿入し、record-title
ブロックの登録を下部に追加します:
registerBlockType( 'my-plugin/record', {
// ... cut ...
attributes: {
recordId: {
type: 'number',
},
},
providesContext: {
'my-plugin/recordId': 'recordId',
},
/**
* @see ./edit.js
*/
edit: Edit,
/**
* @see ./save.js
*/
save,
} );
registerBlockType( 'my-plugin/record-title', {
title: 'Record Title',
category: 'widgets',
usesContext: [ 'my-plugin/recordId' ],
edit( { context } ) {
return 'The record ID: ' + context[ 'my-plugin/recordId' ];
},
save() {
return null;
},
} );
- 1.
src/edit.js
をrecord
ブロックのために編集します。Edit
関数を次のコードに置き換えます:
import { TextControl } from '@wordpress/components';
import { InnerBlocks } from '@wordpress/block-editor';
export default function Edit( props ) {
const MY_TEMPLATE = [ [ 'my-plugin/record-title', {} ] ];
const {
attributes: { recordId },
setAttributes,
} = props;
return (
<div>
<TextControl
label={ __( 'Record ID' ) }
value={ recordId }
onChange={ ( val ) =>
setAttributes( { recordId: Number( val ) } )
}
/>
<InnerBlocks template={ MY_TEMPLATE } templateLock="all" />
</div>
);
}
- 1.
src/save.js
をrecord
ブロックのために編集します。save
関数を次のコードに置き換えます:
export default function save( props ) {
return <p>The record ID: { props.attributes.recordId }</p>;
}
- 1. 新しい投稿を作成し、
record
ブロックを追加します。テキストボックスに数字を入力すると、下のrecord-title
ブロックに同じ数字が表示されます。