Декомпозиция theme.json

Файл theme.json может быть очень большим из-за чего его становится сложно поддерживать, поэтому иногда удобно разбить его на отдельные файлы поменьше.

Однако ни JSON-спецификация, ни WordPress theme.json (или любой «SamJSON») не умеют «импортировать» другие JSON-файлы.

Разделить можно только через сборку или PHP-фильтры, которые склеят куски в один объект до того, как его увидит WordPress.

WordPress ≥ 6.1 даёт четыре фильтра, самый удобный — wp_theme_json_data_theme.

Пример структуры файлов:

src/
  ├─ tokens/
  │   ├─ colors.json
  │   ├─ typography.json
  │   └─ spacing.json
  └─ settings.json

Пример склейки через PHP фильтр:

add_filter( 'wp_theme_json_data_theme', function( $theme_json ) {

	$parts = [
		json_decode( file_get_contents( get_theme_file_path( 'tokens/colors.json' ) ), true ),
		json_decode( file_get_contents( get_theme_file_path( 'tokens/spacing.json' ) ), true ),
	];

	foreach ( $parts as $fragment ) {
		$theme_json->update_with( $fragment );
	}

	return $theme_json;
} );

--