From 6476ef2cc9cdb5641e54cd15c372e6aa08a5f2e3 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 9 Mar 2017 20:05:46 +0000 Subject: [PATCH] Canonical: Strip trailing punctuation from permalinks. Props joostdevalk, lancewillett, SergeyBiryukov. Fixes #20383. Built from https://develop.svn.wordpress.org/trunk@40256 git-svn-id: http://core.svn.wordpress.org/trunk@40178 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/canonical.php | 24 ++++++++++++++++++++---- wp-includes/version.php | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/wp-includes/canonical.php b/wp-includes/canonical.php index 11c513d31a..2de5486430 100644 --- a/wp-includes/canonical.php +++ b/wp-includes/canonical.php @@ -391,12 +391,28 @@ function redirect_canonical( $requested_url = null, $do_redirect = true ) { // trailing /index.php $redirect['path'] = preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path']); - // Remove trailing spaces from the path - $redirect['path'] = preg_replace( '#(%20| )+$#', '', $redirect['path'] ); + $punctuation_pattern = implode( '|', array_map( 'preg_quote', array( + ' ', '%20', // space + '!', '%21', // exclamation mark + '"', '%22', // double quote + "'", '%27', // single quote + '(', '%28', // opening bracket + ')', '%29', // closing bracket + ',', '%2C', // comma + '.', '%2E', // period + ';', '%3B', // semicolon + '{', '%7B', // opening curly bracket + '}', '%7D', // closing curly bracket + '“', '%E2%80%9C', // opening curly quote + '”', '%E2%80%9D', // closing curly quote + ) ) ); + + // Remove trailing spaces and end punctuation from the path. + $redirect['path'] = preg_replace( "#($punctuation_pattern)+$#", '', $redirect['path'] ); if ( !empty( $redirect['query'] ) ) { - // Remove trailing spaces from certain terminating query string args - $redirect['query'] = preg_replace( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#', '$1', $redirect['query'] ); + // Remove trailing spaces and end punctuation from certain terminating query string args. + $redirect['query'] = preg_replace( "#((p|page_id|cat|tag)=[^&]*?)($punctuation_pattern)+$#", '$1', $redirect['query'] ); // Clean up empty query strings $redirect['query'] = trim(preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query']), '&'); diff --git a/wp-includes/version.php b/wp-includes/version.php index 7b5db4a949..bc3a3a34bb 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.8-alpha-40255'; +$wp_version = '4.8-alpha-40256'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.