summaryrefslogtreecommitdiffstats
path: root/wp-includes/class-wp-theme-json-schema.php
diff options
context:
space:
mode:
Diffstat (limited to 'wp-includes/class-wp-theme-json-schema.php')
-rw-r--r--wp-includes/class-wp-theme-json-schema.php86
1 files changed, 82 insertions, 4 deletions
diff --git a/wp-includes/class-wp-theme-json-schema.php b/wp-includes/class-wp-theme-json-schema.php
index 46712a0..aaa2f96 100644
--- a/wp-includes/class-wp-theme-json-schema.php
+++ b/wp-includes/class-wp-theme-json-schema.php
@@ -35,20 +35,27 @@ class WP_Theme_JSON_Schema {
* Function that migrates a given theme.json structure to the last version.
*
* @since 5.9.0
+ * @since 6.6.0 Migrate up to v3 and add $origin parameter.
*
* @param array $theme_json The structure to migrate.
- *
+ * @param string $origin Optional. What source of data this object represents.
+ * One of 'blocks', 'default', 'theme', or 'custom'. Default 'theme'.
* @return array The structure in the last version.
*/
- public static function migrate( $theme_json ) {
+ public static function migrate( $theme_json, $origin = 'theme' ) {
if ( ! isset( $theme_json['version'] ) ) {
$theme_json = array(
'version' => WP_Theme_JSON::LATEST_SCHEMA,
);
}
- if ( 1 === $theme_json['version'] ) {
- $theme_json = self::migrate_v1_to_v2( $theme_json );
+ // Migrate each version in order starting with the current version.
+ switch ( $theme_json['version'] ) {
+ case 1:
+ $theme_json = self::migrate_v1_to_v2( $theme_json );
+ // Deliberate fall through. Once migrated to v2, also migrate to v3.
+ case 2:
+ $theme_json = self::migrate_v2_to_v3( $theme_json, $origin );
}
return $theme_json;
@@ -85,6 +92,77 @@ class WP_Theme_JSON_Schema {
}
/**
+ * Migrates from v2 to v3.
+ *
+ * - 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.
+ *
+ * @since 6.6.0
+ *
+ * @param array $old Data to migrate.
+ * @param string $origin What source of data this object represents.
+ * One of 'blocks', 'default', 'theme', or 'custom'.
+ * @return array Data with defaultFontSizes set to false.
+ */
+ 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;
+ }
+
+ /**
* Processes the settings subtree.
*
* @since 5.9.0