2021-11-08 16:45:58 -05:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* APIs to interact with global settings & styles.
|
|
|
|
*
|
|
|
|
* @package WordPress
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2022-10-07 08:09:11 -04:00
|
|
|
* Gets the settings resulting of merging core, theme, and user data.
|
2021-11-08 16:45:58 -05:00
|
|
|
*
|
|
|
|
* @since 5.9.0
|
|
|
|
*
|
2021-11-29 19:24:27 -05:00
|
|
|
* @param array $path Path to the specific setting to retrieve. Optional.
|
|
|
|
* If empty, will return all settings.
|
|
|
|
* @param array $context {
|
|
|
|
* Metadata to know where to retrieve the $path from. Optional.
|
|
|
|
*
|
|
|
|
* @type string $block_name Which block to retrieve the settings from.
|
|
|
|
* If empty, it'll return the settings for the global context.
|
|
|
|
* @type string $origin Which origin to take data from.
|
|
|
|
* Valid values are 'all' (core, theme, and user) or 'base' (core and theme).
|
|
|
|
* If empty or unknown, 'all' is used.
|
|
|
|
* }
|
2021-11-08 16:45:58 -05:00
|
|
|
* @return array The settings to retrieve.
|
|
|
|
*/
|
2021-11-29 19:24:27 -05:00
|
|
|
function wp_get_global_settings( $path = array(), $context = array() ) {
|
|
|
|
if ( ! empty( $context['block_name'] ) ) {
|
2023-01-27 17:14:12 -05:00
|
|
|
$new_path = array( 'blocks', $context['block_name'] );
|
|
|
|
foreach ( $path as $subpath ) {
|
|
|
|
$new_path[] = $subpath;
|
|
|
|
}
|
|
|
|
$path = $new_path;
|
2021-11-08 16:45:58 -05:00
|
|
|
}
|
|
|
|
|
2023-01-27 17:14:12 -05:00
|
|
|
/*
|
|
|
|
* This is the default value when no origin is provided or when it is 'all'.
|
|
|
|
*
|
|
|
|
* The $origin is used as part of the cache key. Changes here need to account
|
|
|
|
* for clearing the cache appropriately.
|
|
|
|
*/
|
2021-11-29 19:24:27 -05:00
|
|
|
$origin = 'custom';
|
2023-01-27 17:14:12 -05:00
|
|
|
if (
|
|
|
|
! wp_theme_has_theme_json() ||
|
|
|
|
( isset( $context['origin'] ) && 'base' === $context['origin'] )
|
|
|
|
) {
|
2021-11-08 16:45:58 -05:00
|
|
|
$origin = 'theme';
|
|
|
|
}
|
|
|
|
|
2023-01-27 17:14:12 -05:00
|
|
|
/*
|
|
|
|
* By using the 'theme_json' group, this data is marked to be non-persistent across requests.
|
|
|
|
* See `wp_cache_add_non_persistent_groups` in src/wp-includes/load.php and other places.
|
|
|
|
*
|
|
|
|
* The rationale for this is to make sure derived data from theme.json
|
|
|
|
* is always fresh from the potential modifications done via hooks
|
|
|
|
* that can use dynamic data (modify the stylesheet depending on some option,
|
|
|
|
* settings depending on user permissions, etc.).
|
|
|
|
* See some of the existing hooks to modify theme.json behaviour:
|
|
|
|
* https://make.wordpress.org/core/2022/10/10/filters-for-theme-json-data/
|
|
|
|
*
|
|
|
|
* A different alternative considered was to invalidate the cache upon certain
|
|
|
|
* events such as options add/update/delete, user meta, etc.
|
|
|
|
* It was judged not enough, hence this approach.
|
|
|
|
* See https://github.com/WordPress/gutenberg/pull/45372
|
|
|
|
*/
|
|
|
|
$cache_group = 'theme_json';
|
|
|
|
$cache_key = 'wp_get_global_settings_' . $origin;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
|
|
|
|
* developer's workflow.
|
|
|
|
*
|
|
|
|
* @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
|
|
|
|
*/
|
|
|
|
$can_use_cached = ! WP_DEBUG;
|
|
|
|
|
|
|
|
$settings = false;
|
|
|
|
if ( $can_use_cached ) {
|
|
|
|
$settings = wp_cache_get( $cache_key, $cache_group );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( false === $settings ) {
|
|
|
|
$settings = WP_Theme_JSON_Resolver::get_merged_data( $origin )->get_settings();
|
|
|
|
if ( $can_use_cached ) {
|
|
|
|
wp_cache_set( $cache_key, $settings, $cache_group );
|
|
|
|
}
|
|
|
|
}
|
2021-11-08 16:45:58 -05:00
|
|
|
|
|
|
|
return _wp_array_get( $settings, $path, $settings );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2022-10-07 08:09:11 -04:00
|
|
|
* Gets the styles resulting of merging core, theme, and user data.
|
2021-11-08 16:45:58 -05:00
|
|
|
*
|
|
|
|
* @since 5.9.0
|
|
|
|
*
|
2021-11-29 19:24:27 -05:00
|
|
|
* @param array $path Path to the specific style to retrieve. Optional.
|
|
|
|
* If empty, will return all styles.
|
|
|
|
* @param array $context {
|
|
|
|
* Metadata to know where to retrieve the $path from. Optional.
|
|
|
|
*
|
|
|
|
* @type string $block_name Which block to retrieve the styles from.
|
|
|
|
* If empty, it'll return the styles for the global context.
|
|
|
|
* @type string $origin Which origin to take data from.
|
|
|
|
* Valid values are 'all' (core, theme, and user) or 'base' (core and theme).
|
|
|
|
* If empty or unknown, 'all' is used.
|
|
|
|
* }
|
2021-11-08 16:45:58 -05:00
|
|
|
* @return array The styles to retrieve.
|
|
|
|
*/
|
2021-11-29 19:24:27 -05:00
|
|
|
function wp_get_global_styles( $path = array(), $context = array() ) {
|
|
|
|
if ( ! empty( $context['block_name'] ) ) {
|
|
|
|
$path = array_merge( array( 'blocks', $context['block_name'] ), $path );
|
2021-11-08 16:45:58 -05:00
|
|
|
}
|
|
|
|
|
2021-11-29 19:24:27 -05:00
|
|
|
$origin = 'custom';
|
|
|
|
if ( isset( $context['origin'] ) && 'base' === $context['origin'] ) {
|
2021-11-08 16:45:58 -05:00
|
|
|
$origin = 'theme';
|
|
|
|
}
|
|
|
|
|
|
|
|
$styles = WP_Theme_JSON_Resolver::get_merged_data( $origin )->get_raw_data()['styles'];
|
|
|
|
|
|
|
|
return _wp_array_get( $styles, $path, $styles );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the stylesheet resulting of merging core, theme, and user data.
|
|
|
|
*
|
|
|
|
* @since 5.9.0
|
2023-01-26 12:23:15 -05:00
|
|
|
* @since 6.1.0 Added 'base-layout-styles' support.
|
2021-11-08 16:45:58 -05:00
|
|
|
*
|
2023-01-26 12:23:15 -05:00
|
|
|
* @param array $types Optional. Types of styles to load.
|
|
|
|
* It accepts as values 'variables', 'presets', 'styles', 'base-layout-styles'.
|
|
|
|
* If empty, it'll load the following:
|
|
|
|
* - for themes without theme.json: 'variables', 'presets', 'base-layout-styles'.
|
|
|
|
* - for themes with theme.json: 'variables', 'presets', 'styles'.
|
2021-11-08 16:45:58 -05:00
|
|
|
* @return string Stylesheet.
|
|
|
|
*/
|
|
|
|
function wp_get_global_stylesheet( $types = array() ) {
|
2023-01-26 18:03:14 -05:00
|
|
|
/*
|
|
|
|
* Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
|
|
|
|
* developer's workflow.
|
|
|
|
*
|
|
|
|
* @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
|
|
|
|
*/
|
|
|
|
$can_use_cached = empty( $types ) && ! WP_DEBUG;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* By using the 'theme_json' group, this data is marked to be non-persistent across requests.
|
|
|
|
* @see `wp_cache_add_non_persistent_groups()`.
|
|
|
|
*
|
|
|
|
* The rationale for this is to make sure derived data from theme.json
|
|
|
|
* is always fresh from the potential modifications done via hooks
|
|
|
|
* that can use dynamic data (modify the stylesheet depending on some option,
|
|
|
|
* settings depending on user permissions, etc.).
|
|
|
|
* See some of the existing hooks to modify theme.json behavior:
|
|
|
|
* @see https://make.wordpress.org/core/2022/10/10/filters-for-theme-json-data/
|
|
|
|
*
|
|
|
|
* A different alternative considered was to invalidate the cache upon certain
|
|
|
|
* events such as options add/update/delete, user meta, etc.
|
|
|
|
* It was judged not enough, hence this approach.
|
|
|
|
* @see https://github.com/WordPress/gutenberg/pull/45372
|
|
|
|
*/
|
|
|
|
$cache_group = 'theme_json';
|
|
|
|
$cache_key = 'wp_get_global_stylesheet';
|
2021-11-08 16:45:58 -05:00
|
|
|
if ( $can_use_cached ) {
|
2023-01-26 18:03:14 -05:00
|
|
|
$cached = wp_cache_get( $cache_key, $cache_group );
|
2021-11-08 16:45:58 -05:00
|
|
|
if ( $cached ) {
|
|
|
|
return $cached;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-04 08:52:00 -05:00
|
|
|
$tree = WP_Theme_JSON_Resolver::get_merged_data();
|
|
|
|
|
Themes: Introduce wp_theme_has_theme_json() for public consumption.
Adds `wp_theme_has_theme_json()` for public consumption, to replace the private internal Core-only `WP_Theme_JSON_Resolver::theme_has_support()` method. This new global function checks if a theme or its parent has a `theme.json` file.
For performance, results are cached as an integer `1` or `0` in the `'theme_json'` group with `'wp_theme_has_theme_json'` key. This is a non-persistent cache. Why? To make the derived data from `theme.json` is always fresh from the potential modifications done via hooks that can use dynamic data (modify the stylesheet depending on some option, settings depending on user permissions, etc.).
Also adds a new public function `wp_clean_theme_json_cache()` to clear the cache on `'switch_theme'` and `start_previewing_theme'`.
References:
* [https://github.com/WordPress/gutenberg/pull/45168 Gutenberg PR 45168] Add `wp_theme_has_theme_json` as a public API to know whether a theme has a `theme.json`.
* [https://github.com/WordPress/gutenberg/pull/45380 Gutenberg PR 45380] Deprecate `WP_Theme_JSON_Resolver:theme_has_support()`.
* [https://github.com/WordPress/gutenberg/pull/46150 Gutenberg PR 46150] Make `theme.json` object caches non-persistent.
* [https://github.com/WordPress/gutenberg/pull/45979 Gutenberg PR 45979] Don't check if constants set by `wp_initial_constants()` are defined.
* [https://github.com/WordPress/gutenberg/pull/45950 Gutenberg PR 45950] Cleaner logic in `wp_theme_has_theme_json`.
Follow-up to [54493], [53282], [52744], [52049], [50959].
Props oandregal, afragen, alexstine, aristath, azaozz, costdev, flixos90, hellofromTonya, mamaduka, mcsf, ocean90, spacedmonkey.
Fixes #56975.
Built from https://develop.svn.wordpress.org/trunk@55086
git-svn-id: http://core.svn.wordpress.org/trunk@54619 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-01-18 06:40:10 -05:00
|
|
|
$supports_theme_json = wp_theme_has_theme_json();
|
2021-11-08 16:45:58 -05:00
|
|
|
if ( empty( $types ) && ! $supports_theme_json ) {
|
Editor: Backport foundation for Layout block support refactor (part 1).
Backports the following changes from the Gutenberg repository:
* [WordPress/gutenberg/40875 gutenberg/40875] Layout: Use semantic classnames, centralize layout definitions, reduce duplication, and fix blockGap in theme.json
* [WordPress/gutenberg/42544 gutenberg/42544] Layout: Add a disable-layout-styles theme supports flag to opt out of all layout styles gutenberg/42544
* [WordPress/gutenberg/42087 gutenberg/42087] Theme.json: Add block support feature level selectors for blocks gutenberg/42087
* [WordPress/gutenberg/43792 gutenberg/43792] Global Styles: Split root layout rules into a different function gutenberg/43792
* [WordPress/gutenberg/42544 gutenberg/42544] Layout: Add a disable-layout-styles theme supports flag to opt out of all layout styles gutenberg/42544
* [WordPress/gutenberg/42665 gutenberg/42665] Layout: Reduce specificity of fallback blockGap styles gutenberg/42665
* [WordPress/gutenberg/42085 gutenberg/42085] Core CSS support for root padding and alignfull blocks gutenberg/42085
Notes:
* It doesn't entirely port over PR 40875 — the remaining PHP changes for that PR will be explored in a separate PR targeting `layout.php`.
* [54159] was reverted in [54160] due to PHPUnit test failures for tests added by the commit. Later, tests passed when applied on top of `trunk`. There were various outages today of upstream `wp-env` dependencies, which likely were the root cause of the earlier failures. For historical tracking and to make sure, recommitting [54159] but instead on top of current `trunk`. See PR 3205 for more details.
* Giving additional props for those who did a deep dive investigation into the failed tests.
Follow-up to [54160], [54159].
Props andrewserong, aaronrobertshaw, isabel_brison, bernhard-reiter, hellofromTonya.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54162
git-svn-id: http://core.svn.wordpress.org/trunk@53721 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-09-14 14:44:09 -04:00
|
|
|
$types = array( 'variables', 'presets', 'base-layout-styles' );
|
2021-11-08 16:45:58 -05:00
|
|
|
} elseif ( empty( $types ) ) {
|
|
|
|
$types = array( 'variables', 'styles', 'presets' );
|
|
|
|
}
|
|
|
|
|
2022-02-04 09:18:59 -05:00
|
|
|
/*
|
Editor: Add missing `blocks` origin to `theme.json`.
This changeset updates the blocks origin name from core to blocks and adds it to the list of valid origins for `theme.json`.
(See the original fix in [https://github.com//pull/3319 Gutenberg's PR 44363]).
Why?
- This new origin was missing from the list.
- The `core` name is not reflective of what it does, as this data origin is related to block styles, whether they come with WordPress or third-party blocks.
- The existing filter for this piece of data is called `theme_json_blocks`, to reflect it filters "block" data.
- Though `core` origin was used in the past for `default`, this commit reverts it. Why? It was confusing. The goal is to use names that communicate what part of the pipeline are processing (`default > blocks > theme > custom`).
How?
- Renames the string, from `core` to `blocks`.
- Adds `blocks` to the list of valid origins.
- Verifies that the `$theme_json->get_stylesheet()` call uses the proper `$origins` at all times.
Follow-up to [54162], [54251].
Props oandregal, czapla, jorgefilipecosta, scruffian, bernhard-reiter hellofromTonya.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54408
git-svn-id: http://core.svn.wordpress.org/trunk@53967 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-10-07 05:40:13 -04:00
|
|
|
* If variables are part of the stylesheet, then add them.
|
2022-02-04 09:18:59 -05:00
|
|
|
* This is so themes without a theme.json still work as before 5.9:
|
|
|
|
* they can override the default presets.
|
|
|
|
* See https://core.trac.wordpress.org/ticket/54782
|
|
|
|
*/
|
2022-02-04 08:52:00 -05:00
|
|
|
$styles_variables = '';
|
2022-02-04 09:18:59 -05:00
|
|
|
if ( in_array( 'variables', $types, true ) ) {
|
Editor: Add missing `blocks` origin to `theme.json`.
This changeset updates the blocks origin name from core to blocks and adds it to the list of valid origins for `theme.json`.
(See the original fix in [https://github.com//pull/3319 Gutenberg's PR 44363]).
Why?
- This new origin was missing from the list.
- The `core` name is not reflective of what it does, as this data origin is related to block styles, whether they come with WordPress or third-party blocks.
- The existing filter for this piece of data is called `theme_json_blocks`, to reflect it filters "block" data.
- Though `core` origin was used in the past for `default`, this commit reverts it. Why? It was confusing. The goal is to use names that communicate what part of the pipeline are processing (`default > blocks > theme > custom`).
How?
- Renames the string, from `core` to `blocks`.
- Adds `blocks` to the list of valid origins.
- Verifies that the `$theme_json->get_stylesheet()` call uses the proper `$origins` at all times.
Follow-up to [54162], [54251].
Props oandregal, czapla, jorgefilipecosta, scruffian, bernhard-reiter hellofromTonya.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54408
git-svn-id: http://core.svn.wordpress.org/trunk@53967 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-10-07 05:40:13 -04:00
|
|
|
/*
|
|
|
|
* Only use the default, theme, and custom origins. Why?
|
|
|
|
* Because styles for `blocks` origin are added at a later phase
|
|
|
|
* (i.e. in the render cycle). Here, only the ones in use are rendered.
|
|
|
|
* @see wp_add_global_styles_for_blocks
|
|
|
|
*/
|
|
|
|
$origins = array( 'default', 'theme', 'custom' );
|
|
|
|
$styles_variables = $tree->get_stylesheet( array( 'variables' ), $origins );
|
2022-02-04 08:52:00 -05:00
|
|
|
$types = array_diff( $types, array( 'variables' ) );
|
|
|
|
}
|
|
|
|
|
2022-02-04 09:18:59 -05:00
|
|
|
/*
|
|
|
|
* For the remaining types (presets, styles), we do consider origins:
|
|
|
|
*
|
|
|
|
* - themes without theme.json: only the classes for the presets defined by core
|
|
|
|
* - themes with theme.json: the presets and styles classes, both from core and the theme
|
|
|
|
*/
|
2022-02-04 08:52:00 -05:00
|
|
|
$styles_rest = '';
|
|
|
|
if ( ! empty( $types ) ) {
|
Editor: Add missing `blocks` origin to `theme.json`.
This changeset updates the blocks origin name from core to blocks and adds it to the list of valid origins for `theme.json`.
(See the original fix in [https://github.com//pull/3319 Gutenberg's PR 44363]).
Why?
- This new origin was missing from the list.
- The `core` name is not reflective of what it does, as this data origin is related to block styles, whether they come with WordPress or third-party blocks.
- The existing filter for this piece of data is called `theme_json_blocks`, to reflect it filters "block" data.
- Though `core` origin was used in the past for `default`, this commit reverts it. Why? It was confusing. The goal is to use names that communicate what part of the pipeline are processing (`default > blocks > theme > custom`).
How?
- Renames the string, from `core` to `blocks`.
- Adds `blocks` to the list of valid origins.
- Verifies that the `$theme_json->get_stylesheet()` call uses the proper `$origins` at all times.
Follow-up to [54162], [54251].
Props oandregal, czapla, jorgefilipecosta, scruffian, bernhard-reiter hellofromTonya.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54408
git-svn-id: http://core.svn.wordpress.org/trunk@53967 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-10-07 05:40:13 -04:00
|
|
|
/*
|
|
|
|
* Only use the default, theme, and custom origins. Why?
|
|
|
|
* Because styles for `blocks` origin are added at a later phase
|
|
|
|
* (i.e. in the render cycle). Here, only the ones in use are rendered.
|
|
|
|
* @see wp_add_global_styles_for_blocks
|
|
|
|
*/
|
2022-02-04 08:52:00 -05:00
|
|
|
$origins = array( 'default', 'theme', 'custom' );
|
|
|
|
if ( ! $supports_theme_json ) {
|
|
|
|
$origins = array( 'default' );
|
|
|
|
}
|
|
|
|
$styles_rest = $tree->get_stylesheet( $types, $origins );
|
2021-11-08 16:45:58 -05:00
|
|
|
}
|
|
|
|
|
2022-02-04 08:52:00 -05:00
|
|
|
$stylesheet = $styles_variables . $styles_rest;
|
2021-11-08 16:45:58 -05:00
|
|
|
if ( $can_use_cached ) {
|
2023-01-26 18:03:14 -05:00
|
|
|
wp_cache_set( $cache_key, $stylesheet, $cache_group );
|
2021-11-08 16:45:58 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return $stylesheet;
|
|
|
|
}
|
2022-02-17 11:18:03 -05:00
|
|
|
|
Editor: Add support for custom CSS in global styles.
This changeset introduces functions `wp_get_global_styles_custom_css()` and `wp_enqueue_global_styles_custom_css()`, which allow accessing and enqueuing custom CSS added via global styles.
Custom CSS via global styles is handled separately from custom CSS via the Customizer. If a site uses both features, the custom CSS from both sources will be loaded. The global styles custom CSS is then loaded after the Customizer custom CSS, so if there are any conflicts between the rules, the global styles take precedence.
Similarly to e.g. [55185], the result is cached in a non-persistent cache, except when `WP_DEBUG` is on to avoid interrupting the theme developer's workflow.
Props glendaviesnz, oandregal, ntsekouras, mamaduka, davidbaumwald, hellofromtonya, flixos90.
Fixes #57536.
Built from https://develop.svn.wordpress.org/trunk@55192
git-svn-id: http://core.svn.wordpress.org/trunk@54725 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-02-02 13:52:17 -05:00
|
|
|
/**
|
|
|
|
* Gets the global styles custom css from theme.json.
|
|
|
|
*
|
|
|
|
* @since 6.2.0
|
|
|
|
*
|
|
|
|
* @return string Stylesheet.
|
|
|
|
*/
|
|
|
|
function wp_get_global_styles_custom_css() {
|
|
|
|
if ( ! wp_theme_has_theme_json() ) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
|
|
|
|
* developer's workflow.
|
|
|
|
*
|
|
|
|
* @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
|
|
|
|
*/
|
|
|
|
$can_use_cached = ! WP_DEBUG;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* By using the 'theme_json' group, this data is marked to be non-persistent across requests.
|
|
|
|
* @see `wp_cache_add_non_persistent_groups()`.
|
|
|
|
*
|
|
|
|
* The rationale for this is to make sure derived data from theme.json
|
|
|
|
* is always fresh from the potential modifications done via hooks
|
|
|
|
* that can use dynamic data (modify the stylesheet depending on some option,
|
|
|
|
* settings depending on user permissions, etc.).
|
|
|
|
* See some of the existing hooks to modify theme.json behavior:
|
|
|
|
* @see https://make.wordpress.org/core/2022/10/10/filters-for-theme-json-data/
|
|
|
|
*
|
|
|
|
* A different alternative considered was to invalidate the cache upon certain
|
|
|
|
* events such as options add/update/delete, user meta, etc.
|
|
|
|
* It was judged not enough, hence this approach.
|
|
|
|
* @see https://github.com/WordPress/gutenberg/pull/45372
|
|
|
|
*/
|
|
|
|
$cache_key = 'wp_get_global_styles_custom_css';
|
|
|
|
$cache_group = 'theme_json';
|
|
|
|
if ( $can_use_cached ) {
|
|
|
|
$cached = wp_cache_get( $cache_key, $cache_group );
|
|
|
|
if ( $cached ) {
|
|
|
|
return $cached;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$tree = WP_Theme_JSON_Resolver::get_merged_data();
|
|
|
|
$stylesheet = $tree->get_custom_css();
|
|
|
|
|
|
|
|
if ( $can_use_cached ) {
|
|
|
|
wp_cache_set( $cache_key, $stylesheet, $cache_group );
|
|
|
|
}
|
|
|
|
|
|
|
|
return $stylesheet;
|
|
|
|
}
|
|
|
|
|
2022-02-17 11:18:03 -05:00
|
|
|
/**
|
|
|
|
* Returns a string containing the SVGs to be referenced as filters (duotone).
|
|
|
|
*
|
|
|
|
* @since 5.9.1
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function wp_get_global_styles_svg_filters() {
|
2023-02-01 17:59:13 -05:00
|
|
|
/*
|
|
|
|
* Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
|
|
|
|
* developer's workflow.
|
|
|
|
*
|
|
|
|
* @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
|
|
|
|
*/
|
|
|
|
$can_use_cached = ! WP_DEBUG;
|
|
|
|
$cache_group = 'theme_json';
|
|
|
|
$cache_key = 'wp_get_global_styles_svg_filters';
|
2022-02-17 11:18:03 -05:00
|
|
|
if ( $can_use_cached ) {
|
2023-02-01 17:59:13 -05:00
|
|
|
$cached = wp_cache_get( $cache_key, $cache_group );
|
2022-02-17 11:18:03 -05:00
|
|
|
if ( $cached ) {
|
|
|
|
return $cached;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Themes: Introduce wp_theme_has_theme_json() for public consumption.
Adds `wp_theme_has_theme_json()` for public consumption, to replace the private internal Core-only `WP_Theme_JSON_Resolver::theme_has_support()` method. This new global function checks if a theme or its parent has a `theme.json` file.
For performance, results are cached as an integer `1` or `0` in the `'theme_json'` group with `'wp_theme_has_theme_json'` key. This is a non-persistent cache. Why? To make the derived data from `theme.json` is always fresh from the potential modifications done via hooks that can use dynamic data (modify the stylesheet depending on some option, settings depending on user permissions, etc.).
Also adds a new public function `wp_clean_theme_json_cache()` to clear the cache on `'switch_theme'` and `start_previewing_theme'`.
References:
* [https://github.com/WordPress/gutenberg/pull/45168 Gutenberg PR 45168] Add `wp_theme_has_theme_json` as a public API to know whether a theme has a `theme.json`.
* [https://github.com/WordPress/gutenberg/pull/45380 Gutenberg PR 45380] Deprecate `WP_Theme_JSON_Resolver:theme_has_support()`.
* [https://github.com/WordPress/gutenberg/pull/46150 Gutenberg PR 46150] Make `theme.json` object caches non-persistent.
* [https://github.com/WordPress/gutenberg/pull/45979 Gutenberg PR 45979] Don't check if constants set by `wp_initial_constants()` are defined.
* [https://github.com/WordPress/gutenberg/pull/45950 Gutenberg PR 45950] Cleaner logic in `wp_theme_has_theme_json`.
Follow-up to [54493], [53282], [52744], [52049], [50959].
Props oandregal, afragen, alexstine, aristath, azaozz, costdev, flixos90, hellofromTonya, mamaduka, mcsf, ocean90, spacedmonkey.
Fixes #56975.
Built from https://develop.svn.wordpress.org/trunk@55086
git-svn-id: http://core.svn.wordpress.org/trunk@54619 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-01-18 06:40:10 -05:00
|
|
|
$supports_theme_json = wp_theme_has_theme_json();
|
2022-02-17 11:18:03 -05:00
|
|
|
|
|
|
|
$origins = array( 'default', 'theme', 'custom' );
|
|
|
|
if ( ! $supports_theme_json ) {
|
|
|
|
$origins = array( 'default' );
|
|
|
|
}
|
|
|
|
|
|
|
|
$tree = WP_Theme_JSON_Resolver::get_merged_data();
|
|
|
|
$svgs = $tree->get_svg_filters( $origins );
|
|
|
|
|
|
|
|
if ( $can_use_cached ) {
|
2023-02-01 17:59:13 -05:00
|
|
|
wp_cache_set( $cache_key, $svgs, $cache_group );
|
2022-02-17 11:18:03 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return $svgs;
|
|
|
|
}
|
2022-09-10 08:38:12 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds global style rules to the inline style for each block.
|
|
|
|
*
|
|
|
|
* @since 6.1.0
|
|
|
|
*/
|
|
|
|
function wp_add_global_styles_for_blocks() {
|
|
|
|
$tree = WP_Theme_JSON_Resolver::get_merged_data();
|
|
|
|
$block_nodes = $tree->get_styles_block_nodes();
|
|
|
|
foreach ( $block_nodes as $metadata ) {
|
|
|
|
$block_css = $tree->get_styles_for_block( $metadata );
|
|
|
|
|
Editor: Add missing `blocks` origin to `theme.json`.
This changeset updates the blocks origin name from core to blocks and adds it to the list of valid origins for `theme.json`.
(See the original fix in [https://github.com//pull/3319 Gutenberg's PR 44363]).
Why?
- This new origin was missing from the list.
- The `core` name is not reflective of what it does, as this data origin is related to block styles, whether they come with WordPress or third-party blocks.
- The existing filter for this piece of data is called `theme_json_blocks`, to reflect it filters "block" data.
- Though `core` origin was used in the past for `default`, this commit reverts it. Why? It was confusing. The goal is to use names that communicate what part of the pipeline are processing (`default > blocks > theme > custom`).
How?
- Renames the string, from `core` to `blocks`.
- Adds `blocks` to the list of valid origins.
- Verifies that the `$theme_json->get_stylesheet()` call uses the proper `$origins` at all times.
Follow-up to [54162], [54251].
Props oandregal, czapla, jorgefilipecosta, scruffian, bernhard-reiter hellofromTonya.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54408
git-svn-id: http://core.svn.wordpress.org/trunk@53967 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-10-07 05:40:13 -04:00
|
|
|
if ( ! wp_should_load_separate_core_block_assets() ) {
|
|
|
|
wp_add_inline_style( 'global-styles', $block_css );
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
Editor: Ensure global styles are rendered for third-party blocks.
This change ensures custom styles for all third-party blocks are rendered on the front end if assets are set to be loaded on a per-block basis. Additionally, this change includes new unit tests to help prevent a similar bug in the future.
Props scruffian, aristath, poena, wildworks, ajlende, andraganescu, ndiego, gigitux, cbravobernal, ramonopoly, andrewserong, oandregal, hellofromTonya, bernhard-reiter.
Fixes #56915.
Built from https://develop.svn.wordpress.org/trunk@54703
git-svn-id: http://core.svn.wordpress.org/trunk@54255 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-10-27 11:41:12 -04:00
|
|
|
$stylesheet_handle = 'global-styles';
|
2022-09-10 08:38:12 -04:00
|
|
|
if ( isset( $metadata['name'] ) ) {
|
|
|
|
/*
|
|
|
|
* These block styles are added on block_render.
|
|
|
|
* This hooks inline CSS to them so that they are loaded conditionally
|
|
|
|
* based on whether or not the block is used on the page.
|
|
|
|
*/
|
Editor: Ensure global styles are rendered for third-party blocks.
This change ensures custom styles for all third-party blocks are rendered on the front end if assets are set to be loaded on a per-block basis. Additionally, this change includes new unit tests to help prevent a similar bug in the future.
Props scruffian, aristath, poena, wildworks, ajlende, andraganescu, ndiego, gigitux, cbravobernal, ramonopoly, andrewserong, oandregal, hellofromTonya, bernhard-reiter.
Fixes #56915.
Built from https://develop.svn.wordpress.org/trunk@54703
git-svn-id: http://core.svn.wordpress.org/trunk@54255 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-10-27 11:41:12 -04:00
|
|
|
if ( str_starts_with( $metadata['name'], 'core/' ) ) {
|
|
|
|
$block_name = str_replace( 'core/', '', $metadata['name'] );
|
|
|
|
$stylesheet_handle = 'wp-block-' . $block_name;
|
|
|
|
}
|
|
|
|
wp_add_inline_style( $stylesheet_handle, $block_css );
|
2022-09-10 08:38:12 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// The likes of block element styles from theme.json do not have $metadata['name'] set.
|
|
|
|
if ( ! isset( $metadata['name'] ) && ! empty( $metadata['path'] ) ) {
|
|
|
|
$result = array_values(
|
|
|
|
array_filter(
|
|
|
|
$metadata['path'],
|
|
|
|
function ( $item ) {
|
|
|
|
if ( strpos( $item, 'core/' ) !== false ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|
|
|
|
if ( isset( $result[0] ) ) {
|
Editor: Ensure global styles are rendered for third-party blocks.
This change ensures custom styles for all third-party blocks are rendered on the front end if assets are set to be loaded on a per-block basis. Additionally, this change includes new unit tests to help prevent a similar bug in the future.
Props scruffian, aristath, poena, wildworks, ajlende, andraganescu, ndiego, gigitux, cbravobernal, ramonopoly, andrewserong, oandregal, hellofromTonya, bernhard-reiter.
Fixes #56915.
Built from https://develop.svn.wordpress.org/trunk@54703
git-svn-id: http://core.svn.wordpress.org/trunk@54255 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-10-27 11:41:12 -04:00
|
|
|
if ( str_starts_with( $result[0], 'core/' ) ) {
|
|
|
|
$block_name = str_replace( 'core/', '', $result[0] );
|
|
|
|
$stylesheet_handle = 'wp-block-' . $block_name;
|
|
|
|
}
|
|
|
|
wp_add_inline_style( $stylesheet_handle, $block_css );
|
2022-09-10 08:38:12 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
Themes: Introduce wp_theme_has_theme_json() for public consumption.
Adds `wp_theme_has_theme_json()` for public consumption, to replace the private internal Core-only `WP_Theme_JSON_Resolver::theme_has_support()` method. This new global function checks if a theme or its parent has a `theme.json` file.
For performance, results are cached as an integer `1` or `0` in the `'theme_json'` group with `'wp_theme_has_theme_json'` key. This is a non-persistent cache. Why? To make the derived data from `theme.json` is always fresh from the potential modifications done via hooks that can use dynamic data (modify the stylesheet depending on some option, settings depending on user permissions, etc.).
Also adds a new public function `wp_clean_theme_json_cache()` to clear the cache on `'switch_theme'` and `start_previewing_theme'`.
References:
* [https://github.com/WordPress/gutenberg/pull/45168 Gutenberg PR 45168] Add `wp_theme_has_theme_json` as a public API to know whether a theme has a `theme.json`.
* [https://github.com/WordPress/gutenberg/pull/45380 Gutenberg PR 45380] Deprecate `WP_Theme_JSON_Resolver:theme_has_support()`.
* [https://github.com/WordPress/gutenberg/pull/46150 Gutenberg PR 46150] Make `theme.json` object caches non-persistent.
* [https://github.com/WordPress/gutenberg/pull/45979 Gutenberg PR 45979] Don't check if constants set by `wp_initial_constants()` are defined.
* [https://github.com/WordPress/gutenberg/pull/45950 Gutenberg PR 45950] Cleaner logic in `wp_theme_has_theme_json`.
Follow-up to [54493], [53282], [52744], [52049], [50959].
Props oandregal, afragen, alexstine, aristath, azaozz, costdev, flixos90, hellofromTonya, mamaduka, mcsf, ocean90, spacedmonkey.
Fixes #56975.
Built from https://develop.svn.wordpress.org/trunk@55086
git-svn-id: http://core.svn.wordpress.org/trunk@54619 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-01-18 06:40:10 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks whether a theme or its parent has a theme.json file.
|
|
|
|
*
|
|
|
|
* @since 6.2.0
|
|
|
|
*
|
|
|
|
* @return bool Returns true if theme or its parent has a theme.json file, false otherwise.
|
|
|
|
*/
|
|
|
|
function wp_theme_has_theme_json() {
|
Themes: Add static cache variable to wp_theme_has_theme_json().
For performance, a static variable is added to `wp_theme_has_theme_json()` to cache the boolean result of determining if a theme (or its parent) has a `theme.json` file.
This cache avoids the overhead of calling `get_stylesheet_directory()` and `get_template_directory()` each time `wp_theme_has_theme_json()` is invoked.
The cache is lean, non-persistent, and encapsulated within the function (i.e. function scope and not available externally).
The cache is ignored when:
* `WP_DEBUG` is on to avoid interrupting theme developer's workflow and for extender automated test suites.
* `WP_RUN_CORE_TESTS` is on to ensure each Core test exercises the checking code.
Follow-up to [55092], [55086].
Props oandregal, azaozz, costdev, dmsnell, flixos90, hellofromTonya, Otto42, spacedmonkey.
Fixes #56975.
Built from https://develop.svn.wordpress.org/trunk@55138
git-svn-id: http://core.svn.wordpress.org/trunk@54671 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-01-25 14:38:14 -05:00
|
|
|
static $theme_has_support = null;
|
|
|
|
|
|
|
|
if (
|
|
|
|
null !== $theme_has_support &&
|
|
|
|
/*
|
|
|
|
* Ignore static cache when `WP_DEBUG` is enabled. Why? To avoid interfering with
|
|
|
|
* the theme developer's workflow.
|
|
|
|
*
|
|
|
|
* @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
|
|
|
|
*/
|
|
|
|
! WP_DEBUG &&
|
|
|
|
/*
|
|
|
|
* Ignore cache when automated test suites are running. Why? To ensure
|
|
|
|
* the static cache is reset between each test.
|
|
|
|
*/
|
|
|
|
! ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS )
|
|
|
|
) {
|
|
|
|
return $theme_has_support;
|
|
|
|
}
|
|
|
|
|
Themes: Introduce wp_theme_has_theme_json() for public consumption.
Adds `wp_theme_has_theme_json()` for public consumption, to replace the private internal Core-only `WP_Theme_JSON_Resolver::theme_has_support()` method. This new global function checks if a theme or its parent has a `theme.json` file.
For performance, results are cached as an integer `1` or `0` in the `'theme_json'` group with `'wp_theme_has_theme_json'` key. This is a non-persistent cache. Why? To make the derived data from `theme.json` is always fresh from the potential modifications done via hooks that can use dynamic data (modify the stylesheet depending on some option, settings depending on user permissions, etc.).
Also adds a new public function `wp_clean_theme_json_cache()` to clear the cache on `'switch_theme'` and `start_previewing_theme'`.
References:
* [https://github.com/WordPress/gutenberg/pull/45168 Gutenberg PR 45168] Add `wp_theme_has_theme_json` as a public API to know whether a theme has a `theme.json`.
* [https://github.com/WordPress/gutenberg/pull/45380 Gutenberg PR 45380] Deprecate `WP_Theme_JSON_Resolver:theme_has_support()`.
* [https://github.com/WordPress/gutenberg/pull/46150 Gutenberg PR 46150] Make `theme.json` object caches non-persistent.
* [https://github.com/WordPress/gutenberg/pull/45979 Gutenberg PR 45979] Don't check if constants set by `wp_initial_constants()` are defined.
* [https://github.com/WordPress/gutenberg/pull/45950 Gutenberg PR 45950] Cleaner logic in `wp_theme_has_theme_json`.
Follow-up to [54493], [53282], [52744], [52049], [50959].
Props oandregal, afragen, alexstine, aristath, azaozz, costdev, flixos90, hellofromTonya, mamaduka, mcsf, ocean90, spacedmonkey.
Fixes #56975.
Built from https://develop.svn.wordpress.org/trunk@55086
git-svn-id: http://core.svn.wordpress.org/trunk@54619 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-01-18 06:40:10 -05:00
|
|
|
// Does the theme have its own theme.json?
|
|
|
|
$theme_has_support = is_readable( get_stylesheet_directory() . '/theme.json' );
|
|
|
|
|
|
|
|
// Look up the parent if the child does not have a theme.json.
|
|
|
|
if ( ! $theme_has_support ) {
|
|
|
|
$theme_has_support = is_readable( get_template_directory() . '/theme.json' );
|
|
|
|
}
|
|
|
|
|
2023-01-18 16:59:13 -05:00
|
|
|
return $theme_has_support;
|
Themes: Introduce wp_theme_has_theme_json() for public consumption.
Adds `wp_theme_has_theme_json()` for public consumption, to replace the private internal Core-only `WP_Theme_JSON_Resolver::theme_has_support()` method. This new global function checks if a theme or its parent has a `theme.json` file.
For performance, results are cached as an integer `1` or `0` in the `'theme_json'` group with `'wp_theme_has_theme_json'` key. This is a non-persistent cache. Why? To make the derived data from `theme.json` is always fresh from the potential modifications done via hooks that can use dynamic data (modify the stylesheet depending on some option, settings depending on user permissions, etc.).
Also adds a new public function `wp_clean_theme_json_cache()` to clear the cache on `'switch_theme'` and `start_previewing_theme'`.
References:
* [https://github.com/WordPress/gutenberg/pull/45168 Gutenberg PR 45168] Add `wp_theme_has_theme_json` as a public API to know whether a theme has a `theme.json`.
* [https://github.com/WordPress/gutenberg/pull/45380 Gutenberg PR 45380] Deprecate `WP_Theme_JSON_Resolver:theme_has_support()`.
* [https://github.com/WordPress/gutenberg/pull/46150 Gutenberg PR 46150] Make `theme.json` object caches non-persistent.
* [https://github.com/WordPress/gutenberg/pull/45979 Gutenberg PR 45979] Don't check if constants set by `wp_initial_constants()` are defined.
* [https://github.com/WordPress/gutenberg/pull/45950 Gutenberg PR 45950] Cleaner logic in `wp_theme_has_theme_json`.
Follow-up to [54493], [53282], [52744], [52049], [50959].
Props oandregal, afragen, alexstine, aristath, azaozz, costdev, flixos90, hellofromTonya, mamaduka, mcsf, ocean90, spacedmonkey.
Fixes #56975.
Built from https://develop.svn.wordpress.org/trunk@55086
git-svn-id: http://core.svn.wordpress.org/trunk@54619 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-01-18 06:40:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cleans the caches under the theme_json group.
|
|
|
|
*
|
|
|
|
* @since 6.2.0
|
|
|
|
*/
|
|
|
|
function wp_clean_theme_json_cache() {
|
2023-01-26 18:03:14 -05:00
|
|
|
wp_cache_delete( 'wp_get_global_stylesheet', 'theme_json' );
|
2023-02-01 17:59:13 -05:00
|
|
|
wp_cache_delete( 'wp_get_global_styles_svg_filters', 'theme_json' );
|
2023-01-27 17:14:12 -05:00
|
|
|
wp_cache_delete( 'wp_get_global_settings_custom', 'theme_json' );
|
|
|
|
wp_cache_delete( 'wp_get_global_settings_theme', 'theme_json' );
|
Editor: Add support for custom CSS in global styles.
This changeset introduces functions `wp_get_global_styles_custom_css()` and `wp_enqueue_global_styles_custom_css()`, which allow accessing and enqueuing custom CSS added via global styles.
Custom CSS via global styles is handled separately from custom CSS via the Customizer. If a site uses both features, the custom CSS from both sources will be loaded. The global styles custom CSS is then loaded after the Customizer custom CSS, so if there are any conflicts between the rules, the global styles take precedence.
Similarly to e.g. [55185], the result is cached in a non-persistent cache, except when `WP_DEBUG` is on to avoid interrupting the theme developer's workflow.
Props glendaviesnz, oandregal, ntsekouras, mamaduka, davidbaumwald, hellofromtonya, flixos90.
Fixes #57536.
Built from https://develop.svn.wordpress.org/trunk@55192
git-svn-id: http://core.svn.wordpress.org/trunk@54725 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-02-02 13:52:17 -05:00
|
|
|
wp_cache_delete( 'wp_get_global_styles_custom_css', 'theme_json' );
|
Themes: Introduce wp_theme_has_theme_json() for public consumption.
Adds `wp_theme_has_theme_json()` for public consumption, to replace the private internal Core-only `WP_Theme_JSON_Resolver::theme_has_support()` method. This new global function checks if a theme or its parent has a `theme.json` file.
For performance, results are cached as an integer `1` or `0` in the `'theme_json'` group with `'wp_theme_has_theme_json'` key. This is a non-persistent cache. Why? To make the derived data from `theme.json` is always fresh from the potential modifications done via hooks that can use dynamic data (modify the stylesheet depending on some option, settings depending on user permissions, etc.).
Also adds a new public function `wp_clean_theme_json_cache()` to clear the cache on `'switch_theme'` and `start_previewing_theme'`.
References:
* [https://github.com/WordPress/gutenberg/pull/45168 Gutenberg PR 45168] Add `wp_theme_has_theme_json` as a public API to know whether a theme has a `theme.json`.
* [https://github.com/WordPress/gutenberg/pull/45380 Gutenberg PR 45380] Deprecate `WP_Theme_JSON_Resolver:theme_has_support()`.
* [https://github.com/WordPress/gutenberg/pull/46150 Gutenberg PR 46150] Make `theme.json` object caches non-persistent.
* [https://github.com/WordPress/gutenberg/pull/45979 Gutenberg PR 45979] Don't check if constants set by `wp_initial_constants()` are defined.
* [https://github.com/WordPress/gutenberg/pull/45950 Gutenberg PR 45950] Cleaner logic in `wp_theme_has_theme_json`.
Follow-up to [54493], [53282], [52744], [52049], [50959].
Props oandregal, afragen, alexstine, aristath, azaozz, costdev, flixos90, hellofromTonya, mamaduka, mcsf, ocean90, spacedmonkey.
Fixes #56975.
Built from https://develop.svn.wordpress.org/trunk@55086
git-svn-id: http://core.svn.wordpress.org/trunk@54619 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-01-18 06:40:10 -05:00
|
|
|
WP_Theme_JSON_Resolver::clean_cached_data();
|
|
|
|
}
|