Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
b3809c8
Preload the admin's unconcatenated assets from the login screen
westonruter Aug 16, 2026
8789351
Prefetch rather than preload the admin's assets from the login screen
westonruter Aug 16, 2026
879ce15
Drop the redundant fetchpriority attribute from the admin prefetch links
westonruter Aug 16, 2026
98b2ee1
Only prefetch admin assets when the login actually leads to the admin
westonruter Aug 16, 2026
0db2f11
Pass the login redirect target to the admin asset prefetch filter
westonruter Aug 16, 2026
fa3677e
Prefetch the editor's stylesheets from the screens that lead to it
westonruter Aug 17, 2026
cefa78d
Type the handle expander against WP_Dependencies
westonruter Aug 18, 2026
814fcd7
Keep empty handles out of the expanded dependency set
westonruter Aug 18, 2026
6ad32b5
Simplify cap check
westonruter Aug 18, 2026
d80705e
Model the prefetch resource list on wp_preload_resources()
westonruter Aug 19, 2026
c6c18bb
Stop implying the prefetch filter only takes scripts and styles
westonruter Aug 19, 2026
a12640f
Carry each registry alongside the handles it registered
westonruter Aug 19, 2026
cec3373
Stop naming the login screen where any screen is meant
westonruter Aug 19, 2026
a6ab6ba
Inline the block editor check into its only caller
westonruter Aug 19, 2026
7a646ea
Remove default priority from add_action()
westonruter Aug 19, 2026
8fea842
Say why the URL resolver names two registries and not their parent
westonruter Aug 19, 2026
87e9460
Merge branch 'trunk' into add/admin-script-style-preloading
westonruter Sep 26, 2026
274eb55
Stop claiming prefetch reuse is independent of cache headers
westonruter Sep 26, 2026
9818520
Prefetch only what blocks the admin's first paint from the login screen
westonruter Sep 26, 2026
45e7e8a
Allow far-future caching of static assets in the local environment
westonruter Sep 26, 2026
90d764f
Merge branch 'trunk' of https://github.com/WordPress/wordpress-develo…
westonruter Sep 26, 2026
81f72fd
Derive the login prefetch set from root handles
westonruter Sep 27, 2026
8a36ca8
Share URL building between do_item() and the admin prefetch
westonruter Sep 27, 2026
176c7e4
Add tests for WP_Scripts::get_src() and WP_Styles::get_rtl_href()
westonruter Sep 27, 2026
a01bb6b
Note where the login prefetch roots are enqueued
westonruter Sep 27, 2026
9b63a14
Drop the redundant wp-pointer prefetch root
westonruter Sep 27, 2026
debcf11
Drop the redundant editor prefetch roots
westonruter Sep 27, 2026
68844a5
Note where the editor prefetch roots are enqueued
westonruter Sep 27, 2026
6893636
Add tests for wp_prefetch_admin_assets()
westonruter Sep 27, 2026
35b06f6
Enhance comment on resource attributes in script-loader
westonruter Sep 27, 2026
4524a2d
Fix Copilot's broken indent in 35b06f6479c42caa164f7c269457da5d6313b6a9
westonruter Sep 27, 2026
6368d7a
Clarify when the prefetch URLs may not match the admin's
westonruter Sep 27, 2026
2b11401
Use the login action wp-login.php resolved
westonruter Sep 27, 2026
4e14337
Skip the login prefetch when redirecting to another host
westonruter Sep 27, 2026
30703db
Derive the prefetch tests' URLs from the site's own
westonruter Sep 27, 2026
d4f6bf8
Test that network and user Dashboards prefetch nothing
westonruter Sep 27, 2026
d40ea0f
Pass stylesheet URLs to the prefetch filter unescaped
westonruter Sep 27, 2026
73bce09
Add WP_Styles::get_src() and rename get_rtl_href() to get_rtl_src()
westonruter Sep 28, 2026
c0dcfb9
Check edit_posts rather than create_posts before prefetching the editor
westonruter Sep 29, 2026
89d909c
Prefetch with fetch() in browsers without rel=prefetch
westonruter Sep 29, 2026
21a718e
Share the concatenation default between script_concat_settings() and …
westonruter Oct 2, 2026
49c1fe5
Correct comment formatting in wpShouldConcatenateAdminScripts test
westonruter Oct 2, 2026
88bf79a
Restore the $concatenate_scripts global in tear_down()
westonruter Oct 2, 2026
f172c60
Sanitize the right-to-left stylesheet URL only once when printing it
westonruter Oct 3, 2026
b00c19c
Skip prefetching from the login screen for an admin under another scheme
westonruter Oct 3, 2026
9b752fe
Skip prefetch URLs that esc_url() rejects
westonruter Oct 3, 2026
20a86b0
Merge branch 'trunk' of https://github.com/WordPress/wordpress-develo…
westonruter Oct 3, 2026
5941696
Prefetch from the login screen after its footer scripts
westonruter Oct 3, 2026
329b924
Hook admin prefetching in admin-filters.php
westonruter Oct 3, 2026
34746c5
Check the block editor before prefetching its stylesheets from the lo…
westonruter Oct 3, 2026
52bfff2
Tell the login screen apart by the request, and prefetch on all of it…
westonruter Oct 3, 2026
7105005
Treat an empty redirect_to as none when prefetching from the login sc…
westonruter Oct 3, 2026
2fa8166
Skip what the current screen has queued, not only what it has printed
westonruter Oct 3, 2026
9f0261a
Test the login screen's prefetching with the hooks default-filters.ph…
westonruter Oct 3, 2026
ff4c4d1
Check the block editor for the editor's post type in one place
westonruter Oct 3, 2026
20e51e3
Skip expanding the current screen's queue for a type with no roots
westonruter Oct 3, 2026
3e9ae03
Call admin_url() once when resolving the login screen's destination
westonruter Oct 3, 2026
49606b5
Document when to add a wp_should_concatenate_admin_scripts callback, …
westonruter Oct 3, 2026
355774c
Prefetch for a redirect_to of the admin without its trailing slash
westonruter Oct 3, 2026
578f84e
Return the new get_src() and get_rtl_src() URLs unsanitized
westonruter Oct 3, 2026
7257f45
Skip prefetching handles the next screen would print nothing for
westonruter Oct 3, 2026
01353f4
Name WP_Dependencies::add_data() with :: in its deprecation notice
westonruter Oct 3, 2026
368320a
Merge branch 'trunk' of https://github.com/WordPress/wordpress-develo…
westonruter Oct 3, 2026
d3ea128
Recognize the login screen by 'login_init' rather than is_login()
westonruter Oct 3, 2026
96c9d80
Resolve redirect_to with wp_validate_redirect() alone, as wp_safe_red…
westonruter Oct 3, 2026
e4c4eb1
Treat a redirect_to's explicit default port as the admin's own
westonruter Oct 3, 2026
acae9f7
Allow only http and https URLs among the prefetched resources
westonruter Oct 3, 2026
eb0e614
Clarify which sources WP_Styles::get_src() returns no URL for
westonruter Oct 3, 2026
d706ef8
Give the right-to-left stylesheet the same version and arguments as i…
westonruter Oct 4, 2026
81cf946
Merge branch 'trunk' into add/admin-script-style-preloading
westonruter Oct 6, 2026
7fe9568
Name variable to indicate already escaped
westonruter Oct 6, 2026
5a0cfaf
Type the prefetch links in the inline script as HTMLLinkElement
westonruter Oct 6, 2026
8bc35b5
Merge branch 'trunk' into add/admin-script-style-preloading
westonruter Oct 6, 2026
cf6e2a6
Rename the prefetch_admin_assets filter to wp_prefetch_admin_assets
westonruter Oct 6, 2026
ebba75b
Use the HTML Tag Processor to find the login footer's jQuery script a…
westonruter Oct 6, 2026
2a5c724
Type the as value of the prefetch test helpers as 'script'|'style'
westonruter Oct 6, 2026
e514355
Test that an escaped copy of a prefetched URL is collapsed with it
westonruter Oct 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/wp-admin/admin-header.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@
<title><?php echo esc_html( $admin_title ); ?></title>
<?php

