Make WordPress Core

Changeset 57156

Timestamp:
12/04/2023 07:57:30 PM (8 months ago)
Author:
jorbin
Message:

Themes: Remove memoization from stylesheet and theme directories.

This fixes bugs introduced in [56635] whereby the template or stylesheet path could be memoized incorrectly if get_template_directory() or get_stylesheet_directory() were called before the theme has been fully initialized.

Reviewed by Jorbin.
Merges [57129] to 6.4 branch.

Props partyfrikadelle, coreyw, kdowns, rebasaurus, meta4, flixos90, mukesh27, joemcgill, icaleb.
Fixes #59847.

Location:
branches/6.4
Files:
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/6.4

  • branches/6.4/src/wp-includes/ms-blogs.php

    r56986 r57156  
    492492 * @global bool            $switched
    493493 * @global string          $table_prefix
    494  * @global string          $wp_template_path
    495  * @global string          $wp_stylesheet_path
    496494 * @global WP_Object_Cache $wp_object_cache
    497495 *
     
    535533
    536534    $wpdb->set_blog_id( $new_blog_id );
    537     $GLOBALS['table_prefix']       = $wpdb->get_blog_prefix();
    538     $GLOBALS['blog_id']            = $new_blog_id;
    539     $GLOBALS['wp_template_path']   = null;
    540     $GLOBALS['wp_stylesheet_path'] = null;
     535    $GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();
     536    $GLOBALS['blog_id']      = $new_blog_id;
    541537
    542538    if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
     
    605601 * @global bool            $switched
    606602 * @global string          $table_prefix
    607  * @global string          $wp_template_path
    608  * @global string          $wp_stylesheet_path
    609603 * @global WP_Object_Cache $wp_object_cache
    610604 *
     
    632626
    633627    $wpdb->set_blog_id( $new_blog_id );
    634     $GLOBALS['blog_id']            = $new_blog_id;
    635     $GLOBALS['table_prefix']       = $wpdb->get_blog_prefix();
    636     $GLOBALS['wp_template_path']   = null;
    637     $GLOBALS['wp_stylesheet_path'] = null;
     628    $GLOBALS['blog_id']      = $new_blog_id;
     629    $GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();
    638630
    639631    if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
  • branches/6.4/src/wp-includes/theme.php

    r57010 r57156  
    189189 * @since 1.5.0
    190190 * @since 6.4.0 Memoizes filter execution so that it only runs once for the current theme.
    191  *
    192  * @global string $wp_stylesheet_path Current theme stylesheet directory path.
     191 * @since 6.4.2 Memoization removed.
    193192 *
    194193 * @return string Path to active theme's stylesheet directory.
    195194 */
    196195function get_stylesheet_directory() {
    197     global $wp_stylesheet_path;
    198 
    199     if ( null === $wp_stylesheet_path ) {
    200         $stylesheet     = get_stylesheet();
    201         $theme_root     = get_theme_root( $stylesheet );
    202         $stylesheet_dir = "$theme_root/$stylesheet";
    203 
    204         /**
    205          * Filters the stylesheet directory path for the active theme.
    206          *
    207          * @since 1.5.0
    208          *
    209          * @param string $stylesheet_dir Absolute path to the active theme.
    210          * @param string $stylesheet     Directory name of the active theme.
    211          * @param string $theme_root     Absolute path to themes directory.
    212          */
    213         $stylesheet_dir = apply_filters( 'stylesheet_directory', $stylesheet_dir, $stylesheet, $theme_root );
    214 
    215         // If there are filter callbacks, force the logic to execute on every call.
    216         if ( has_filter( 'stylesheet' ) || has_filter( 'theme_root' ) || has_filter( 'stylesheet_directory' ) ) {
    217             return $stylesheet_dir;
    218         }
    219 
    220         $wp_stylesheet_path = $stylesheet_dir;
    221     }
    222 
    223     return $wp_stylesheet_path;
     196    $stylesheet     = get_stylesheet();
     197    $theme_root     = get_theme_root( $stylesheet );
     198    $stylesheet_dir = "$theme_root/$stylesheet";
     199
     200    /**
     201     * Filters the stylesheet directory path for the active theme.
     202     *
     203     * @since 1.5.0
     204     *
     205     * @param string $stylesheet_dir Absolute path to the active theme.
     206     * @param string $stylesheet     Directory name of the active theme.
     207     * @param string $theme_root     Absolute path to themes directory.
     208     */
     209    return apply_filters( 'stylesheet_directory', $stylesheet_dir, $stylesheet, $theme_root );
    224210}
    225211
     
    339325 * @since 1.5.0
    340326 * @since 6.4.0 Memoizes filter execution so that it only runs once for the current theme.
    341  *
    342  * @global string $wp_template_path Current theme template directory path.
     327 * @since 6.4.1 Memoization removed.
    343328 *
    344329 * @return string Path to active theme's template directory.
    345330 */
    346331function get_template_directory() {
    347     global $wp_template_path;
    348 
    349     if ( null === $wp_template_path ) {
    350         $template     = get_template();
    351         $theme_root   = get_theme_root( $template );
    352         $template_dir = "$theme_root/$template";
    353 
    354         /**
    355          * Filters the active theme directory path.
    356          *
    357          * @since 1.5.0
    358          *
    359          * @param string $template_dir The path of the active theme directory.
    360          * @param string $template     Directory name of the active theme.
    361          * @param string $theme_root   Absolute path to the themes directory.
    362          */
    363         $template_dir = apply_filters( 'template_directory', $template_dir, $template, $theme_root );
    364 
    365         // If there are filter callbacks, force the logic to execute on every call.
    366         if ( has_filter( 'template' ) || has_filter( 'theme_root' ) || has_filter( 'template_directory' ) ) {
    367             return $template_dir;
    368         }
    369 
    370         $wp_template_path = $template_dir;
    371     }
    372 
    373     return $wp_template_path;
     332    $template     = get_template();
     333    $theme_root   = get_theme_root( $template );
     334    $template_dir = "$theme_root/$template";
     335
     336    /**
     337     * Filters the active theme directory path.
     338     *
     339     * @since 1.5.0
     340     *
     341     * @param string $template_dir The path of the active theme directory.
     342     * @param string $template     Directory name of the active theme.
     343     * @param string $theme_root   Absolute path to the themes directory.
     344     */
     345    return apply_filters( 'template_directory', $template_dir, $template, $theme_root );
    374346}
    375347
     
    777749 * @global array                $sidebars_widgets
    778750 * @global array                $wp_registered_sidebars
    779  * @global string               $wp_stylesheet_path
    780  * @global string               $wp_template_path
    781751 *
    782752 * @param string $stylesheet Stylesheet name.
    783753 */
    784754function switch_theme( $stylesheet ) {
    785     global $wp_theme_directories, $wp_customize, $sidebars_widgets, $wp_registered_sidebars, $wp_stylesheet_path, $wp_template_path;
     755    global $wp_theme_directories, $wp_customize, $sidebars_widgets, $wp_registered_sidebars;
    786756
    787757    $requirements = validate_theme_requirements( $stylesheet );
     
    866836
    867837    update_option( 'theme_switched', $old_theme->get_stylesheet() );
    868 
    869     /*
    870      * Reset globals to force refresh the next time these directories are
    871      * accessed via `get_stylesheet_directory()` / `get_template_directory()`.
    872      */
    873     $wp_stylesheet_path = null;
    874     $wp_template_path   = null;
    875838
    876839    // Clear pattern caches.
  • branches/6.4/tests/phpunit/tests/theme.php

    r57010 r57156  
    11801180        }
    11811181    }
     1182
     1183
     1184
     1185
     1186
     1187
     1188
     1189
     1190
     1191
     1192
     1193
     1194
     1195
     1196
     1197
     1198
     1199
     1200
     1201
     1202
     1203
     1204
     1205
     1206
     1207
     1208
     1209
     1210
     1211
     1212
     1213
     1214
     1215
     1216
     1217
     1218
     1219
     1220
     1221
     1222
     1223
     1224
     1225
     1226
     1227
     1228
     1229
     1230
     1231
     1232
     1233
     1234
     1235
     1236
     1237
     1238
     1239
     1240
     1241
     1242
     1243
     1244
     1245
     1246
     1247
     1248
     1249
     1250
     1251
     1252
     1253
     1254
     1255
     1256
     1257
     1258
     1259
     1260
     1261
     1262
     1263
     1264
     1265
     1266
     1267
     1268
     1269
     1270
     1271
     1272
     1273
     1274
     1275
     1276
     1277
     1278
     1279
     1280
     1281
     1282
     1283
     1284
     1285
     1286
     1287
     1288
     1289
     1290
     1291
     1292
     1293
     1294
     1295
     1296
     1297
     1298
     1299
     1300
     1301
     1302
     1303
     1304
     1305
     1306
     1307
    11821308}
Note: See TracChangeset for help on using the changeset viewer.