2026年10月7日

2026年10月7日

WordPressのBlock VariationsとBlock Stylesを組み合わせて編集UIを整える方法

Block Variations(ブロックバリエーション)は「設定済みのブロックを1クリックで挿入する入口」、Block Styles(ブロックスタイル)は「挿入後に切り替えられる見た目の選択肢」です。2つを組み合わせ、バリエーションの初期値にスタイルのクラスを入れておくと、編集者は挿入した瞬間から正しい見た目のブロックを使え、あとからスタイル欄で切り替えることもできます。この記事では、子テーマにコードを置いて「お知らせカード」を作る手順を例に、登録方法、CSSの読み込み、つまずきやすい点を説明します。

2つの機能の違いを整理する

まず役割の違いを押さえておくと、どちらに何を任せるかを迷わずに済みます。

Block Styles は、既存ブロックに is-style-{名前} というクラスを付けるだけの仕組みです。ブロックを選んだときのサイドバーに「スタイル」の選択肢として表示されます。属性や中身の構造は変わらず、CSSで見た目を変えます。PHP の register_block_style()、JavaScript の wp.blocks.registerBlockStyle() で登録します。

Block Variations は、ブロックの属性や中に入るブロック(innerBlocks)をあらかじめ決めた「別名のブロック」をインサーターに追加する仕組みです。たとえばコアの「埋め込み」ブロックの YouTube や X なども、内部ではバリエーションとして実装されています。JavaScript の wp.blocks.registerBlockVariation() で登録します。

組み合わせると、次の分担になります。

  • 構造(見出し+本文、余白、配置)はバリエーションで決める
  • 見た目(背景色、枠線、角丸)はスタイルで決める
  • バリエーションの attributes.className にスタイルのクラスを入れて、挿入時にスタイルが選ばれた状態にする

見た目をバリエーションの属性(背景色など)で直接持たせることもできますが、その値は投稿ごとに保存されます。後からデザインを変えたいとき、スタイル経由ならCSSを1か所直すだけで済むのが大きな違いです。

作業前の準備

  • コードは子テーマ(またはサイト用の小さなプラグイン)に置きます。親テーマを直接編集すると更新で消えます。
  • ステージング環境で確認してから本番に反映します。
  • 以下のファイル構成を例にします。
my-child-theme/
├── functions.php
└── assets/
    ├── css/group-card.css
    └── js/block-variations.js

手順1: ブロックスタイルをPHPで登録する

スタイルはPHPで登録しておくと、サーバー側でも存在が分かり、翻訳関数も使えます。CSSは wp_enqueue_block_style() で読み込むと、対象ブロックがページにあるときだけ読み込まれる設定にできます(関数は WordPress 5.9 で追加)。

<?php
// 子テーマの functions.php
add_action( 'init', function () {
	register_block_style(
		'core/group',
		array(
			'name'  => 'mytheme-card',
			'label' => __( 'カード', 'mytheme' ),
		)
	);

	wp_enqueue_block_style(
		'core/group',
		array(
			'handle' => 'mytheme-group-card',
			'src'    => get_theme_file_uri( 'assets/css/group-card.css' ),
			'path'   => get_theme_file_path( 'assets/css/group-card.css' ),
			'ver'    => filemtime( get_theme_file_path( 'assets/css/group-card.css' ) ),
		)
	);
} );
/* assets/css/group-card.css */
.wp-block-group.is-style-mytheme-card {
	border: 1px solid currentColor;
	border-radius: 8px;
	padding: 1.25rem 1.5rem;
}
.wp-block-group.is-style-mytheme-card > :first-child {
	margin-top: 0;
}

name はクラス名になるため、半角英数字とハイフンで、他のテーマやプラグインと重なりにくい接頭辞を付けます。get_theme_file_uri() は子テーマにファイルがあればそちらを優先して返します。

ブロックテーマを使っている場合、WordPress 6.6 以降は theme.json の styles.blocks 内の variations や、テーマの styles フォルダに置くJSONでもブロックスタイルの見た目を定義でき、サイトエディターのスタイル画面から編集者が調整できるようになりました。JSONで定義できる範囲は theme.json の設定項目に限られるため、細かいセレクター指定が必要ならCSSファイルを併用します。

手順2: バリエーションをJavaScriptで登録する

次に、エディター用のスクリプトでバリエーションを登録します。attributes.className に手順1のクラスを入れるのが組み合わせの要点です。