/*
* The dependencies of `colors` and the `utils` script are prefetched from the login screen by
* wp_prefetch_admin_assets(), which needs updating if these change.
*/
wp_enqueue_style( 'colors' );
wp_enqueue_script( 'utils' );
wp_enqueue_script( 'svg-painter' );
Expand Down
4 changes: 4 additions & 0 deletions src/wp-admin/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@
$date_format = __( 'F j, Y' );
$time_format = __( 'g:i a' );

/*
* The `jquery` dependency of this script is prefetched from the login screen by
* wp_prefetch_admin_assets(), which needs updating if this changes.
*/
wp_enqueue_script( 'common' );

/**
Expand Down
1 change: 1 addition & 0 deletions src/wp-admin/edit-form-blocks.php
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ static function ( $classes ) {
/**
* Styles
*/
// Prefetched for the block editor by wp_prefetch_admin_assets(), which needs updating if this changes.
wp_enqueue_style( 'wp-edit-post' );

/**
Expand Down
1 change: 1 addition & 0 deletions src/wp-admin/includes/admin-filters.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
add_action( 'admin_head', 'wp_admin_canonical_url' );
add_action( 'admin_head', 'wp_site_icon' );
add_action( 'admin_head', 'wp_admin_viewport_meta' );
add_action( 'admin_head', 'wp_prefetch_admin_assets' );
add_action( 'customize_controls_head', 'wp_admin_viewport_meta' );
add_filter( 'nav_menu_meta_box_object', '_wp_nav_menu_meta_box_object' );

Expand Down
1 change: 1 addition & 0 deletions src/wp-includes/class-wp-admin-bar.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public function initialize() {
add_action( 'wp_head', $header_callback );

wp_enqueue_script( 'admin-bar' );
// Prefetched from the login screen by wp_prefetch_admin_assets(), which needs updating if this changes.
wp_enqueue_style( 'admin-bar' );

/**
Expand Down
2 changes: 1 addition & 1 deletion src/wp-includes/class-wp-dependencies.php
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ public function add_data( $handle, $key, $value ) {
}
if ( 'conditional' === $key && '_required-conditional-dependency_' !== $value ) {
_deprecated_argument(
'WP_Dependencies->add_data()',
'WP_Dependencies::add_data()',
'6.9.0',
__( 'IE conditional comments are ignored by all supported browsers.' )
);
Expand Down
5 changes: 4 additions & 1 deletion src/wp-includes/class-wp-editor.php
Original file line number Diff line number Diff line change
Expand Up @@ -913,7 +913,10 @@ public static function enqueue_default_editor() {

self::enqueue_scripts( true );

// Also add wp-includes/css/editor.css.
/*
* Also add wp-includes/css/editor.css. It is prefetched for the block editor by
* wp_prefetch_admin_assets(), which needs updating if this changes.
*/
wp_enqueue_style( 'editor-buttons' );

