id ) ) { $context = 'site-editor'; } if ( defined( 'REST_REQUEST' ) && REST_REQUEST && isset( $_GET['context'] ) && 'mobile' === $_GET['context'] ) { $context = 'mobile'; } if ( 'mobile' === $context && WP_Theme_JSON_Resolver_Gutenberg::theme_has_support() ) { $settings['__experimentalStyles'] = wp_get_global_styles(); } if ( 'other' === $context ) { // Make sure the styles array exists. // In some contexts, like the navigation editor, it doesn't. if ( ! isset( $settings['styles'] ) ) { $settings['styles'] = array(); } // Reset existing global styles. $styles_without_existing_global_styles = array(); foreach ( $settings['styles'] as $style ) { if ( ! isset( $style['__unstableType'] ) || 'globalStyles' !== $style['__unstableType'] ) { $styles_without_existing_global_styles[] = $style; } } $new_global_styles = array(); $css_variables = wp_get_global_stylesheet( array( 'variables' ) ); if ( '' !== $css_variables ) { $new_global_styles[] = array( 'css' => $css_variables, '__unstableType' => 'presets', ); } $css_presets = wp_get_global_stylesheet( array( 'presets' ) ); if ( '' !== $css_presets ) { $new_global_styles[] = array( 'css' => $css_presets, '__unstableType' => 'presets', ); } if ( WP_Theme_JSON_Resolver_Gutenberg::theme_has_support() ) { $css_blocks = wp_get_global_stylesheet( array( 'styles' ) ); if ( '' !== $css_blocks ) { $new_global_styles[] = array( 'css' => $css_blocks, '__unstableType' => 'theme', ); } } $settings['styles'] = array_merge( $new_global_styles, $styles_without_existing_global_styles ); } // Copied from get_block_editor_settings() at wordpress-develop/block-editor.php. $settings['__experimentalFeatures'] = wp_get_global_settings(); if ( isset( $settings['__experimentalFeatures']['color']['palette'] ) ) { $colors_by_origin = $settings['__experimentalFeatures']['color']['palette']; $settings['colors'] = isset( $colors_by_origin['custom'] ) ? $colors_by_origin['custom'] : ( isset( $colors_by_origin['theme'] ) ? $colors_by_origin['theme'] : $colors_by_origin['default'] ); } if ( isset( $settings['__experimentalFeatures']['color']['gradients'] ) ) { $gradients_by_origin = $settings['__experimentalFeatures']['color']['gradients']; $settings['gradients'] = isset( $gradients_by_origin['custom'] ) ? $gradients_by_origin['custom'] : ( isset( $gradients_by_origin['theme'] ) ? $gradients_by_origin['theme'] : $gradients_by_origin['default'] ); } if ( isset( $settings['__experimentalFeatures']['typography']['fontSizes'] ) ) { $font_sizes_by_origin = $settings['__experimentalFeatures']['typography']['fontSizes']; $settings['fontSizes'] = isset( $font_sizes_by_origin['custom'] ) ? $font_sizes_by_origin['user'] : ( isset( $font_sizes_by_origin['theme'] ) ? $font_sizes_by_origin['theme'] : $font_sizes_by_origin['default'] ); } if ( isset( $settings['__experimentalFeatures']['color']['custom'] ) ) { $settings['disableCustomColors'] = ! $settings['__experimentalFeatures']['color']['custom']; unset( $settings['__experimentalFeatures']['color']['custom'] ); } if ( isset( $settings['__experimentalFeatures']['color']['customGradient'] ) ) { $settings['disableCustomGradients'] = ! $settings['__experimentalFeatures']['color']['customGradient']; unset( $settings['__experimentalFeatures']['color']['customGradient'] ); } if ( isset( $settings['__experimentalFeatures']['typography']['customFontSize'] ) ) { $settings['disableCustomFontSizes'] = ! $settings['__experimentalFeatures']['typography']['customFontSize']; unset( $settings['__experimentalFeatures']['typography']['customFontSize'] ); } if ( isset( $settings['__experimentalFeatures']['typography']['lineHeight'] ) ) { $settings['enableCustomLineHeight'] = $settings['__experimentalFeatures']['typography']['lineHeight']; unset( $settings['__experimentalFeatures']['typography']['lineHeight'] ); } if ( isset( $settings['__experimentalFeatures']['spacing']['units'] ) ) { $settings['enableCustomUnits'] = $settings['__experimentalFeatures']['spacing']['units']; } if ( isset( $settings['__experimentalFeatures']['spacing']['padding'] ) ) { $settings['enableCustomSpacing'] = $settings['__experimentalFeatures']['spacing']['padding']; unset( $settings['__experimentalFeatures']['spacing']['padding'] ); } return $settings; } /** * Sanitizes global styles user content removing unsafe rules. * * @param string $content Post content to filter. * @return string Filtered post content with unsafe rules removed. */ function gutenberg_global_styles_filter_post( $content ) { $decoded_data = json_decode( wp_unslash( $content ), true ); $json_decoding_error = json_last_error(); if ( JSON_ERROR_NONE === $json_decoding_error && is_array( $decoded_data ) && isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) && $decoded_data['isGlobalStylesUserThemeJSON'] ) { unset( $decoded_data['isGlobalStylesUserThemeJSON'] ); $data_to_encode = WP_Theme_JSON_Gutenberg::remove_insecure_properties( $decoded_data ); $data_to_encode['isGlobalStylesUserThemeJSON'] = true; return wp_slash( wp_json_encode( $data_to_encode ) ); } return $content; } /** * Adds the filters to filter global styles user theme.json. */ function gutenberg_global_styles_kses_init_filters() { add_filter( 'content_save_pre', 'gutenberg_global_styles_filter_post' ); } /** * Removes the filters to filter global styles user theme.json. */ function gutenberg_global_styles_kses_remove_filters() { remove_filter( 'content_save_pre', 'gutenberg_global_styles_filter_post' ); } /** * Register global styles kses filters if the user does not have unfiltered_html capability. * * @uses render_block_core_navigation() * @throws WP_Error An WP_Error exception parsing the block definition. */ function gutenberg_global_styles_kses_init() { gutenberg_global_styles_kses_remove_filters(); if ( ! current_user_can( 'unfiltered_html' ) ) { gutenberg_global_styles_kses_init_filters(); } } /** * This filter is the last being executed on force_filtered_html_on_import. * If the input of the filter is true it means we are in an import situation and should * enable kses, independently of the user capabilities. * So in that case we call gutenberg_global_styles_kses_init_filters; * * @param string $arg Input argument of the filter. * @return string Exactly what was passed as argument. */ function gutenberg_global_styles_force_filtered_html_on_import_filter( $arg ) { // force_filtered_html_on_import is true we need to init the global styles kses filters. if ( $arg ) { gutenberg_global_styles_kses_init_filters(); } return $arg; } add_filter( 'block_editor_settings_all', 'gutenberg_experimental_global_styles_settings', PHP_INT_MAX ); // kses actions&filters. add_action( 'init', 'gutenberg_global_styles_kses_init' ); add_action( 'set_current_user', 'gutenberg_global_styles_kses_init' ); add_filter( 'force_filtered_html_on_import', 'gutenberg_global_styles_force_filtered_html_on_import_filter', 999 ); // This filter needs to be executed last.