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' ) );