if ( is_admin() ) {
Expand Down
97 changes: 64 additions & 33 deletions src/wp-includes/class-wp-scripts.php
Original file line number Diff line number Diff line change
Expand Up @@ -415,39 +415,7 @@ public function do_item( $handle, $group = false ) {
return true;
}

if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && str_starts_with( $src, $this->content_url ) ) ) {
$src = $this->base_url . $src;
}

$ver_to_add = '';
if ( empty( $obj->ver ) && null !== $obj->ver && is_string( $this->default_version ) ) {
$ver_to_add = $this->default_version;
} elseif ( is_scalar( $obj->ver ) ) {
$ver_to_add = (string) $obj->ver;
}

$added_args = (string) ( $this->args[ $handle ] ?? '' );

if ( '' !== $ver_to_add || '' !== $added_args ) {
$fragment = strstr( $src, '#' );
if ( false !== $fragment ) {
$src = substr( $src, 0, -strlen( $fragment ) );
}

if ( '' !== $ver_to_add ) {
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . 'ver=' . rawurlencode( $ver_to_add );
}
if ( '' !== $added_args ) {
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . $added_args;
}

if ( false !== $fragment ) {
$src .= $fragment;
}
}

/** This filter is documented in wp-includes/class-wp-scripts.php */
$src = esc_url_raw( apply_filters( 'script_loader_src', $src, $handle ) );
$src = esc_url_raw( $this->get_src( $handle ) );

