Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93

Warning: Undefined array key "page_file_edit_line" in /home/sportsfever/public_html/filemanger/edit_text_line.php on line 32
/home/sportsfe.../httpdocs/wp-inclu...
File: class-wp-theme-json.php
$css .= '.wp-site-blocks { padding-top: var(--wp--style--root--padding-top); padding-bottom: var(--wp--style--root--padding-bottom); }';
[3000] Fix | Delete
// Right and left padding are applied to the first container with `.has-global-padding` class.
[3001] Fix | Delete
$css .= '.has-global-padding { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }';
[3002] Fix | Delete
// Alignfull children of the container with left and right padding have negative margins so they can still be full width.
[3003] Fix | Delete
$css .= '.has-global-padding > .alignfull { margin-right: calc(var(--wp--style--root--padding-right) * -1); margin-left: calc(var(--wp--style--root--padding-left) * -1); }';
[3004] Fix | Delete
// Nested children of the container with left and right padding that are not full aligned do not get padding, unless they are direct children of an alignfull flow container.
[3005] Fix | Delete
$css .= '.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) { padding-right: 0; padding-left: 0; }';
[3006] Fix | Delete
// Alignfull direct children of the containers that are targeted by the rule above do not need negative margins.
[3007] Fix | Delete
$css .= '.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) > .alignfull { margin-left: 0; margin-right: 0; }';
[3008] Fix | Delete
}
[3009] Fix | Delete
[3010] Fix | Delete
$css .= '.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }';
[3011] Fix | Delete
$css .= '.wp-site-blocks > .alignright { float: right; margin-left: 2em; }';
[3012] Fix | Delete
$css .= '.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }';
[3013] Fix | Delete
[3014] Fix | Delete
// Block gap styles will be output unless explicitly set to `null`. See static::PROTECTED_PROPERTIES.
[3015] Fix | Delete
if ( isset( $this->theme_json['settings']['spacing']['blockGap'] ) ) {
[3016] Fix | Delete
$block_gap_value = static::get_property_value( $this->theme_json, array( 'styles', 'spacing', 'blockGap' ) );
[3017] Fix | Delete
$css .= ":where(.wp-site-blocks) > * { margin-block-start: $block_gap_value; margin-block-end: 0; }";
[3018] Fix | Delete
$css .= ':where(.wp-site-blocks) > :first-child { margin-block-start: 0; }';
[3019] Fix | Delete
$css .= ':where(.wp-site-blocks) > :last-child { margin-block-end: 0; }';
[3020] Fix | Delete
[3021] Fix | Delete
// For backwards compatibility, ensure the legacy block gap CSS variable is still available.
[3022] Fix | Delete
$css .= static::ROOT_CSS_PROPERTIES_SELECTOR . " { --wp--style--block-gap: $block_gap_value; }";
[3023] Fix | Delete
}
[3024] Fix | Delete
$css .= $this->get_layout_styles( $block_metadata );
[3025] Fix | Delete
[3026] Fix | Delete
return $css;
[3027] Fix | Delete
}
[3028] Fix | Delete
[3029] Fix | Delete
/**
[3030] Fix | Delete
* For metadata values that can either be booleans or paths to booleans, gets the value.
[3031] Fix | Delete
*
[3032] Fix | Delete
* $data = array(
[3033] Fix | Delete
* 'color' => array(
[3034] Fix | Delete
* 'defaultPalette' => true
[3035] Fix | Delete
* )
[3036] Fix | Delete
* );
[3037] Fix | Delete
*
[3038] Fix | Delete
* static::get_metadata_boolean( $data, false );
[3039] Fix | Delete
* // => false
[3040] Fix | Delete
*
[3041] Fix | Delete
* static::get_metadata_boolean( $data, array( 'color', 'defaultPalette' ) );
[3042] Fix | Delete
* // => true
[3043] Fix | Delete
*
[3044] Fix | Delete
* @since 6.0.0
[3045] Fix | Delete
*
[3046] Fix | Delete
* @param array $data The data to inspect.
[3047] Fix | Delete
* @param bool|array $path Boolean or path to a boolean.
[3048] Fix | Delete
* @param bool $default_value Default value if the referenced path is missing.
[3049] Fix | Delete
* Default false.
[3050] Fix | Delete
* @return bool Value of boolean metadata.
[3051] Fix | Delete
*/
[3052] Fix | Delete
protected static function get_metadata_boolean( $data, $path, $default_value = false ) {
[3053] Fix | Delete
if ( is_bool( $path ) ) {
[3054] Fix | Delete
return $path;
[3055] Fix | Delete
}
[3056] Fix | Delete
[3057] Fix | Delete
if ( is_array( $path ) ) {
[3058] Fix | Delete
$value = _wp_array_get( $data, $path );
[3059] Fix | Delete
if ( null !== $value ) {
[3060] Fix | Delete
return $value;
[3061] Fix | Delete
}
[3062] Fix | Delete
}
[3063] Fix | Delete
[3064] Fix | Delete
return $default_value;
[3065] Fix | Delete
}
[3066] Fix | Delete
[3067] Fix | Delete
/**
[3068] Fix | Delete
* Merges new incoming data.
[3069] Fix | Delete
*
[3070] Fix | Delete
* @since 5.8.0
[3071] Fix | Delete
* @since 5.9.0 Duotone preset also has origins.
[3072] Fix | Delete
*
[3073] Fix | Delete
* @param WP_Theme_JSON $incoming Data to merge.
[3074] Fix | Delete
*/
[3075] Fix | Delete
public function merge( $incoming ) {
[3076] Fix | Delete
$incoming_data = $incoming->get_raw_data();
[3077] Fix | Delete
$this->theme_json = array_replace_recursive( $this->theme_json, $incoming_data );
[3078] Fix | Delete
[3079] Fix | Delete
/*
[3080] Fix | Delete
* Recompute all the spacing sizes based on the new hierarchy of data. In the constructor
[3081] Fix | Delete
* spacingScale and spacingSizes are both keyed by origin and VALID_ORIGINS is ordered, so
[3082] Fix | Delete
* we can allow partial spacingScale data to inherit missing data from earlier layers when
[3083] Fix | Delete
* computing the spacing sizes.
[3084] Fix | Delete
*
[3085] Fix | Delete
* This happens before the presets are merged to ensure that default spacing sizes can be
[3086] Fix | Delete
* removed from the theme origin if $prevent_override is true.
[3087] Fix | Delete
*/
[3088] Fix | Delete
$flattened_spacing_scale = array();
[3089] Fix | Delete
foreach ( static::VALID_ORIGINS as $origin ) {
[3090] Fix | Delete
$scale_path = array( 'settings', 'spacing', 'spacingScale', $origin );
[3091] Fix | Delete
[3092] Fix | Delete
// Apply the base spacing scale to the current layer.
[3093] Fix | Delete
$base_spacing_scale = _wp_array_get( $this->theme_json, $scale_path, array() );
[3094] Fix | Delete
$flattened_spacing_scale = array_replace( $flattened_spacing_scale, $base_spacing_scale );
[3095] Fix | Delete
[3096] Fix | Delete
$spacing_scale = _wp_array_get( $incoming_data, $scale_path, null );
[3097] Fix | Delete
if ( ! isset( $spacing_scale ) ) {
[3098] Fix | Delete
continue;
[3099] Fix | Delete
}
[3100] Fix | Delete
[3101] Fix | Delete
// Allow partial scale settings by merging with lower layers.
[3102] Fix | Delete
$flattened_spacing_scale = array_replace( $flattened_spacing_scale, $spacing_scale );
[3103] Fix | Delete
[3104] Fix | Delete
// Generate and merge the scales for this layer.
[3105] Fix | Delete
$sizes_path = array( 'settings', 'spacing', 'spacingSizes', $origin );
[3106] Fix | Delete
$spacing_sizes = _wp_array_get( $incoming_data, $sizes_path, array() );
[3107] Fix | Delete
$spacing_scale_sizes = static::compute_spacing_sizes( $flattened_spacing_scale );
[3108] Fix | Delete
$merged_spacing_sizes = static::merge_spacing_sizes( $spacing_scale_sizes, $spacing_sizes );
[3109] Fix | Delete
[3110] Fix | Delete
_wp_array_set( $incoming_data, $sizes_path, $merged_spacing_sizes );
[3111] Fix | Delete
}
[3112] Fix | Delete
[3113] Fix | Delete
/*
[3114] Fix | Delete
* The array_replace_recursive algorithm merges at the leaf level,
[3115] Fix | Delete
* but we don't want leaf arrays to be merged, so we overwrite it.
[3116] Fix | Delete
*
[3117] Fix | Delete
* For leaf values that are sequential arrays it will use the numeric indexes for replacement.
[3118] Fix | Delete
* We rather replace the existing with the incoming value, if it exists.
[3119] Fix | Delete
* This is the case of spacing.units.
[3120] Fix | Delete
*
[3121] Fix | Delete
* For leaf values that are associative arrays it will merge them as expected.
[3122] Fix | Delete
* This is also not the behavior we want for the current associative arrays (presets).
[3123] Fix | Delete
* We rather replace the existing with the incoming value, if it exists.
[3124] Fix | Delete
* This happens, for example, when we merge data from theme.json upon existing
[3125] Fix | Delete
* theme supports or when we merge anything coming from the same source twice.
[3126] Fix | Delete
* This is the case of color.palette, color.gradients, color.duotone,
[3127] Fix | Delete
* typography.fontSizes, or typography.fontFamilies.
[3128] Fix | Delete
*
[3129] Fix | Delete
* Additionally, for some preset types, we also want to make sure the
[3130] Fix | Delete
* values they introduce don't conflict with default values. We do so
[3131] Fix | Delete
* by checking the incoming slugs for theme presets and compare them
[3132] Fix | Delete
* with the equivalent default presets: if a slug is present as a default
[3133] Fix | Delete
* we remove it from the theme presets.
[3134] Fix | Delete
*/
[3135] Fix | Delete
$nodes = static::get_setting_nodes( $incoming_data );
[3136] Fix | Delete
$slugs_global = static::get_default_slugs( $this->theme_json, array( 'settings' ) );
[3137] Fix | Delete
foreach ( $nodes as $node ) {
[3138] Fix | Delete
// Replace the spacing.units.
[3139] Fix | Delete
$path = $node['path'];
[3140] Fix | Delete
$path[] = 'spacing';
[3141] Fix | Delete
$path[] = 'units';
[3142] Fix | Delete
[3143] Fix | Delete
$content = _wp_array_get( $incoming_data, $path, null );
[3144] Fix | Delete
if ( isset( $content ) ) {
[3145] Fix | Delete
_wp_array_set( $this->theme_json, $path, $content );
[3146] Fix | Delete
}
[3147] Fix | Delete
[3148] Fix | Delete
// Replace the presets.
[3149] Fix | Delete
foreach ( static::PRESETS_METADATA as $preset_metadata ) {
[3150] Fix | Delete
$prevent_override = $preset_metadata['prevent_override'];
[3151] Fix | Delete
if ( is_array( $prevent_override ) ) {
[3152] Fix | Delete
$prevent_override = _wp_array_get( $this->theme_json['settings'], $preset_metadata['prevent_override'] );
[3153] Fix | Delete
}
[3154] Fix | Delete
[3155] Fix | Delete
foreach ( static::VALID_ORIGINS as $origin ) {
[3156] Fix | Delete
$base_path = $node['path'];
[3157] Fix | Delete
foreach ( $preset_metadata['path'] as $leaf ) {
[3158] Fix | Delete
$base_path[] = $leaf;
[3159] Fix | Delete
}
[3160] Fix | Delete
[3161] Fix | Delete
$path = $base_path;
[3162] Fix | Delete
$path[] = $origin;
[3163] Fix | Delete
[3164] Fix | Delete
$content = _wp_array_get( $incoming_data, $path, null );
[3165] Fix | Delete
if ( ! isset( $content ) ) {
[3166] Fix | Delete
continue;
[3167] Fix | Delete
}
[3168] Fix | Delete
[3169] Fix | Delete
// Set names for theme presets based on the slug if they are not set and can use default names.
[3170] Fix | Delete
if ( 'theme' === $origin && $preset_metadata['use_default_names'] ) {
[3171] Fix | Delete
foreach ( $content as $key => $item ) {
[3172] Fix | Delete
if ( ! isset( $item['name'] ) ) {
[3173] Fix | Delete
$name = static::get_name_from_defaults( $item['slug'], $base_path );
[3174] Fix | Delete
if ( null !== $name ) {
[3175] Fix | Delete
$content[ $key ]['name'] = $name;
[3176] Fix | Delete
}
[3177] Fix | Delete
}
[3178] Fix | Delete
}
[3179] Fix | Delete
}
[3180] Fix | Delete
[3181] Fix | Delete
// Filter out default slugs from theme presets when defaults should not be overridden.
[3182] Fix | Delete
if ( 'theme' === $origin && $prevent_override ) {
[3183] Fix | Delete
$slugs_node = static::get_default_slugs( $this->theme_json, $node['path'] );
[3184] Fix | Delete
$preset_global = _wp_array_get( $slugs_global, $preset_metadata['path'], array() );
[3185] Fix | Delete
$preset_node = _wp_array_get( $slugs_node, $preset_metadata['path'], array() );
[3186] Fix | Delete
$preset_slugs = array_merge_recursive( $preset_global, $preset_node );
[3187] Fix | Delete
[3188] Fix | Delete
$content = static::filter_slugs( $content, $preset_slugs );
[3189] Fix | Delete
}
[3190] Fix | Delete
[3191] Fix | Delete
_wp_array_set( $this->theme_json, $path, $content );
[3192] Fix | Delete
}
[3193] Fix | Delete
}
[3194] Fix | Delete
}
[3195] Fix | Delete
}
[3196] Fix | Delete
[3197] Fix | Delete
/**
[3198] Fix | Delete
* Converts all filter (duotone) presets into SVGs.
[3199] Fix | Delete
*
[3200] Fix | Delete
* @since 5.9.1
[3201] Fix | Delete
*
[3202] Fix | Delete
* @param array $origins List of origins to process.
[3203] Fix | Delete
* @return string SVG filters.
[3204] Fix | Delete
*/
[3205] Fix | Delete
public function get_svg_filters( $origins ) {
[3206] Fix | Delete
$blocks_metadata = static::get_blocks_metadata();
[3207] Fix | Delete
$setting_nodes = static::get_setting_nodes( $this->theme_json, $blocks_metadata );
[3208] Fix | Delete
[3209] Fix | Delete
$filters = '';
[3210] Fix | Delete
foreach ( $setting_nodes as $metadata ) {
[3211] Fix | Delete
$node = _wp_array_get( $this->theme_json, $metadata['path'], array() );
[3212] Fix | Delete
if ( empty( $node['color']['duotone'] ) ) {
[3213] Fix | Delete
continue;
[3214] Fix | Delete
}
[3215] Fix | Delete
[3216] Fix | Delete
$duotone_presets = $node['color']['duotone'];
[3217] Fix | Delete
[3218] Fix | Delete
foreach ( $origins as $origin ) {
[3219] Fix | Delete
if ( ! isset( $duotone_presets[ $origin ] ) ) {
[3220] Fix | Delete
continue;
[3221] Fix | Delete
}
[3222] Fix | Delete
foreach ( $duotone_presets[ $origin ] as $duotone_preset ) {
[3223] Fix | Delete
$filters .= wp_get_duotone_filter_svg( $duotone_preset );
[3224] Fix | Delete
}
[3225] Fix | Delete
}
[3226] Fix | Delete
}
[3227] Fix | Delete
[3228] Fix | Delete
return $filters;
[3229] Fix | Delete
}
[3230] Fix | Delete
[3231] Fix | Delete
/**
[3232] Fix | Delete
* Determines whether a presets should be overridden or not.
[3233] Fix | Delete
*
[3234] Fix | Delete
* @since 5.9.0
[3235] Fix | Delete
* @deprecated 6.0.0 Use {@see 'get_metadata_boolean'} instead.
[3236] Fix | Delete
*
[3237] Fix | Delete
* @param array $theme_json The theme.json like structure to inspect.
[3238] Fix | Delete
* @param array $path Path to inspect.
[3239] Fix | Delete
* @param bool|array $override Data to compute whether to override the preset.
[3240] Fix | Delete
* @return bool
[3241] Fix | Delete
*/
[3242] Fix | Delete
protected static function should_override_preset( $theme_json, $path, $override ) {
[3243] Fix | Delete
_deprecated_function( __METHOD__, '6.0.0', 'get_metadata_boolean' );
[3244] Fix | Delete
[3245] Fix | Delete
if ( is_bool( $override ) ) {
[3246] Fix | Delete
return $override;
[3247] Fix | Delete
}
[3248] Fix | Delete
[3249] Fix | Delete
/*
[3250] Fix | Delete
* The relationship between whether to override the defaults
[3251] Fix | Delete
* and whether the defaults are enabled is inverse:
[3252] Fix | Delete
*
[3253] Fix | Delete
* - If defaults are enabled => theme presets should not be overridden
[3254] Fix | Delete
* - If defaults are disabled => theme presets should be overridden
[3255] Fix | Delete
*
[3256] Fix | Delete
* For example, a theme sets defaultPalette to false,
[3257] Fix | Delete
* making the default palette hidden from the user.
[3258] Fix | Delete
* In that case, we want all the theme presets to be present,
[3259] Fix | Delete
* so they should override the defaults.
[3260] Fix | Delete
*/
[3261] Fix | Delete
if ( is_array( $override ) ) {
[3262] Fix | Delete
$value = _wp_array_get( $theme_json, array_merge( $path, $override ) );
[3263] Fix | Delete
if ( isset( $value ) ) {
[3264] Fix | Delete
return ! $value;
[3265] Fix | Delete
}
[3266] Fix | Delete
[3267] Fix | Delete
// Search the top-level key if none was found for this node.
[3268] Fix | Delete
$value = _wp_array_get( $theme_json, array_merge( array( 'settings' ), $override ) );
[3269] Fix | Delete
if ( isset( $value ) ) {
[3270] Fix | Delete
return ! $value;
[3271] Fix | Delete
}
[3272] Fix | Delete
[3273] Fix | Delete
return true;
[3274] Fix | Delete
}
[3275] Fix | Delete
}
[3276] Fix | Delete
[3277] Fix | Delete
/**
[3278] Fix | Delete
* Returns the default slugs for all the presets in an associative array
[3279] Fix | Delete
* whose keys are the preset paths and the leaves is the list of slugs.
[3280] Fix | Delete
*
[3281] Fix | Delete
* For example:
[3282] Fix | Delete
*
[3283] Fix | Delete
* array(
[3284] Fix | Delete
* 'color' => array(
[3285] Fix | Delete
* 'palette' => array( 'slug-1', 'slug-2' ),
[3286] Fix | Delete
* 'gradients' => array( 'slug-3', 'slug-4' ),
[3287] Fix | Delete
* ),
[3288] Fix | Delete
* )
[3289] Fix | Delete
*
[3290] Fix | Delete
* @since 5.9.0
[3291] Fix | Delete
*
[3292] Fix | Delete
* @param array $data A theme.json like structure.
[3293] Fix | Delete
* @param array $node_path The path to inspect. It's 'settings' by default.
[3294] Fix | Delete
* @return array
[3295] Fix | Delete
*/
[3296] Fix | Delete
protected static function get_default_slugs( $data, $node_path ) {
[3297] Fix | Delete
$slugs = array();
[3298] Fix | Delete
[3299] Fix | Delete
foreach ( static::PRESETS_METADATA as $metadata ) {
[3300] Fix | Delete
$path = $node_path;
[3301] Fix | Delete
foreach ( $metadata['path'] as $leaf ) {
[3302] Fix | Delete
$path[] = $leaf;
[3303] Fix | Delete
}
[3304] Fix | Delete
$path[] = 'default';
[3305] Fix | Delete
[3306] Fix | Delete
$preset = _wp_array_get( $data, $path, null );
[3307] Fix | Delete
if ( ! isset( $preset ) ) {
[3308] Fix | Delete
continue;
[3309] Fix | Delete
}
[3310] Fix | Delete
[3311] Fix | Delete
$slugs_for_preset = array();
[3312] Fix | Delete
foreach ( $preset as $item ) {
[3313] Fix | Delete
if ( isset( $item['slug'] ) ) {
[3314] Fix | Delete
$slugs_for_preset[] = $item['slug'];
[3315] Fix | Delete
}
[3316] Fix | Delete
}
[3317] Fix | Delete
[3318] Fix | Delete
_wp_array_set( $slugs, $metadata['path'], $slugs_for_preset );
[3319] Fix | Delete
}
[3320] Fix | Delete
[3321] Fix | Delete
return $slugs;
[3322] Fix | Delete
}
[3323] Fix | Delete
[3324] Fix | Delete
/**
[3325] Fix | Delete
* Gets a `default`'s preset name by a provided slug.
[3326] Fix | Delete
*
[3327] Fix | Delete
* @since 5.9.0
[3328] Fix | Delete
*
[3329] Fix | Delete
* @param string $slug The slug we want to find a match from default presets.
[3330] Fix | Delete
* @param array $base_path The path to inspect. It's 'settings' by default.
[3331] Fix | Delete
* @return string|null
[3332] Fix | Delete
*/
[3333] Fix | Delete
protected function get_name_from_defaults( $slug, $base_path ) {
[3334] Fix | Delete
$path = $base_path;
[3335] Fix | Delete
$path[] = 'default';
[3336] Fix | Delete
$default_content = _wp_array_get( $this->theme_json, $path, null );
[3337] Fix | Delete
if ( ! $default_content ) {
[3338] Fix | Delete
return null;
[3339] Fix | Delete
}
[3340] Fix | Delete
foreach ( $default_content as $item ) {
[3341] Fix | Delete
if ( $slug === $item['slug'] ) {
[3342] Fix | Delete
return $item['name'];
[3343] Fix | Delete
}
[3344] Fix | Delete
}
[3345] Fix | Delete
return null;
[3346] Fix | Delete
}
[3347] Fix | Delete
[3348] Fix | Delete
/**
[3349] Fix | Delete
* Removes the preset values whose slug is equal to any of given slugs.
[3350] Fix | Delete
*
[3351] Fix | Delete
* @since 5.9.0
[3352] Fix | Delete
*
[3353] Fix | Delete
* @param array $node The node with the presets to validate.
[3354] Fix | Delete
* @param array $slugs The slugs that should not be overridden.
[3355] Fix | Delete
* @return array The new node.
[3356] Fix | Delete
*/
[3357] Fix | Delete
protected static function filter_slugs( $node, $slugs ) {
[3358] Fix | Delete
if ( empty( $slugs ) ) {
[3359] Fix | Delete
return $node;
[3360] Fix | Delete
}
[3361] Fix | Delete
[3362] Fix | Delete
$new_node = array();
[3363] Fix | Delete
foreach ( $node as $value ) {
[3364] Fix | Delete
if ( isset( $value['slug'] ) && ! in_array( $value['slug'], $slugs, true ) ) {
[3365] Fix | Delete
$new_node[] = $value;
[3366] Fix | Delete
}
[3367] Fix | Delete
}
[3368] Fix | Delete
[3369] Fix | Delete
return $new_node;
[3370] Fix | Delete
}
[3371] Fix | Delete
[3372] Fix | Delete
/**
[3373] Fix | Delete
* Removes insecure data from theme.json.
[3374] Fix | Delete
*
[3375] Fix | Delete
* @since 5.9.0
[3376] Fix | Delete
* @since 6.3.2 Preserves global styles block variations when securing styles.
[3377] Fix | Delete
* @since 6.6.0 Updated to allow variation element styles and $origin parameter.
[3378] Fix | Delete
*
[3379] Fix | Delete
* @param array $theme_json Structure to sanitize.
[3380] Fix | Delete
* @param string $origin Optional. What source of data this object represents.
[3381] Fix | Delete
* One of 'blocks', 'default', 'theme', or 'custom'. Default 'theme'.
[3382] Fix | Delete
* @return array Sanitized structure.
[3383] Fix | Delete
*/
[3384] Fix | Delete
public static function remove_insecure_properties( $theme_json, $origin = 'theme' ) {
[3385] Fix | Delete
if ( ! in_array( $origin, static::VALID_ORIGINS, true ) ) {
[3386] Fix | Delete
$origin = 'theme';
[3387] Fix | Delete
}
[3388] Fix | Delete
[3389] Fix | Delete
$sanitized = array();
[3390] Fix | Delete
[3391] Fix | Delete
$theme_json = WP_Theme_JSON_Schema::migrate( $theme_json, $origin );
[3392] Fix | Delete
[3393] Fix | Delete
$valid_block_names = array_keys( static::get_blocks_metadata() );
[3394] Fix | Delete
$valid_element_names = array_keys( static::ELEMENTS );
[3395] Fix | Delete
$valid_variations = static::get_valid_block_style_variations();
[3396] Fix | Delete
[3397] Fix | Delete
$theme_json = static::sanitize( $theme_json, $valid_block_names, $valid_element_names, $valid_variations );
[3398] Fix | Delete
[3399] Fix | Delete
$blocks_metadata = static::get_blocks_metadata();
[3400] Fix | Delete
$style_options = array( 'include_block_style_variations' => true ); // Allow variations data.
[3401] Fix | Delete
$style_nodes = static::get_style_nodes( $theme_json, $blocks_metadata, $style_options );
[3402] Fix | Delete
[3403] Fix | Delete
foreach ( $style_nodes as $metadata ) {
[3404] Fix | Delete
$input = _wp_array_get( $theme_json, $metadata['path'], array() );
[3405] Fix | Delete
if ( empty( $input ) ) {
[3406] Fix | Delete
continue;
[3407] Fix | Delete
}
[3408] Fix | Delete
[3409] Fix | Delete
// The global styles custom CSS is not sanitized, but can only be edited by users with 'edit_css' capability.
[3410] Fix | Delete
if ( isset( $input['css'] ) && current_user_can( 'edit_css' ) ) {
[3411] Fix | Delete
$output = $input;
[3412] Fix | Delete
} else {
[3413] Fix | Delete
$output = static::remove_insecure_styles( $input );
[3414] Fix | Delete
}
[3415] Fix | Delete
[3416] Fix | Delete
/*
[3417] Fix | Delete
* Get a reference to element name from path.
[3418] Fix | Delete
* $metadata['path'] = array( 'styles', 'elements', 'link' );
[3419] Fix | Delete
*/
[3420] Fix | Delete
$current_element = $metadata['path'][ count( $metadata['path'] ) - 1 ];
[3421] Fix | Delete
[3422] Fix | Delete
/*
[3423] Fix | Delete
* $output is stripped of pseudo selectors. Re-add and process them
[3424] Fix | Delete
* or insecure styles here.
[3425] Fix | Delete
*/
[3426] Fix | Delete
if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] ) ) {
[3427] Fix | Delete
foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $current_element ] as $pseudo_selector ) {
[3428] Fix | Delete
if ( isset( $input[ $pseudo_selector ] ) ) {
[3429] Fix | Delete
$output[ $pseudo_selector ] = static::remove_insecure_styles( $input[ $pseudo_selector ] );
[3430] Fix | Delete
}
[3431] Fix | Delete
}
[3432] Fix | Delete
}
[3433] Fix | Delete
[3434] Fix | Delete
if ( ! empty( $output ) ) {
[3435] Fix | Delete
_wp_array_set( $sanitized, $metadata['path'], $output );
[3436] Fix | Delete
}
[3437] Fix | Delete
[3438] Fix | Delete
if ( isset( $metadata['variations'] ) ) {
[3439] Fix | Delete
foreach ( $metadata['variations'] as $variation ) {
[3440] Fix | Delete
$variation_input = _wp_array_get( $theme_json, $variation['path'], array() );
[3441] Fix | Delete
if ( empty( $variation_input ) ) {
[3442] Fix | Delete
continue;
[3443] Fix | Delete
}
[3444] Fix | Delete
[3445] Fix | Delete
$variation_output = static::remove_insecure_styles( $variation_input );
[3446] Fix | Delete
[3447] Fix | Delete
// Process a variation's elements and element pseudo selector styles.
[3448] Fix | Delete
if ( isset( $variation_input['elements'] ) ) {
[3449] Fix | Delete
foreach ( $valid_element_names as $element_name ) {
[3450] Fix | Delete
$element_input = $variation_input['elements'][ $element_name ] ?? null;
[3451] Fix | Delete
if ( $element_input ) {
[3452] Fix | Delete
$element_output = static::remove_insecure_styles( $element_input );
[3453] Fix | Delete
[3454] Fix | Delete
if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element_name ] ) ) {
[3455] Fix | Delete
foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element_name ] as $pseudo_selector ) {
[3456] Fix | Delete
if ( isset( $element_input[ $pseudo_selector ] ) ) {
[3457] Fix | Delete
$element_output[ $pseudo_selector ] = static::remove_insecure_styles( $element_input[ $pseudo_selector ] );
[3458] Fix | Delete
}
[3459] Fix | Delete
}
[3460] Fix | Delete
}
[3461] Fix | Delete
[3462] Fix | Delete
if ( ! empty( $element_output ) ) {
[3463] Fix | Delete
_wp_array_set( $variation_output, array( 'elements', $element_name ), $element_output );
[3464] Fix | Delete
}
[3465] Fix | Delete
}
[3466] Fix | Delete
}
[3467] Fix | Delete
}
[3468] Fix | Delete
[3469] Fix | Delete
if ( ! empty( $variation_output ) ) {
[3470] Fix | Delete
_wp_array_set( $sanitized, $variation['path'], $variation_output );
[3471] Fix | Delete
}
[3472] Fix | Delete
}
[3473] Fix | Delete
}
[3474] Fix | Delete
}
[3475] Fix | Delete
[3476] Fix | Delete
$setting_nodes = static::get_setting_nodes( $theme_json );
[3477] Fix | Delete
foreach ( $setting_nodes as $metadata ) {
[3478] Fix | Delete
$input = _wp_array_get( $theme_json, $metadata['path'], array() );
[3479] Fix | Delete
if ( empty( $input ) ) {
[3480] Fix | Delete
continue;
[3481] Fix | Delete
}
[3482] Fix | Delete
[3483] Fix | Delete
$output = static::remove_insecure_settings( $input );
[3484] Fix | Delete
if ( ! empty( $output ) ) {
[3485] Fix | Delete
_wp_array_set( $sanitized, $metadata['path'], $output );
[3486] Fix | Delete
}
[3487] Fix | Delete
}
[3488] Fix | Delete
[3489] Fix | Delete
if ( empty( $sanitized['styles'] ) ) {
[3490] Fix | Delete
unset( $theme_json['styles'] );
[3491] Fix | Delete
} else {
[3492] Fix | Delete
$theme_json['styles'] = $sanitized['styles'];
[3493] Fix | Delete
}
[3494] Fix | Delete
[3495] Fix | Delete
if ( empty( $sanitized['settings'] ) ) {
[3496] Fix | Delete
unset( $theme_json['settings'] );
[3497] Fix | Delete
} else {
[3498] Fix | Delete
$theme_json['settings'] = $sanitized['settings'];
[3499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function