Skip to content

Commit b8b74d5

Browse files
committed
Script Loader: Preserve duplicate URL query params in enqueued scripts and styles.
Previously in r61397, `add_query_arg()` was used to append versions or handle-specific query arguments. This resulted in stripping any existing duplicate query variables in the source URL (common in Google Fonts URLs). This change refactors `WP_Styles::_css_href()` and `WP_Scripts::do_item()` to manually append these parameters to the URL string. This ensures all original query variables are preserved exactly as provided. It also improves fragment handling by ensuring query parameters are inserted before any '#' anchor while maintaining the anchor's presence. The URL encoding changes in `tests/phpunit/tests/dependencies/scripts.php` are reversions of what had previously been done in r61397. Developed in #11164 Follow-up to r61397, r61358. Props westonruter, jonsurrell. Fixes #64372. git-svn-id: https://develop.svn.wordpress.org/trunk@61927 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 4bb460c commit b8b74d5

4 files changed

Lines changed: 203 additions & 47 deletions

File tree

src/wp-includes/class-wp-scripts.php

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -417,19 +417,32 @@ public function do_item( $handle, $group = false ) {
417417
$src = $this->base_url . $src;
418418
}
419419

420-
$query_args = array();
420+
$ver_to_add = '';
421421
if ( empty( $obj->ver ) && null !== $obj->ver && is_string( $this->default_version ) ) {
422-
$query_args['ver'] = $this->default_version;
422+
$ver_to_add = $this->default_version;
423423
} elseif ( is_scalar( $obj->ver ) ) {
424-
$query_args['ver'] = (string) $obj->ver;
424+
$ver_to_add = (string) $obj->ver;
425425
}
426-
if ( isset( $this->args[ $handle ] ) ) {
427-
parse_str( $this->args[ $handle ], $parsed_args );
428-
if ( $parsed_args ) {
429-
$query_args = array_merge( $query_args, $parsed_args );
426+
427+
$added_args = (string) ( $this->args[ $handle ] ?? '' );
428+
429+
if ( '' !== $ver_to_add || '' !== $added_args ) {
430+
$fragment = strstr( $src, '#' );
431+
if ( false !== $fragment ) {
432+
$src = substr( $src, 0, -strlen( $fragment ) );
433+
}
434+
435+
if ( '' !== $ver_to_add ) {
436+
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . 'ver=' . rawurlencode( $ver_to_add );
437+
}
438+
if ( '' !== $added_args ) {
439+
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . $added_args;
440+
}
441+
442+
if ( false !== $fragment ) {
443+
$src .= $fragment;
430444
}
431445
}
432-
$src = add_query_arg( rawurlencode_deep( $query_args ), $src );
433446

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

src/wp-includes/class-wp-styles.php

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -407,19 +407,32 @@ public function _css_href( $src, $ver, $handle ) {
407407
$src = $this->base_url . $src;
408408
}
409409

410-
$query_args = array();
410+
$ver_to_add = '';
411411
if ( empty( $ver ) && null !== $ver && is_string( $this->default_version ) ) {
412-
$query_args['ver'] = $this->default_version;
412+
$ver_to_add = $this->default_version;
413413
} elseif ( is_scalar( $ver ) ) {
414-
$query_args['ver'] = (string) $ver;
414+
$ver_to_add = (string) $ver;
415415
}
416-
if ( isset( $this->args[ $handle ] ) ) {
417-
parse_str( $this->args[ $handle ], $parsed_args );
418-
if ( $parsed_args ) {
419-
$query_args = array_merge( $query_args, $parsed_args );
416+
417+
$added_args = (string) ( $this->args[ $handle ] ?? '' );
418+
419+
if ( '' !== $ver_to_add || '' !== $added_args ) {
420+
$fragment = strstr( $src, '#' );
421+
if ( false !== $fragment ) {
422+
$src = substr( $src, 0, -strlen( $fragment ) );
423+
}
424+
425+
if ( '' !== $ver_to_add ) {
426+
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . 'ver=' . rawurlencode( $ver_to_add );
427+
}
428+
if ( '' !== $added_args ) {
429+
$src .= ( str_contains( $src, '?' ) ? '&' : '?' ) . $added_args;
430+
}
431+
432+
if ( false !== $fragment ) {
433+
$src .= $fragment;
420434
}
421435
}
422-
$src = add_query_arg( rawurlencode_deep( $query_args ), $src );
423436

424437
/**
425438
* Filters an enqueued style's fully-qualified URL.

0 commit comments

Comments
 (0)