ブロックのバリエーションの定義
ブロックのバリエーションは、以下のフィールドを含むオブジェクトによって定義されます:
name
(タイプstring
) – 一意で機械可読な名前。title
(オプション、タイプstring
) – 人間が読めるバリエーションタイトル。description
(オプション、タイプstring
) – 人間が読めるバリエーションの説明。category
(オプション、タイプstring
) – 検索インターフェースでブロックタイプをカテゴリ別に整理するために使用されるカテゴリ分類。keywords
(オプション、タイプstring[]
) – ユーザーが検索中にバリエーションを発見するのに役立つ用語の配列(翻訳可能)。icon
(オプション、タイプstring
|Object
) – バリエーションを視覚化するのに役立つアイコン。ブロックタイプと同じ形状を持つことができます。attributes
(オプション、タイプObject
) – ブロック属性を上書きする値。innerBlocks
(オプション、タイプArray[]
) – ネストされたブロックの初期設定。example
(オプション、タイプObject
) – ブロックプレビューのための構造化データを提供します。プレビューを無効にするにはundefined
に設定します。詳細については、ブロック登録APIを参照してください。scope
(オプション、タイプWPBlockVariationScope[]
) – デフォルトはblock
とinserter
です。バリエーションが適用されるスコープのリスト。利用可能なオプションには次のものが含まれます:block
– 特定のブロックバリエーションをフィルタリングするためにブロックによって使用されます。Columns
とQuery
ブロックにはそのようなバリエーションがあり、実験的ブロックバリエーションピッカーコンポーネントに渡されます。このコンポーネントはバリエーションの表示を処理し、ユーザーがその中から1つを選択できるようにします。inserter
– ブロックバリエーションがインサーターに表示されます。transform
– ブロックバリエーションがバリエーション変換のコンポーネントに表示されます。
isDefault
(オプション、タイプboolean
) – デフォルトはfalse
です。現在のバリエーションがデフォルトであるかどうかを示します(詳細は以下)。isActive
(オプション、タイプFunction|string[]
) – ブロックが選択されたときにバリエーションがアクティブかどうかを判断するために使用される関数またはブロック属性の配列。関数はblockAttributes
とvariationAttributes
を受け入れます(詳細は以下)。一意の
name
なしでブロックバリエーションを技術的に作成することは可能ですが、これは 推奨されません。一意のname
により、エディターはあなたのバリエーションと他に存在する可能性のあるバリエーションを区別できます。また、必要に応じてバリエーションを登録解除でき、isDefault
設定に影響を与えます(詳細は以下)。
ブロックバリエーションの作成
ブロックの登録中に、variations
キーを適切なバリエーションオブジェクトの配列で提供することにより、ブロックバリエーションを宣言できます。詳細については、ブロック登録APIを参照してください。
既存のブロック(コアブロックなど)のバリエーションを作成するには、wp.blocks.registerBlockVariation()
を使用します。この関数は、ブロックの名前とバリエーションを定義するオブジェクトを受け入れます。
wp.blocks.registerBlockVariation( 'core/embed', {
name: 'custom-embed',
attributes: { providerNameSlug: 'custom' },
} );
ブロックバリエーションの削除
ブロックバリエーションは簡単に削除することもできます。そのためには、wp.blocks.unregisterBlockVariation()
を使用します。この関数は、ブロックの名前と登録解除すべきバリエーションの name
を受け入れます。
wp.blocks.unregisterBlockVariation( 'core/embed', 'youtube' );
ブロックバリエーションとブロックスタイルの違い
ブロックスタイルとブロックバリエーションの主な違いは、ブロックスタイルは単にブロックにCSSクラスを適用するだけで、代替的な方法でスタイリングできることです。詳細については、ブロックスタイルAPIを参照してください。
初期属性や内部ブロックを適用したい場合、これはブロックバリエーションの領域に該当します。また、ブロックバリエーションを定義する際に className
属性を使用してデフォルトのブロックスタイルを上書きすることも可能です。
variations: [
{
name: 'blue',
title: __( 'Blue Quote' ),
isDefault: true,
attributes: {
color: 'blue',
className: 'is-style-blue-quote'
},
icon: 'format-quote',
isActive: ( blockAttributes, variationAttributes ) =>
blockAttributes.color === variationAttributes.color
},
],
isDefaultの使用
デフォルトでは、すべてのバリエーションは元のブロックタイプアイテムに加えてインサーターに表示されます。ただし、リストされた任意のバリエーションに isDefault
フラグを設定すると、インサーター内の通常のブロックタイプを上書きします。これは、エディターの体験を特定のニーズに合わせてキュレーションするための優れたツールです。
たとえば、メディア&テキストブロックをデフォルトで右側に画像を表示するようにしたい場合、次のようなバリエーションを作成できます:
wp.blocks.registerBlockVariation( 'core/media-text', {
name: 'media-text-media-right',
title: __( 'Media & Text' ),
isDefault: true,
attributes: {
mediaPosition: 'right',
},
} );
isDefaultを使用する際の注意点
isDefault
は、既存のバリエーションのないブロックを上書きする際に非常に効果的ですが、他のバリエーションが存在する場合には問題が発生することがあります。
同じブロックの別のバリエーションが isDefault
を使用している場合、あなたのバリエーションが必ずしもデフォルトになるわけではありません。エディターは isDefault
を持つ最初に登録されたバリエーションを尊重しますが、それはあなたのものではないかもしれません。
解決策は、isDefault
であなたのバリエーションを登録する前に他のバリエーションを登録解除することです。この注意点は、常に一意の name
を持つバリエーションを提供することを推奨することを強調しています。そうしないと、バリエーションを登録解除できなくなります。
isActiveの使用
isActive
プロパティはオプションですが、推奨されます。このAPIはブロックエディターによって使用され、バリエーションのインスタンスがエディターで選択されたときに、どのバリエーションがアクティブであるかを確認し、正しいバリエーションのタイトル、アイコン、説明を表示します。
isActive
が設定されていない場合、エディターは元のブロックのインスタンスとあなたのバリエーションを区別できず、元のブロック情報が表示されます。
プロパティは、文字列の配列(string[]
)または関数のいずれかに設定できます。可能な限り文字列配列バージョンを使用することを推奨します。
string[]
バージョンは、ブロックインスタンスの属性のうち、どれが指定されたバリエーションのものと比較されるべきかを宣言するために使用されます。各属性がチェックされ、すべてが一致すればバリエーションがアクティブになります。
たとえば、コアの埋め込みブロックでは、providerNameSlug
属性が埋め込みプロバイダー(例:‘youtube’ または ‘twitter’)を決定するために使用されます。バリエーションは次のように宣言できます:
const variations = [
{
name: 'twitter',
title: 'Twitter',
icon: embedTwitterIcon,
keywords: [ 'tweet', __( 'social' ) ],
description: __( 'Embed a tweet.' ),
patterns: [ /^https?:\/\/(www\.)?twitter\.com\/.+/i ],
attributes: { providerNameSlug: 'twitter', responsive: true },
},
{
name: 'youtube',
title: 'YouTube',
icon: embedYouTubeIcon,
keywords: [ __( 'music' ), __( 'video' ) ],
description: __( 'Embed a YouTube video.' ),
patterns: [
/^https?:\/\/((m|www)\.)?youtube\.com\/.+/i,
/^https?:\/\/youtu\.be\/.+/i,
],
attributes: { providerNameSlug: 'youtube', responsive: true },
},
// ...
];
isActive
プロパティは次のようになります:
isActive: [ 'providerNameSlug' ];
これにより、providerNameSlug
のブロックインスタンス値が、バリエーションの宣言で宣言された値(上記のコードスニペットの値)と比較され、どの埋め込みバリエーションがアクティブかが決定されます。
ネストされたオブジェクトパスも、WordPress 6.6.0
以降サポートされています。たとえば、query
オブジェクトを属性として持つブロックバリエーションを考えてみてください。そのオブジェクトの postType
プロパティに基づいて、バリエーションがアクティブかどうかを判断することが可能です(他のすべてのプロパティは無視します):
isActive: [ 'query.postType' ];
このプロパティの関数バージョンは、ブロックインスタンスの blockAttributes
を最初の引数として、バリエーションのために宣言された variationAttributes
を第二の引数として受け入れます。これらの引数は、比較して true
または false
を返すことによって、バリエーションがアクティブかどうかを判断するために使用できます(このブロックインスタンスに対してこのバリエーションが非アクティブであることを示します)。
埋め込みブロックの同じ例を使用すると、関数バージョンは次のようになります:
isActive: ( blockAttributes, variationAttributes ) =>
blockAttributes.providerNameSlug === variationAttributes.providerNameSlug,
isActiveマッチの特異性
注:WordPress 6.6.0
以降の改善された処理。
isActive
チェックが特定のブロックインスタンスに一致する複数のバリエーションがあり、すべてが文字列配列である場合、特異性が最も高いバリエーションが選択されます。次の例を考えてみてください:
wp.blocks.registerBlockVariation( 'core/paragraph', {
name: 'paragraph-red',
title: 'Red Paragraph',
attributes: {
textColor: 'vivid-red',
},
isActive: [ 'textColor' ],
} );
wp.blocks.registerBlockVariation( 'core/paragraph', {
name: 'paragraph-red-grey',
title: 'Red/Grey Paragraph',
attributes: {
textColor: 'vivid-red',
backgroundColor: 'cyan-bluish-gray',
},
isActive: [ 'textColor', 'backgroundColor' ],
} );
ブロックインスタンスが textColor: vivid-red
と backgroundColor: cyan-bluish-gray
属性を持っている場合、両方のバリエーションの isActive
基準がそのブロックインスタンスに一致します。この場合、より 特異的 な一致がアクティブなバリエーションとして決定され、特異性は各 isActive
配列の長さとして計算されます。これにより、Red/Grey Paragraph
がアクティブなバリエーションとして表示されます。
特異性は、isActive
プロパティが関数である場合、一致するバリエーションに対して決定できません。この場合、最初に一致したバリエーションがアクティブなバリエーションとして決定されます。このため、isActive
プロパティに対して string[]
を使用することが一般的に推奨されます。