【WordPress6.6】theme.json の変更点

はじめに

この記事は、WordPress テーマの機能・レイアウト・スタイルなどの多くを一元的に管理出来る JSON ファイルである theme.json について、WordPress 6.6での変更点をまとめたものです。

theme.json 自体の全体図については、「【WordPress5.9 / 6.0版】theme.json 全解説」という記事にまとめていますので、そもそも theme.json とは何か分からない方、各セクション (プロパティ) の役割が分からない方は、ぜひ先にこちら記事を見ていただければ幸いです。また、WordPress 6.1から WordPress 6.5までの変更点については、それぞれ以下の記事でまとめています。

変更点一覧

とりあえず変更点をざっくりと知っておきたいという方のために、WordPress 6.6での変更点をリストアップしておきます。より詳しく理解してみたい方は、以降の各セクションの解説を参照ください。

  • theme.json のバージョンが2から3に上がった (解説)
  • デフォルトのフォントサイズプリセットを選択できるかどうかをコントロールする settings.typography.defaultFontSizes プロパティが追加された (解説)
  • CSSの text-align に関する設定を有効化するかどうかをコントロールする settings.typography.textAlign プロパティが追加された (解説)
  • デフォルトのスペーシングプリセットを選択できるかどうかをコントロールする settings.spacing.defaultSpacingSizes プロパティが追加された (解説)
  • Aspect Ratio プルダウンにデフォルトのオプションを表示するかどうかを設定する settings.dimensions.defaultAspectRatios プロパティが追加された (解説)
  • Aspect Ratio プルダウンにオプションを追加する settings.dimensions.aspectRatios プロパティが追加された (解説)
  • サイト全体に背景画像を適用できるようになった (解説)
  • CSSの text-align を設定できるようになった (解説)
  • CSSの aspect-ratio を設定できるようになった (解説)
  • ブロックスタイルの仕様が拡張された (解説)

備考・注意点

この記事は、2024年6月4日にリリースされた WordPress6.6 Beta1の検証結果に基づいています。正式リリースは2024年7月16日の予定ですが、それまでのあいだに仕様が若干変わる可能性があります。最新の仕様は、WordPress のgitリポジトリまたは WordPress.org のリリースニュース (Make WordPress Core) などで確認してください。

前準備

この記事の内容を実践するためのオリジナルテーマを用意したいという方は、作成したテーマフォルダに以下ファイルを用意してください。ブロックテーマとして認識させ、フロントエンドでコンテンツを確認出来るようにするために必要な最低限のファイルです。

/*
Theme Name: My Theme
Text Domain: mytheme
*/
<!-- wp:query {"queryId":1,"query":{"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","sticky":""}} -->
<div class="wp-block-query">
	<!-- wp:post-template -->
	<!-- wp:post-title {"isLink":true} /-->
	<!-- wp:post-excerpt /-->
	<!-- /wp:post-template -->
</div>
<!-- /wp:query -->
<!-- wp:post-title /-->
<!-- wp:post-content {"layout":{"inherit":true}} /-->
{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		}
	}
}

version

WordPress5.8で theme.json が導入され、WordPress6.0でバージョン2に上がりましたが、WordPress6.6ではバージョン3に上がります。

バージョンが上がったのは、フォントサイズとスペーシングの二つに関して仕様変更が行われ、デフォルトプリセットの扱いに関して一貫性を持たせることが主な目的のようです。

  • デフォルトプリセットがデフォルトで表示されるかどうか
  • デフォルトプリセットと同じスラッグを持つプリセットをテーマが提供した場合、デフォルトプリセットがテーマのプリセットを上書きするかどうか

ここでは、フォントサイズを例に挙げて解説します。

バージョン2で、テーマが何もプリセットを定義していない場合は、タイポグラフィパネルでは以下のようにデフォルトプリセットが表示されます。この4つのプリセットは、それぞれ smallmediumlargex-large というスラッグを持ちます。

small、medium、large、x-large

バージョン2において、以下のように何らかのフォントサイズプリセットを定義すると、デフォルトプリセットは theme.json で定義されたプリセットですべて上書きされます。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"settings": {
		"layout": {
			"contentSize": "900px"
		},
		"typography": {
			"fontSizes": [
				{
					"name": "Small",
					"size": "12px",
					"slug": "small"
				},
				{
					"name": "Custom",
					"size": "30px",
					"slug": "custom"
				}
			]
		}
	}
}
small、medium

※ラベルが T シャツサイズで固定されているためわかりづらいですが、「S」がスラッグ small で定義したもの、「M」がスラッグ custom で定義したものです。

ここで、theme.json のバージョンを3に挙げてみます。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		},
		"typography": {
			"fontSizes": [
				{
					"name": "Small",
					"size": "12px",
					"slug": "small"
				},
				{
					"name": "Custom",
					"size": "30px",
					"slug": "custom"
				}
			]
		}
	}
}
S, M, L, XL, XXL

