diff --git a/src/wp-includes/class-wp-scripts.php b/src/wp-includes/class-wp-scripts.php
index 13266274048ea..49dde399ead80 100644
--- a/src/wp-includes/class-wp-scripts.php
+++ b/src/wp-includes/class-wp-scripts.php
@@ -22,7 +22,8 @@ class WP_Scripts extends WP_Dependencies {
* Full URL with trailing slash.
*
* @since 2.6.0
- * @var string
+ * @see wp_default_scripts()
+ * @var string|null
*/
public $base_url;
@@ -30,7 +31,8 @@ class WP_Scripts extends WP_Dependencies {
* URL of the content directory.
*
* @since 2.8.0
- * @var string
+ * @see wp_default_scripts()
+ * @var string|null
*/
public $content_url;
@@ -38,7 +40,8 @@ class WP_Scripts extends WP_Dependencies {
* Default version string for scripts.
*
* @since 2.6.0
- * @var string
+ * @see wp_default_scripts()
+ * @var string|null
*/
public $default_version;
@@ -118,6 +121,7 @@ class WP_Scripts extends WP_Dependencies {
* List of default directories.
*
* @since 2.8.0
+ * @see wp_default_scripts()
* @var string[]|null
*/
public $default_dirs;
@@ -413,9 +417,19 @@ public function do_item( $handle, $group = false ) {
$src = $this->base_url . $src;
}
- if ( ! empty( $ver ) ) {
- $src = add_query_arg( 'ver', $ver, $src );
+ $query_args = array();
+ if ( false === $obj->ver && is_string( $this->default_version ) ) {
+ $query_args['ver'] = $this->default_version;
+ } elseif ( is_scalar( $obj->ver ) ) {
+ $query_args['ver'] = (string) $obj->ver;
+ }
+ if ( isset( $this->args[ $handle ] ) ) {
+ parse_str( $this->args[ $handle ], $parsed_args );
+ if ( $parsed_args ) {
+ $query_args = array_merge( $query_args, $parsed_args );
+ }
}
+ $src = add_query_arg( rawurlencode_deep( $query_args ), $src );
/** This filter is documented in wp-includes/class-wp-scripts.php */
$src = esc_url_raw( apply_filters( 'script_loader_src', $src, $handle ) );
diff --git a/src/wp-includes/class-wp-styles.php b/src/wp-includes/class-wp-styles.php
index 2af3581d9aae1..a1fe4e9635156 100644
--- a/src/wp-includes/class-wp-styles.php
+++ b/src/wp-includes/class-wp-styles.php
@@ -22,7 +22,8 @@ class WP_Styles extends WP_Dependencies {
* Full URL with trailing slash.
*
* @since 2.6.0
- * @var string
+ * @see wp_default_styles()
+ * @var string|null
*/
public $base_url;
@@ -30,7 +31,8 @@ class WP_Styles extends WP_Dependencies {
* URL of the content directory.
*
* @since 2.8.0
- * @var string
+ * @see wp_default_styles()
+ * @var string|null
*/
public $content_url;
@@ -38,7 +40,8 @@ class WP_Styles extends WP_Dependencies {
* Default version string for stylesheets.
*
* @since 2.6.0
- * @var string
+ * @see wp_default_styles()
+ * @var string|null
*/
public $default_version;
@@ -46,6 +49,7 @@ class WP_Styles extends WP_Dependencies {
* The current text direction.
*
* @since 2.6.0
+ * @see wp_default_styles()
* @var string
*/
public $text_direction = 'ltr';
@@ -96,6 +100,7 @@ class WP_Styles extends WP_Dependencies {
* List of default directories.
*
* @since 2.8.0
+ * @see wp_default_styles()
* @var string[]|null
*/
public $default_dirs;
@@ -212,7 +217,7 @@ public function do_item( $handle, $group = false ) {
return true;
}
- $href = $this->_css_href( $src, $ver, $handle );
+ $href = $this->_css_href( $src, $obj->ver, $handle );
if ( ! $href ) {
return true;
}
@@ -419,9 +424,9 @@ public function all_deps( $handles, $recursion = false, $group = false ) {
*
* @since 2.6.0
*
- * @param string $src The source of the enqueued style.
- * @param string $ver The version of the enqueued style.
- * @param string $handle The style's registered handle.
+ * @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.
*/
public function _css_href( $src, $ver, $handle ) {
@@ -429,9 +434,19 @@ public function _css_href( $src, $ver, $handle ) {
$src = $this->base_url . $src;
}
- if ( ! empty( $ver ) ) {
- $src = add_query_arg( 'ver', $ver, $src );
+ $query_args = array();
+ if ( false === $ver && is_string( $this->default_version ) ) {
+ $query_args['ver'] = $this->default_version;
+ } elseif ( is_scalar( $ver ) ) {
+ $query_args['ver'] = (string) $ver;
+ }
+ if ( isset( $this->args[ $handle ] ) ) {
+ parse_str( $this->args[ $handle ], $parsed_args );
+ if ( $parsed_args ) {
+ $query_args = array_merge( $query_args, $parsed_args );
+ }
}
+ $src = add_query_arg( rawurlencode_deep( $query_args ), $src );
/**
* Filters an enqueued style's fully-qualified URL.
diff --git a/tests/phpunit/tests/dependencies/scripts.php b/tests/phpunit/tests/dependencies/scripts.php
index a3c8b92695f4f..73be56f423539 100644
--- a/tests/phpunit/tests/dependencies/scripts.php
+++ b/tests/phpunit/tests/dependencies/scripts.php
@@ -73,19 +73,27 @@ public function tear_down() {
* Test versioning
*
* @ticket 11315
+ * @ticket 64372
*/
public function test_wp_enqueue_script() {
global $wp_version;
wp_enqueue_script( 'no-deps-no-version', 'example.com', array() );
wp_enqueue_script( 'empty-deps-no-version', 'example.com' );
- wp_enqueue_script( 'empty-deps-version', 'example.com', array(), 1.2 );
+ wp_enqueue_script( 'empty-deps-version', 'example.com', array(), '1.2' );
wp_enqueue_script( 'empty-deps-null-version', 'example.com', array(), null );
+ wp_enqueue_script( 'empty-deps-arg-in-handle-with-ver?arg1=foo&arg2=bar', 'https://example.com/test.js', array(), '2.0' );
+ wp_enqueue_script( 'empty-deps-arg-in-handle-without-ver?arg1=foo&arg2=bar', 'https://example.com/test.js', array(), null );
+ wp_register_script( 'registered-no-qs-handle-null-version-enqueued-with-qs', 'https://example.com/test.js' );
+ wp_enqueue_script( 'registered-no-qs-handle-null-version-enqueued-with-qs?arg1=foo&arg2=bar' );
$expected = "\n";
$expected .= "\n";
$expected .= "\n";
$expected .= "\n";
+ $expected .= "\n";
+ $expected .= "\n";
+ $expected .= "\n";
$this->assertEqualHTML( $expected, get_echo( 'wp_print_scripts' ) );
@@ -526,7 +534,7 @@ public function data_provider_to_test_various_strategy_dependency_chains() {
//# sourceURL=blocking-not-async-without-dependency-js-before
/* ]]> */
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
HTML
,
),
@@ -1022,7 +1030,7 @@ public function data_provider_to_test_various_strategy_dependency_chains() {
$this->add_test_inline_script( $handle, 'after' );
},
'expected_markup' => <<
+
-
-
+
+
+
-
+
-
-
+
+
+
HTML
,
),
diff --git a/tests/phpunit/tests/dependencies/styles.php b/tests/phpunit/tests/dependencies/styles.php
index 74e4db47330b4..d5f5c62c265d4 100644
--- a/tests/phpunit/tests/dependencies/styles.php
+++ b/tests/phpunit/tests/dependencies/styles.php
@@ -55,20 +55,28 @@ public function tear_down() {
* Test versioning
*
* @ticket 11315
+ * @ticket 64372
*/
public function test_wp_enqueue_style() {
wp_enqueue_style( 'no-deps-no-version', 'example.com' );
- wp_enqueue_style( 'no-deps-version', 'example.com', array(), 1.2 );
+ wp_enqueue_style( 'no-deps-version', 'example.com', array(), '1.2' );
wp_enqueue_style( 'no-deps-null-version', 'example.com', array(), null );
wp_enqueue_style( 'no-deps-null-version-print-media', 'example.com', array(), null, 'print' );
+ wp_enqueue_style( 'no-deps-arg-in-handle-with-ver?arg1=foo&arg2=bar', 'https://example.com/test.css', array(), '2.0' );
+ wp_enqueue_style( 'no-deps-arg-in-handle-without-ver?arg1=foo&arg2=bar', 'https://example.com/test.css', array(), null );
+ wp_register_style( 'registered-no-qs-handle-null-version-enqueued-with-qs', 'https://example.com/test.css' );
+ wp_enqueue_style( 'registered-no-qs-handle-null-version-enqueued-with-qs?arg1=foo&arg2=bar' );
$ver = get_bloginfo( 'version' );
$expected = "\n";
$expected .= "\n";
$expected .= "\n";
$expected .= "\n";
+ $expected .= "\n";
+ $expected .= "\n";
+ $expected .= "\n";
- $this->assertSame( $expected, get_echo( 'wp_print_styles' ) );
+ $this->assertEqualHTML( $expected, get_echo( 'wp_print_styles' ) );
// No styles left to print.
$this->assertSame( '', get_echo( 'wp_print_styles' ) );