// assets/js/block-variations.js
( function ( blocks, domReady, i18n ) {
	const { __ } = i18n;

	domReady( function () {
		blocks.registerBlockVariation( 'core/group', {
			name: 'mytheme-notice-card',
			title: __( 'お知らせカード', 'mytheme' ),
			description: __( '見出しと本文が入ったカード型の枠です。', 'mytheme' ),
			icon: 'megaphone',
			keywords: [ 'notice', 'お知らせ' ],
			scope: [ 'inserter' ],
			attributes: {
				className: 'is-style-mytheme-card',
				layout: { type: 'constrained' },
			},
			innerBlocks: [
				[ 'core/heading', { level: 3, placeholder: __( 'お知らせの見出し', 'mytheme' ) } ],
				[ 'core/paragraph', { placeholder: __( '本文を入力します', 'mytheme' ) } ],
			],
			isActive: function ( blockAttributes ) {
				const classes = ( blockAttributes.className || '' ).split( ' ' );
				return classes.includes( 'is-style-mytheme-card' );
			},
		} );
	} );
} )( window.wp.blocks, window.wp.domReady, window.wp.i18n );
<?php
// 子テーマの functions.php(続き)
add_action( 'enqueue_block_editor_assets', function () {
	$path = get_theme_file_path( 'assets/js/block-variations.js' );
	wp_enqueue_script(
		'mytheme-block-variations',
		get_theme_file_uri( 'assets/js/block-variations.js' ),
		array( 'wp-blocks', 'wp-dom-ready', 'wp-i18n' ),
		filemtime( $path ),
		true
	);
	wp_set_script_translations( 'mytheme-block-variations', 'mytheme' );
} );

各項目の意味は次のとおりです。

  • scope: バリエーションを表示する場所。inserter(ブロック追加画面)、block(ブロックを置いた直後の選択肢)、transform(変換メニュー)を指定できます。
  • innerBlocks: 挿入時に中に入るブロックの配列です。見出しレベルやプレースホルダーもここで決めます。
  • isActive: 置かれたブロックが「このバリエーションかどうか」を判定する関数です。これがあると、ブロックツールバーやリスト表示にバリエーション名とアイコンが出ます。className には他のクラスも入ることがあるため、文字列の完全一致ではなく分割して含まれるかを確認しています。

動作確認

  1. 投稿エディターでブロック追加(+)を開き、「お知らせカード」で検索して挿入します。
  2. 挿入したブロックを選び、サイドバーのスタイル欄で「カード」が選ばれていることを確認します。
  3. スタイルを「デフォルト」に切り替えると枠が消え、リスト表示の名前が「グループ」に戻れば isActive が働いています。
  4. 公開画面で is-style-mytheme-card のクラスが付き、CSSが読み込まれているかを開発者ツールで確認します。

つまずきやすい点

エディターにCSSが効かない: 投稿エディターは、ブロックテーマなどの条件で iframe の中に本文を表示します。enqueue_block_editor_assets で読み込んだCSSは iframe の外側に入るため、本文の見た目には効かないことがあります。本文用のCSSは wp_enqueue_block_style()、enqueue_block_assets フック、または add_editor_style() で読み込みます。

スクリプトの読み込み順: 依存配列に wp-blocks を入れ忘れると、wp.blocks が未定義でエラーになります。ブラウザの開発者ツールのコンソールを確認してください。

既存の投稿にはバリエーションの変更が反映されない: バリエーションは「挿入時の初期値」です。後から innerBlocks を変えても、すでに置かれたブロックは変わりません。見た目の変更はスタイル側(CSS)で行うと、既存の投稿にも反映されます。

コアのスタイルやバリエーションを減らしたい: 選択肢が多すぎて迷う場合は、wp.blocks.unregisterBlockStyle( 'core/image', 'rounded' ) や wp.blocks.unregisterBlockVariation() で隠せます。コアのスタイルはエディター側で登録されるものがあるため、domReady の中で実行します。PHP の unregister_block_style() は、PHPで登録されたスタイルにしか効きません。

PHP側でバリエーションを登録したい: WordPress 6.5 以降では get_block_type_variations フィルターで、サーバー側からバリエーションを追加する方法もあります。登録できる項目やエディターでの動きはバージョンで差があるため(2026年10月現在)、Block Editor Handbook の該当ページで対応状況を確かめてから使ってください。

クラシックテーマの場合: クラシックテーマでもブロックエディターを使っていれば、ここまでの手順は同じように動きます。theme.json や styles フォルダでの定義はブロックテーマ(または theme.json を持つテーマ)向けの機能です。

まとめ

  • Block Variations は「構造と初期値を決めた挿入の入口」、Block Styles は「クラスで切り替える見た目」と役割を分ける
  • バリエーションの attributes.className に is-style-{名前} を入れると、挿入時からスタイルが選ばれた状態になる
  • isActive を書いておくと、リスト表示やツールバーでバリエーション名が分かる
  • 本文に効かせるCSSは iframe を考慮して読み込み、見た目の変更はスタイル側で行うと既存の投稿にも反映される
  • 子テーマかサイト用プラグインに置き、ステージングで確認してから本番へ

お気軽にご相談ください

お見積りへ お問い合わせへ
▲