Make WordPress Core

Changeset 56042


Ignore:
Timestamp:
06/26/2023 07:55:28 PM (3 years ago)
Author:
flixos90
Message:

General: Introduce WP_DEVELOPMENT_MODE constant to signify context-specific development mode.

In recent releases, WordPress core added several instances of cache usage around specific files. While those caches are safe to use in a production context, in development certain nuances apply for whether or not those caches make sense to use. Initially, WP_DEBUG was used as a temporary workaround, but it was clear that a more granular method to signify a specific development mode was required: For example, caches around theme.json should be disabled when working on a theme as otherwise it would disrupt the theme developer's workflow, but when working on a plugin or WordPress core, this consideration does not apply.

This changeset introduces a WP_DEVELOPMENT_MODE constant which, for now, can be set to either "core", "plugin", "theme", or an empty string, the latter of which means no development mode, which is also the default. A new function wp_get_development_mode() is the recommended way to retrieve that configuration value.

With the new function available, this changeset replaces all existing instances of the aforementioned WP_DEBUG workaround to use wp_get_development_mode() with a more specific check.

Props azaozz, sergeybiryukov, peterwilsoncc, spacedmonkey.
Fixes #57487.

Location:
trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/.env

    r55920 r56042  
    6060LOCAL_SCRIPT_DEBUG=true
    6161LOCAL_WP_ENVIRONMENT_TYPE=local
     62LOCAL_WP_DEVELOPMENT_MODE=core
    6263
    6364# The URL to use when running e2e tests.
  • trunk/src/wp-includes/default-constants.php

    r56032 r56042  
    7878        }
    7979
     80        /*
     81         * Add define( 'WP_DEVELOPMENT_MODE', 'core' ) or define( 'WP_DEVELOPMENT_MODE', 'plugin' ) or
     82         * define( 'WP_DEVELOPMENT_MODE', 'theme' ) to wp-config.php to signify development mode for WordPress core, a
     83         * plugin, or a theme respectively.
     84         */
     85        if ( ! defined( 'WP_DEVELOPMENT_MODE' ) ) {
     86                define( 'WP_DEVELOPMENT_MODE', '' );
     87        }
     88
    8089        // Add define( 'WP_DEBUG', true ); to wp-config.php to enable display of notices during development.
    8190        if ( ! defined( 'WP_DEBUG' ) ) {
    82                 if ( 'development' === wp_get_environment_type() ) {
     91                if ( wp_get_development_mode() || 'development' === wp_get_environment_type() ) {
    8392                        define( 'WP_DEBUG', true );
    8493                } else {
  • trunk/src/wp-includes/global-styles-and-settings.php

    r56038 r56042  
    6767
    6868        /*
    69          * Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
     69         * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme
    7070         * developer's workflow.
    71          *
    72          * @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
    73          */
    74         $can_use_cached = ! WP_DEBUG;
     71         */
     72        $can_use_cached = wp_get_development_mode() !== 'theme';
    7573
    7674        $settings = false;
    … …  
    152150function wp_get_global_stylesheet( $types = array() ) {
    153151        /*
    154          * Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
     152         * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme
    155153         * developer's workflow.
    156          *
    157          * @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
    158          */
    159         $can_use_cached = empty( $types ) && ! WP_DEBUG;
     154         */
     155        $can_use_cached = empty( $types ) && wp_get_development_mode() !== 'theme';
    160156
    161157        /*
    … …  
    253249        }
    254250        /*
    255          * Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
     251         * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme
    256252         * developer's workflow.
    257          *
    258          * @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
    259          */
    260         $can_use_cached = ! WP_DEBUG;
     253         */
     254        $can_use_cached = wp_get_development_mode() !== 'theme';
    261255
    262256        /*
    … …  
    304298function wp_get_global_styles_svg_filters() {
    305299        /*
    306          * Ignore cache when `WP_DEBUG` is enabled, so it doesn't interfere with the theme
     300         * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme
    307301         * developer's workflow.
    308          *
    309          * @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
    310          */
    311         $can_use_cached = ! WP_DEBUG;
     302         */
     303        $can_use_cached = wp_get_development_mode() !== 'theme';
    312304        $cache_group    = 'theme_json';
    313305        $cache_key      = 'wp_get_global_styles_svg_filters';
    … …  
    403395                null !== $theme_has_support &&
    404396                /*
    405                  * Ignore static cache when `WP_DEBUG` is enabled. Why? To avoid interfering with
     397                 * Ignore static cache when the development mode is set to 'theme', to avoid interfering with
    406398                 * the theme developer's workflow.
    407                  *
    408                  * @todo Replace `WP_DEBUG` once an "in development mode" check is available in Core.
    409399                 */
    410                 ! WP_DEBUG &&
     400                wp_get_development_mode() !== 'theme' &&
    411401                /*
    412402                 * Ignore cache when automated test suites are running. Why? To ensure
  • trunk/src/wp-includes/load.php

    r56032 r56042  
    260260
    261261        return $current_env;
     262}
     263
     264/**
     265 * Retrieves the current development mode.
     266 *
     267 * The development mode affects how certain parts of the WordPress application behave, which is relevant when
     268 * developing for WordPress.
     269 *
     270 * Valid developer modes are 'core', 'plugin', 'theme', or an empty string to disable developer mode.
     271 *
     272 * Developer mode is considered separately from `WP_DEBUG` and {@see wp_get_environment_type()}. It does not affect
     273 * debugging output, but rather functional nuances in WordPress.
     274 *
     275 * @since 6.3.0
     276 *
     277 * @return string The current development mode.
     278 */
     279function wp_get_development_mode() {
     280        static $current_mode = null;
     281
     282        if ( ! defined( 'WP_RUN_CORE_TESTS' ) && null !== $current_mode ) {
     283                return $current_mode;
     284        }
     285
     286        $development_mode = WP_DEVELOPMENT_MODE;
     287
     288        // Exclusively for core tests, rely on a global `$_wp_tests_development_mode`.
     289        if ( defined( 'WP_RUN_CORE_TESTS' ) && isset( $GLOBALS['_wp_tests_development_mode'] ) ) {
     290                $development_mode = $GLOBALS['_wp_tests_development_mode'];
     291        }
     292
     293        $valid_modes = array(
     294                'core',
     295                'plugin',
     296                'theme',
     297                '',
     298        );
     299        if ( ! in_array( $development_mode, $valid_modes, true ) ) {
     300                $development_mode = '';
     301        }
     302
     303        $current_mode = $development_mode;
     304
     305        return $current_mode;
    262306}
    263307
  • trunk/tests/phpunit/tests/theme/wpGetGlobalStylesSvgFilters.php

    r55185 r56042  
    3535                $this->assertNotSame( $svg_for_default_theme, $svg_for_block_theme, 'Cache value should have changed' );
    3636        }
     37
     38        /**
     39         * Tests that the function relies on the development mode for whether to use caching.
     40         *
     41         * @ticket 57487
     42         *
     43         * @covers ::wp_get_global_styles_svg_filters
     44         */
     45        public function test_caching_is_used_when_developing_theme() {
     46                global $_wp_tests_development_mode;
     47
     48                switch_theme( 'block-theme' );
     49
     50                // Store SVG in cache.
     51                $svg = '<svg></svg>';
     52                wp_cache_set( 'wp_get_global_styles_svg_filters', $svg, 'theme_json' );
     53
     54                // By default, caching should be used, so the above value will be returned.
     55                $_wp_tests_development_mode = '';
     56                $this->assertSame( $svg, wp_get_global_styles_svg_filters(), 'Caching was not used despite development mode disabled' );
     57
     58                // When the development mode is set to 'theme', caching should not be used.
     59                $_wp_tests_development_mode = 'theme';
     60                $this->assertNotSame( $svg, wp_get_global_styles_svg_filters(), 'Caching was used despite theme development mode' );
     61        }
    3762}
  • trunk/tests/phpunit/tests/theme/wpGetGlobalStylesheet.php

    r55572 r56042  
    222222
    223223        /**
     224         * Tests that the function relies on the development mode for whether to use caching.
     225         *
     226         * @ticket 57487
     227         */
     228        public function test_caching_is_used_when_developing_theme() {
     229                global $_wp_tests_development_mode;
     230
     231                $this->maybe_switch_theme( 'block-theme' );
     232
     233                // Store CSS in cache.
     234                $css = '.my-class { display: block; }';
     235                wp_cache_set( 'wp_get_global_stylesheet', $css, 'theme_json' );
     236
     237                // By default, caching should be used, so the above value will be returned.
     238                $_wp_tests_development_mode = '';
     239                $this->assertSame( $css, wp_get_global_stylesheet(), 'Caching was not used despite development mode disabled' );
     240
     241                // When the development mode is set to 'theme', caching should not be used.
     242                $_wp_tests_development_mode = 'theme';
     243                $this->assertNotSame( $css, wp_get_global_stylesheet(), 'Caching was used despite theme development mode' );
     244        }
     245
     246        /**
    224247         * Adds the 'editor-font-sizes' theme support with custom font sizes.
    225248         *
  • trunk/tools/local-env/scripts/install.js

    r54096 r56042  
    1717wp_cli( `config set SCRIPT_DEBUG ${process.env.LOCAL_SCRIPT_DEBUG} --raw --type=constant` );
    1818wp_cli( `config set WP_ENVIRONMENT_TYPE ${process.env.LOCAL_WP_ENVIRONMENT_TYPE} --type=constant` );
     19wp_cli( `config set WP_DEVELOPMENT_MODE ${process.env.LOCAL_WP_DEVELOPMENT_MODE} --type=constant` );
    1920
    2021// Move wp-config.php to the base directory, so it doesn't get mixed up in the src or build directories.
Note: See TracChangeset for help on using the changeset viewer.