デフォルトプリセットと、theme.json で定義されたプリセットの両方が表示されていることがわかります。「S (custom)」が theme.json で定義されたプリセットで、「M (small)」、「L (medium)」、「XL (large)」、「XXL (x-large)」がデフォルトプリセットです。

※ラベルとスラッグがずれているのがややこしいですが、これはフォントサイズのラベルが T シャツサイズでハードコードされており、常に「S」から始まるためです。

ここで重要なことは、small というスラッグをもつプリセットがテーマ・デフォルトプリセットの双方で定義されている場合、デフォルトプリセットの値が優先されるということです。

small というスラッグをもつプリセットから、--wp--preset--font-size--small という CSS 変数が生成されますが、この値は テーマ側のプリセットで定義された 12px ではなく、デフォルトプリセットで定義された 13px となります。

バージョン3においてこの挙動を防ぐためには、デフォルトで true である settings.typography.defaultFontSizes を false に変更します。これによりデフォルトプリセットが表示されなくなり、テーマ側で定義されたプリセットの値が上書きされることがなくなります。

スペーシングに関しても似たような仕様となっていますが、より詳しい挙動を知りたい方は、以下のマイグレーションガイドを参照してください。

Migrating Theme.json to Newer Versions – Migrating from v2 to v3

settings

settings.typography

settings.typography.defaultFontSizes

デフォルトのフォントサイズプリセットを選択できるかどうかをコントロールします。

※デフォルト値:true

version のセクションで説明した通り、この設定は theme.json のバージョンが2・3ののどちらかによって挙動が変わってきます。

  • theme.json のバージョンが2の場合: settings.typography.fontSizes でテーマのプリセットが定義されている場合、このデフォルトフォントサイズプリセットはすべて上書きされる
  • theme.json のバージョンが3の場合: settings.typography.fontSizes でテーマのプリセットが定義されている場合、このデフォルトフォントサイズプリセットとマージされる。ただし、デフォルトプリセットと同じスラッグを持つプリセットをテーマが持ってる場合、デフォルトプリセットの設定で上書きされる

この値を false にする一例としては、theme.json のバージョンを3にあげつつ、テーマが定義するプリセットがデフォルトプリセットに上書きされたくない、というケースだと思います。

settings.typography.textAlign

CSSの text-align に関する設定を有効化するかどうかをコントロールします。

※デフォルト値:true

WordPress6.6の時点では、この設定をサポートするコアブロックは存在しませんが、カスタムブロックの block.json でこのサポートをオプトインすることで、ブロックツールバーにドロップダウンが表示されます。

{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 3,
	"name": "test/my-block",
	"title": "My Block",
	"supports": {
		"typography": {
			"textAlign": true
		}
	}
}
Text Alignment UI

アクティブなテーマがブロックテーマであれば、サイトエディターのグローバルスタイルで、ブロックのデフォルトの text-align も設定できます。

グローバルスタイルのText Alignment UI

コアブロックに関しても、将来的に独自の UI からこのサポートへ移行することが検討されています。

Block Library: Migrate to the new textAlign block support · Issue #60763 · WordPress/gutenberg

settings.spacing

settings.spacing.defaultSpacingSizes

デフォルトのスペーシングプリセットを選択できるかどうかをコントロールします。

※デフォルト値:true

version のセクションでも述べた通り、デフォルトプリセットの扱いに関して一貫性を持たせるために追加されました。

この設定が true である場合の挙動は、theme.json のバージョンが2か3かによって異なります。さらに、プリセットを自動生成するためのsettings.spacing.spacingScale プロパティの設定も関連します。

詳しい挙動については、以下のマイグレーションガイドを参照してください。

Migrating Theme.json to Newer Versions – Migrating from v2 to v3

settings.dimensions

settings.dimensions.defaultAspectRatios

Aspect Ratio プルダウンに、デフォルトのオプションを表示するかどうかを設定します。

※デフォルト値:true

Aspect Ratio プルダウン

settings.dimensions.aspectRatios

Aspect Ratio プルダウンにオプションを追加します。

注意点として、WordPress 6.6の時点で Aspect Ratio をサポートしているのはカバーブロックのみですが、Aspect Ratio の設定はデフォルトで false なので、オプションを追加しても UI 自体が表示されません。以下の例では、settings.dimensions.aspectRatio を true に変更しつつ、オプションを追加しています。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		},
		"dimensions": {
			"aspectRatio": true,
			"aspectRatios": [
				{
					"name": "Extra Wide - 2:1",
					"ratio": "2/1",
					"slug": "2-1"
				}
			]
		}
	}
}
Aspect Ratio プルダウン

ちなみに、画像ブロック・投稿アイキャッチ画像でも Aspect Ratio を利用できますが、この二つのブロックはブロックサポートを介さない独自属性で実装されているため、settings.dimensions.aspectRatio の値にかかわらず UI は常に表示されます。

