Make WordPress Core

Ticket #20902: 20902-preserve-get.patch

File 20902-preserve-get.patch, 1.3 KB (added by sachinrajcp123, 8 months ago)

This patch ensures that all existing $_GET query parameters are preserved during canonical redirects in redirect_canonical(). Previously, some custom query args could be lost when permalinks are enabled. This fix merges all current $_GET arguments into the redirect URL, solving the issue.

Line 
1--- a/wp-includes/canonical.php
2+++ b/wp-includes/canonical.php
3@@ ... @@
4-   $redirect_url = user_trailingslashit($redirect_url);
5-
6-   if ( !empty($redirect_url) && $redirect_url != $requested_url ) {
7-       wp_redirect($redirect_url, 301);
8-       exit();
9-   }
10+   $redirect_url = user_trailingslashit($redirect_url);
11+
12+   // Preserve all $_GET parameters in the redirect
13+   $parsed_url = parse_url($redirect_url);
14+   $query_args = array();
15+   if ( !empty($parsed_url['query']) ) {
16+       parse_str($parsed_url['query'], $query_args);
17+   }
18+   // Merge $_GET parameters with those already in the URL
19+   $merged_args = array_merge($_GET, $query_args);
20+
21+   // Rebuild the final URL with all parameters
22+   $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
23+   $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
24+   $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
25+   $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
26+   $base_url = $scheme . $host . $port . $path;
27+
28+   $final_redirect_url = !empty($merged_args) ? add_query_arg($merged_args, $base_url) : $redirect_url;
29+
30+   if ( !empty($final_redirect_url) && $final_redirect_url != $requested_url ) {
31+       wp_redirect($final_redirect_url, 301);
32+       exit();
33+   }