W3cubDocs

/WordPress

WP_Theme_JSON_Schema::migrate_v2_to_v3( array $old, string $origin ): array

Migrates from v2 to v3.

Description

  • Sets settings.typography.defaultFontSizes to false if settings.typography.fontSizes are defined.
  • Sets settings.spacing.defaultSpacingSizes to false if settings.spacing.spacingSizes are defined.
  • Prevents settings.spacing.spacingSizes from merging with settings.spacing.spacingScale by unsetting spacingScale when spacingSizes are defined.

Parameters

$oldarrayrequired
Data to migrate.
$originstringrequired
What source of data this object represents.
One of 'blocks', 'default', 'theme', or 'custom'.

Return

array Data with defaultFontSizes set to false.

Source

private static function migrate_v2_to_v3( $old, $origin ) {
	// Copy everything.
	$new = $old;

	// Set the new version.
	$new['version'] = 3;

	/*
	 * Remaining changes do not need to be applied to the custom origin,
	 * as they should take on the value of the theme origin.
	 */
	if ( 'custom' === $origin ) {
		return $new;
	}

	/*
	 * Even though defaultFontSizes and defaultSpacingSizes are new
	 * settings, we need to migrate them as they each control
	 * PRESETS_METADATA prevent_override values which were previously
	 * hardcoded to false. This only needs to happen when the theme provides
	 * fontSizes or spacingSizes as they could match the default ones and
	 * affect the generated CSS.
	 */
	if ( isset( $old['settings']['typography']['fontSizes'] ) ) {
		$new['settings']['typography']['defaultFontSizes'] = false;
	}

	/*
	 * Similarly to defaultFontSizes, we need to migrate defaultSpacingSizes
	 * as it controls the PRESETS_METADATA prevent_override which was
	 * previously hardcoded to false. This only needs to happen when the
	 * theme provided spacing sizes via spacingSizes or spacingScale.
	 */
	if (
		isset( $old['settings']['spacing']['spacingSizes'] ) ||
		isset( $old['settings']['spacing']['spacingScale'] )
	) {
		$new['settings']['spacing']['defaultSpacingSizes'] = false;
	}

	/*
	 * In v3 spacingSizes is merged with the generated spacingScale sizes
	 * instead of completely replacing them. The v3 behavior is what was
	 * documented for the v2 schema, but the code never actually did work
	 * that way. Instead of surprising users with a behavior change two
	 * years after the fact at the same time as a v3 update is introduced,
	 * we'll continue using the "bugged" behavior for v2 themes. And treat
	 * the "bug fix" as a breaking change for v3.
	 */
	if ( isset( $old['settings']['spacing']['spacingSizes'] ) ) {
		unset( $new['settings']['spacing']['spacingScale'] );
	}

	return $new;
}

Changelog

Version Description
6.6.0 Introduced.

© 2003–2024 WordPress Foundation
Licensed under the GNU GPLv2+ License.
https://developer.wordpress.org/reference/classes/wp_theme_json_schema/migrate_v2_to_v3