styles

styles.typography

styles.typography.textAlign

サイト全体のCSSの text-align を設定します。実際は、このプロパティではなく styles.blocks.{blockName}.typography.textAlign プロパティを使用して、ブロックレベル・要素レベルで設定することが多いかと思います。

styles.background

styles.background.backgroundImage, styles.background.backgroundPosition, styles.background.backgroundRepeat, styles.background.backgroundSize

サイト全体に適用する背景画像に関するスタイルです。

プロパティ名から見て分かる通り、それぞれ background-imagebackground-positionbackground-repeatbackground-size CSS プロパティを定義します。

backgroundImage プロパティに関しては、 外部リソースを指定する場合は、以下二つの定義方法があります。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		}
	},
	"styles": {
		"background": {
			"backgroundImage": {
				"url": "https://live.staticflickr.com/8307/7879971866_4ef11ff25b_b.jpg"
			}
		}
	}
}
{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		}
	},
	"styles": {
		"background": {
			"backgroundImage": "url(https://live.staticflickr.com/8307/7879971866_4ef11ff25b_b.jpg)"
		}
	}
}

テーマに同梱されたアセットを使用したい場合は、file: プレフィックスを使用し、テーマディレクトリのルートからの相対パスで記述します。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		}
	},
	"styles": {
		"background": {
			"backgroundImage": {
				"url": "file:./assets/background.jpg"
			}
		}
	}
}

これらを踏まえて、4つ全てのスタイルを定義する一例は以下です。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		},
		"background": {
			"backgroundImage": true,
			"backgroundSize": true
		}
	},
	"styles": {
		"background": {
			"backgroundImage": "url(https://live.staticflickr.com/8307/7879971866_4ef11ff25b_b.jpg)",
			"backgroundSize": "cover",
			"backgroundPosition": "center",
			"backgroundRepeat": "no-repeat"
		}
	}
}

なお WordPress6.6では、theme.json での定義に加えて、グローバルスタイルでもサイト全体の背景を設定できるようになっています。

この設定自体を有効にするには、WordPress6.4で追加された settings.background.backgroundImage (および WordPress6.5で追加された settings.background.backgroundSize) をオプトインします。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 2,
	"settings": {
		"background": {
			"backgroundImage": true,
			"backgroundSize": true
		}
	}
}
Background

styles.blocks

styles.blocks.{blockName}.typography.textAlign

CSSの text-align を設定します。以下は、見出しのデフォルトのテキスト位置を左右中央に設定する例です。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		}
	},
	"styles": {
		"blocks": {
			"core/heading": {
				"typography": {
					"textAlign": "center"
				}
			}
		}
	}
}

styles.blocks.{blockName}.dimensions.aspectRatio

CSSの aspect-ratio を設定します。以下は、カバーブロックに適用する例です。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		}
	},
	"styles": {
		"blocks": {
			"core/cover": {
				"dimensions": {
					"aspectRatio": "1/1"
				}
			}
		}
	}
}

styles.blocks.variations

セクションごとのスタイルを行うためのセクションです。

この機能の概念についてはかなり難しいのですが、一つもメリットとして、ブロックスタイルごとのスタイル定義が theme.json 経由でより簡単に行えるようになったようです。

これまでも、 block.json 経由で登録されたブロックスタイルに限ってですが、「特定のブロックスタイルのみにスタイルを定義する」ということはできました。以下は、画像ブロックの rounded スタイルの角丸を変更する例です。

{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"settings": {
		"layout": {
			"contentSize": "900px"
		}
	},
	"styles": {
		"blocks": {
			"core/image": {
				"variations": {
					"rounded": {
						"border": {
							"radius": "10px"
						}
					}
				}
			}
		}
	}
}

WordPress 6.6では、このようなことを実現するために、ブロックスタイルの仕様が拡張され、theme.json のみで、ブロックスタイルの登録とそれに対するスタイル定義をあわせて行えるようになったようです。

以下の例では、以下のことを実現しています。

  • test というバリエーションを追加する
  • そのバリエーションを、blockTypes プロパティを介してグループブロックとカラムブロックに適用する
  • そのバリエーションに対してスタイルを適用する
{
	"$schema": "https://schemas.wp.org/trunk/theme.json",
	"version": 3,
	"styles": {
		"blocks": {
			"variations": {
				"test": {
					"blockTypes": [
						"core/group",
						"core/columns"
					],
					"color": {
						"text": "#ff0000"
					}
				}
			}
		}
	}
}

セクションスタリングの概念については非常に難しいのですが、興味がある方は以下 PR を読んでみてください。

Block Styles: Extend block style variations as mechanism for achieving section styling by aaronrobertshaw · Pull Request #57908 · WordPress/gutenberg