if ( ! $src ) {
return true;
Expand Down Expand Up @@ -506,6 +474,69 @@ public function do_item( $handle, $group = false ) {
return true;
}

/**
* Gets the URL a registered script is loaded from.
*
* This is the URL printed in the script's `src` attribute, including the version query
* argument and any arguments added to the handle, after the {@see 'script_loader_src'} filter.
* Like {@see WP_Script_Modules::get_src()}, it is neither sanitized nor escaped, so a caller
* can pass it through esc_url_raw(), as WP_Scripts::do_item() does, or esc_url(), once.
*
* @since 7.2.0
*
* @param string $handle Script handle.
* @return string Script URL, or an empty string when the script is not registered, has no
* source of its own because it only aliases other scripts, or was filtered away.
*/
public function get_src( string $handle ): string {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These (and WP_Styles::get_src() / get_rtl_src()) would be the first public methods on WP_Scripts/WP_Styles with parameter and return types. A subclass that already defines an untyped get_src( $handle ) will fatal with "Declaration ... must be compatible". I haven't checked whether any plugin does that; worth a WPdirectory search, or dropping the types to match the rest of both classes.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Comment by Claude Opus 5.5

The plugin directory was searched (via Veloria) for both halves of the risk:

  • extends WP_Scripts / extends WP_Styles: 29 matches across 19 plugins, such as Jetpack Boost, Page Optimize, PWA and Powered Cache.
  • function get_src(, function get_rtl_src( or function build_src(: 62 matches across 44 plugins, such as Yoast SEO, Beaver Builder and Timber.

No plugin appears in both sets. The get_src() matches are on unrelated classes, so no subclass of WP_Scripts or WP_Styles in the directory defines any of these methods. All four methods are new in this PR, so no subclass can have overridden them before. A collision would need a private subclass that happened to use the same name, and such a method would most likely conflict in meaning even without the types. On that basis the native types are being kept. They can be dropped if the risk outside the directory is considered too high.

if ( ! isset( $this->registered[ $handle ] ) ) {
return '';
}

$obj = $this->registered[ $handle ];
$src = $obj->src;

if ( ! $src || ! is_string( $src ) ) {
return '';
}

if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && str_starts_with( $src, $this->content_url ) ) ) {
$src = $this->base_url . $src;
}

$ver_to_add = '';
if ( empty( $obj->ver ) && null !== $obj->ver && is_string( $this->default_version ) ) {
$ver_to_add = $this->default_version;
} elseif ( is_scalar( $obj->ver ) ) {
$ver_to_add = (string) $obj->ver;
}

$added_args = (string) ( $this->args[ $handle ] ?? '' );

if ( '' !== $ver_to_add || '' !== $added_args ) {
$fragment = strstr( $src, '#' );
if ( false !== $fragment ) {
$src = substr( $src, 0, -strlen( $fragment ) );
}

if ( '' !== $ver_to_add ) {
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . 'ver=' . rawurlencode( $ver_to_add );
}
if ( '' !== $added_args ) {
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . $added_args;
}

if ( false !== $fragment ) {
$src .= $fragment;
}
}

/** This filter is documented in wp-includes/class-wp-scripts.php */
$src = apply_filters( 'script_loader_src', $src, $handle );

return is_string( $src ) ? $src : '';
}

/**
* Adds extra code to a registered script.
*
Expand Down
123 changes: 112 additions & 11 deletions src/wp-includes/class-wp-styles.php
Original file line number Diff line number Diff line change
Expand Up @@ -224,15 +224,11 @@ public function do_item( $handle, $group = false ) {
*/
$tag = apply_filters( 'style_loader_tag', $tag, $handle, $href, $media );

if ( 'rtl' === $this->text_direction && isset( $obj->extra['rtl'] ) && $obj->extra['rtl'] ) {
if ( is_bool( $obj->extra['rtl'] ) || 'replace' === $obj->extra['rtl'] ) {
$suffix = $obj->extra['suffix'] ?? '';
$rtl_href = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $this->_css_href( $src, $ver, "$handle-rtl" ) );
} else {
$rtl_href = $this->_css_href( $obj->extra['rtl'], $ver, "$handle-rtl" );
}
$rtl_src = $this->get_rtl_src( $handle );

$rtl_tag = sprintf(
if ( null !== $rtl_src ) {
$rtl_href = esc_url( $rtl_src );
Comment thread
westonruter marked this conversation as resolved.
$rtl_tag = sprintf(
"<link rel='%s' id='%s-rtl-css'%s href='%s' media='%s' />\n",
$rel,
esc_attr( $handle ),
Expand Down Expand Up @@ -264,6 +260,53 @@ public function do_item( $handle, $group = false ) {
return true;
}

/**
* Gets the URL of the right-to-left stylesheet for a registered style.
*
* On a right-to-left locale, a style registered with `rtl` data is served by a separate
* stylesheet, which either replaces its left-to-right one (when the data is `'replace'`)
* or loads alongside it.
*
* Like {@see WP_Styles::get_src()}, the URL is neither sanitized nor escaped, so a caller can
* pass it through esc_url() to print it, or esc_url_raw() otherwise, once.
*
* @since 7.2.0
*
* @param string $handle The style's registered handle.
* @return string|null URL of the right-to-left stylesheet, after the {@see 'style_loader_src'}
* filter. Null when the text direction is not right-to-left, or the style is
* not registered, has no source of its own, or has no right-to-left variant.
*/
public function get_rtl_src( string $handle ): ?string {
if ( 'rtl' !== $this->text_direction || ! isset( $this->registered[ $handle ] ) ) {
return null;
}

$obj = $this->registered[ $handle ];

if ( ! $obj->src || ! isset( $obj->extra['rtl'] ) || ! $obj->extra['rtl'] ) {
return null;
}

/*
* The version and the handle's added arguments are those of the left-to-right stylesheet,
* appended the same way, while the filter is passed the handle with `-rtl` appended, as it
* always has been.
*/
if ( is_bool( $obj->extra['rtl'] ) || 'replace' === $obj->extra['rtl'] ) {
$suffix = isset( $obj->extra['suffix'] ) && is_string( $obj->extra['suffix'] ) ? $obj->extra['suffix'] : '';

return str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $this->build_src( $obj->src, $obj->ver, $handle, "$handle-rtl" ) );
}

// Any other value is the URL of the right-to-left stylesheet itself.
if ( ! is_string( $obj->extra['rtl'] ) ) {
return null;
}

return $this->build_src( $obj->extra['rtl'], $obj->ver, $handle, "$handle-rtl" );
}

/**
* Adds extra CSS styles to a registered stylesheet.
*
Expand Down Expand Up @@ -401,9 +444,66 @@ public function all_deps( $handles, $recursion = false, $group = false ) {
* @param string $src The source of the enqueued style.
* @param string|false|null $ver The version of the enqueued style.
* @param string $handle The style's registered handle.
* @return string Style's fully-qualified URL.
* @return string Style's fully-qualified URL, escaped for use in an HTML attribute.
*/
public function _css_href( $src, $ver, $handle ) {
return esc_url( $this->build_src( $src, $ver, (string) $handle ) );
}

/**
* Gets the URL a registered style is loaded from.
*
* This is the URL printed in the stylesheet's `href` attribute, including the version query
* argument and any arguments added to the handle, after the {@see 'style_loader_src'} filter.
* Unlike {@see WP_Styles::_css_href()}, it is neither sanitized nor escaped, so a caller can
* pass it through esc_url() to print it, or esc_url_raw() otherwise, once. This is the same as
* {@see WP_Script_Modules::get_src()}.
*
* @since 7.2.0
*
* @param string $handle The style's registered handle.
* @return string Style URL, or an empty string when the style is not registered, has no
* source of its own because it only aliases other styles, or was filtered away.
*/
public function get_src( string $handle ): string {
if ( ! isset( $this->registered[ $handle ] ) ) {
return '';
}

$obj = $this->registered[ $handle ];

/*
* An alias, with no source of its own, has no URL. A source of `true`, like that of `colors`,
* gets past this, since its URL comes from the 'style_loader_src' filter in build_src(), as
* it does when WP_Styles::do_item() prints the stylesheet.
*/
if ( ! $obj->src ) {
return '';
}

return $this->build_src( $obj->src, $obj->ver, $handle );
}

/**
* Builds a style's fully-qualified URL and passes it through the 'style_loader_src' filter.
*
* The result is not escaped, so callers can escape it for where it is used.
*
* @since 7.2.0
*
* @param string|true $src The source of the style, or true for one whose URL comes
* from the {@see 'style_loader_src'} filter.
* @param string|false|null $ver The version of the style.
* @param string $handle The style's registered handle, whose added arguments
* are appended.
* @param string|null $filter_handle Optional. The handle passed to the
* {@see 'style_loader_src'} filter, such as
* `{$handle}-rtl` for a right-to-left stylesheet.
* Default `$handle`.
* @return string The filtered URL, or an empty string when the filter returns anything other
* than a string.
*/
private function build_src( $src, $ver, string $handle, ?string $filter_handle = null ): string {
if ( ! is_bool( $src ) && ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && str_starts_with( $src, $this->content_url ) ) ) {
$src = $this->base_url . $src;
}
Expand Down Expand Up @@ -443,8 +543,9 @@ public function _css_href( $src, $ver, $handle ) {
* @param string $src The source URL of the enqueued style.
* @param string $handle The style's registered handle.
*/
$src = apply_filters( 'style_loader_src', $src, $handle );
return esc_url( $src );
$src = apply_filters( 'style_loader_src', $src, $filter_handle ?? $handle );

return is_string( $src ) ? $src : '';
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/wp-includes/default-filters.php
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@
add_action( 'login_head', 'print_admin_styles', 9 );
add_action( 'login_head', 'wp_site_icon', 99 );
add_action( 'login_footer', 'wp_print_footer_scripts', 20 );
add_action( 'login_footer', 'wp_prefetch_admin_assets', 21 ); // By the footer, the login screen has enqueued everything it loads, so those are skipped.
add_action( 'login_init', 'send_frame_options_header', 10, 0 );
add_action( 'login_init', 'wp_admin_headers' );

Expand Down
1 change: 1 addition & 0 deletions src/wp-includes/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -7664,6 +7664,7 @@ function wp_auth_check_load() {
* @param WP_Screen $screen The current screen object.
*/
if ( apply_filters( 'wp_auth_check_load', $show, $screen ) ) {
// Prefetched from the login screen by wp_prefetch_admin_assets(), which needs updating if this changes.
wp_enqueue_style( 'wp-auth-check' );
wp_enqueue_script( 'wp-auth-check' );

Expand Down
2 changes: 2 additions & 0 deletions src/wp-includes/media.php
Original file line number Diff line number Diff line change
Expand Up @@ -5305,11 +5305,13 @@ function wp_enqueue_media( $args = array() ) {
wp_localize_script( 'media-views', '_wpMediaViewsL10n', $strings );

wp_enqueue_script( 'media-audiovideo' );
// Prefetched for the block editor by wp_prefetch_admin_assets(), which needs updating if this changes.
wp_enqueue_style( 'media-views' );
if ( is_admin() ) {
wp_enqueue_script( 'mce-view' );
wp_enqueue_script( 'image-edit' );
}
// Prefetched for the block editor by wp_prefetch_admin_assets(), which needs updating if this changes.
wp_enqueue_style( 'imgareaselect' );
wp_plupload_default_settings();

Expand Down
Loading
Loading