型検証
type
は属性によって保存されるデータの型を示します。データがどこに保存されるかは source
フィールドによって定義されます。
type
は必須ですが、enum
が提供されている場合は不要です。type
は enum
と一緒に使用できます。
type
フィールドは次のいずれかでなければなりません:
null
boolean
object
array
string
integer
number
(同じくinteger
)
object
の有効性は source
によって決まります。例については、以下の query
の詳細を参照してください。
列挙型検証
属性は固定された値のセットの1つとして定義できます。これは enum
によって指定され、許可された値の配列が含まれます:
例: 例 enum
。
{
size: {
enum: [ 'large', 'small', 'tiny' ]
}
}
値のソース
属性ソースは、保存された投稿コンテンツから属性値がどのように抽出されるかを定義するために使用されます。これにより、保存されたマークアップからブロックのJavaScript表現へのマッピングメカニズムが提供されます。
利用可能な source
値は次のとおりです:
– (no value)
– source
が指定されていない場合、データはブロックの コメント区切り に保存されます。
– attribute
– データはHTML要素の属性に保存されます。
– text
– データはHTMLテキストに保存されます。
– html
– データはHTMLに保存されます。これは通常 RichText
によって使用されます。
– query
– データはオブジェクトの配列として保存されます。
– meta
– データは投稿メタに保存されます(非推奨)。
source
フィールドは通常 selector
フィールドと組み合わせて使用されます。セレクター引数が指定されていない場合、ソース定義はブロックのルートノードに対して実行されます。セレクター引数が指定されている場合、それはブロック内の一致する要素に対して実行されます。
selector
はHTMLタグであるか、querySelector でクエリ可能なものである必要があります。クラスやID属性などが含まれます。以下に例を示します。
例えば、selector
が img
の場合、img
要素に一致し、img.class
は img
要素に一致し、class
クラスを持っています。
内部的には、属性ソースは hpq によって提供される機能のスーパーセットです。これは、HTMLマークアップをオブジェクト形状に解析し、クエリするために使用される小さなライブラリです。
要約すると、source
はコンテンツ内のデータが保存される場所を決定し、type
はそのデータが何であるかを決定します。保存されるデータの量を減らすためには、通常、コメント区切り内の属性としてではなく、HTML内にできるだけ多くのデータを保存する方が良いです。
属性ソース
attribute
ソースを使用して、マークアップ内の属性から値を抽出します。属性は attribute
フィールドによって指定され、これは必ず提供されなければなりません。
例: ブロックのマークアップ内に見つかった画像から src
属性を抽出します。
保存されたコンテンツ:
<div>
Block Content
<img src="https://lorempixel.com/1200/800/" />
</div>
属性定義:
{
url: {
type: 'string',
source: 'attribute',
selector: 'img',
attribute: 'src',
}
}
ブロック内で利用可能な属性:
{ "url": "https://lorempixel.com/1200/800/" }
マークアップからのほとんどの属性は string
型になります。HTML内の数値属性は依然として文字列として保存され、自動的には変換されません。
例: ブロックのマークアップ内に見つかった画像から width
属性を抽出します。
保存されたコンテンツ:
<div>
Block Content
<img src="https://lorempixel.com/1200/800/" width="50" />
</div>
属性定義:
{
width: {
type: 'string',
source: 'attribute',
selector: 'img',
attribute: 'width',
}
}
ブロック内で利用可能な属性:
{ "width": "50" }
唯一の例外は、属性の存在を確認する場合です(例えば、disabled
属性が button
にある場合)。その場合、型 boolean
を使用でき、保存された値はブール値になります。
例: ブロックのマークアップ内に見つかったボタンから disabled
属性を抽出します。
保存されたコンテンツ:
<div>
Block Content
<button type="button" disabled>Button</button>
</div>
属性定義:
{
disabled: {
type: 'boolean',
source: 'attribute',
selector: 'button',
attribute: 'disabled',
}
}
ブロック内で利用可能な属性:
{ "disabled": true }
テキストソース
text
を使用して、マークアップから内部テキストを抽出します。HTMLは textContent
のルールに従って返されることに注意してください。
例: ブロックのマークアップ内に見つかった figcaption 要素から content
属性を抽出します。
保存されたコンテンツ:
<figure>
<img src="/image.jpg" />
<figcaption>The inner text of the figcaption element</figcaption>
</figure>
属性定義:
{
content: {
type: 'string',
source: 'text',
selector: 'figcaption',
}
}
ブロック内で利用可能な属性:
{ "content": "The inner text of the figcaption element" }
別の例として、text
をソースとして使用し、.my-content
クラスをセレクターとして使用してテキストを抽出します:
例: ブロックのマークアップ内に見つかった .my-content
クラスを持つ要素から content
属性を抽出します。
保存されたコンテンツ:
<div>
<img src="/image.jpg" />
<p class="my-content">The inner text of .my-content class</p>
</div>
属性定義:
{
content: {
type: 'string',
source: 'text',
selector: '.my-content',
}
}
ブロック内で利用可能な属性:
{ "content": "The inner text of .my-content class" }
HTMLソース
html
を使用して、マークアップから内部HTMLを抽出します。テキストは innerHTML
のルールに従って返されることに注意してください。
例: ブロックのマークアップ内に見つかった figcaption 要素から content
属性を抽出します。
保存されたコンテンツ:
<figure>
<img src="/image.jpg" />
<figcaption>The inner text of the <strong>figcaption</strong> element</figcaption>
</figure>
属性定義:
{
content: {
type: 'string',
source: 'html',
selector: 'figcaption',
}
}
ブロック内で利用可能な属性:
{ "content": "The inner text of the <strong>figcaption</strong> element" }
クエリソース
query
を使用して、マークアップから値の配列を抽出します。配列のエントリは selector
引数によって決定され、ブロック内の各一致する要素は、2番目の引数である属性ソースのオブジェクトに対応する構造を持つエントリを持ちます。
query
フィールドは実質的にネストされたブロック属性定義です。さらにネストすることも可能ですが(必ずしも推奨されるわけではありません)。
例: ブロックのマークアップ内の各画像要素から src
と alt
を抽出します。
保存されたコンテンツ:
<div>
<img src="https://lorempixel.com/1200/800/" alt="large image" />
<img src="https://lorempixel.com/50/50/" alt="small image" />
</div>
属性定義:
{
images: {
type: 'array',
source: 'query',
selector: 'img',
query: {
url: {
type: 'string',
source: 'attribute',
attribute: 'src',
},
alt: {
type: 'string',
source: 'attribute',
attribute: 'alt',
},
}
}
}
ブロック内で利用可能な属性:
{
"images": [
{ "url": "https://lorempixel.com/1200/800/", "alt": "large image" },
{ "url": "https://lorempixel.com/50/50/", "alt": "small image" }
]
}
メタソース(非推奨)
属性は投稿のメタから取得できますが、メタ属性ソースは非推奨と見なされます。代わりに EntityProvider および関連するフックAPI を使用する必要があります。これは メタブロックの作成方法 に示されています。
属性は、ブロックの保存された投稿コンテンツ内の表現ではなく、投稿のメタから取得できます。このため、meta
キーの下に対応するメタキーを指定する属性が必要です。
属性定義:
{
author: {
type: 'string',
source: 'meta',
meta: 'author'
},
},
ここから、メタ属性はブロックによって任意の属性と同じインターフェースを使用して読み書きできます:
edit( { attributes, setAttributes } ) {
function onChange( event ) {
setAttributes( { author: event.target.value } );
}
return <input value={ attributes.author } onChange={ onChange } type="text" />;
},
考慮事項
デフォルトでは、メタフィールドは投稿オブジェクトのメタから除外されます。これは、フィールドを明示的に可視化することで回避できます:
function gutenberg_my_block_init() {
register_post_meta( 'post', 'author', array(
'show_in_rest' => true,
) );
}
add_action( 'init', 'gutenberg_my_block_init' );
さらに、WordPressはデフォルトで次のように動作します:
- メタデータをユニークなものとして扱わず、代わりに値の配列を返します;
- そのデータを文字列として扱います。
どちらかの動作が望ましくない場合、同じ register_post_meta
呼び出しに single
および/または type
パラメータを補完することができます:
function gutenberg_my_block_init() {
register_post_meta( 'post', 'author_count', array(
'show_in_rest' => true,
'single' => true,
'type' => 'integer',
) );
}
add_action( 'init', 'gutenberg_my_block_init' );
オブジェクトまたは配列を属性に使用したい場合は、string
属性タイプを登録し、JSONを仲介として使用できます。構造化データを保存する前にJSONにシリアライズし、その後サーバーでJSON文字列をデシリアライズします。データの整合性については責任を持つことを忘れないでください。適切にサニタイズし、欠落データに対応するなどしてください。
最後に、属性を設定する際にはデータの型を尊重してください。フレームワークはメタの型キャスティングを自動的に行わないためです。ブロック属性の不正な型付けは、保存後も投稿が汚れたままになる原因となります(cf. isEditedPostDirty
, hasEditedAttributes
)。例えば、authorCount
が整数の場合、イベントハンドラーが異なる種類のデータを渡す可能性があるため、値は明示的にキャストする必要があります:
function onChange( event ) {
props.setAttributes( { authorCount: Number( event.target.value ) } );
}
デフォルト値
ブロック属性にはデフォルト値を含めることができ、type
と source
がブロックコンテンツ内の何にも一致しない場合に使用されます。
値は default
フィールドによって提供され、値は属性の期待される形式と一致する必要があります。
例: 例 default
値。
{
type: 'string',
default: 'hello world'
}
{
type: 'array',
default: [
{ "url": "https://lorempixel.com/1200/800/", "alt": "large image" },
{ "url": "https://lorempixel.com/50/50/", "alt": "small image" }
]
}
{
type: 'object',
default: {
width: 100,
title: 'title'
}
}