2007-08-16 23:45:59 -04:00
< ? php
2007-12-25 15:48:47 -05:00
/**
* Canonical API to handle WordPress Redirecting
*
2008-05-25 11:45:05 -04:00
* Based on " Permalink Redirect " from Scott Yang and " Enforce www. Preference "
* by Mark Jaquith
2007-12-25 15:48:47 -05:00
*
* @ package WordPress
2008-08-27 02:45:13 -04:00
* @ since 2.3 . 0
2007-12-25 15:48:47 -05:00
*/
/**
2008-08-27 02:45:13 -04:00
* Redirects incoming links to the proper URL based on the site url .
2007-12-25 15:48:47 -05:00
*
2008-05-25 11:45:05 -04:00
* Search engines consider www . somedomain . com and somedomain . com to be two
* different URLs when they both go to the same location . This SEO enhancement
2011-09-03 12:02:41 -04:00
* prevents penalty for duplicate content by redirecting all incoming links to
2008-05-25 11:45:05 -04:00
* one or the other .
2007-12-25 15:48:47 -05:00
*
2015-12-09 22:06:30 -05:00
* Prevents redirection for feeds , trackbacks , searches , and
2013-07-08 16:27:06 -04:00
* admin URLs . Does not redirect on non - pretty - permalink - supporting IIS 7 + ,
Bootstrap/Load: Make handling the `/favicon.ico` requests more flexible.
Previously, `wp_favicon_request()` was introduced in [13205] to avoid a performance hit of serving a full 404 page on every favicon request.
While working as intended, that implementation did not provide a way for theme or plugin authors to manage the behavior of favicon requests.
This changeset implements the following logic (only applied if WordPress is installed in the root directory):
* If there is a Site Icon set in Customizer, redirect `/favicon.ico` requests to that icon.
* Otherwise, use the WordPress logo as a default icon.
* If a physical `/favicon.ico` file exists, do nothing, let the server handle the request.
Handling `/favicon.ico` is now more consistent with handling `/robots.txt` requests.
New functions and hooks:
* Introduce `is_favicon()` conditional tag to complement `is_robots()`.
* Introduce `do_favicon` action to complement `do_robots` and use it in template loader.
* Introduce `do_favicon()` function, hooked to the above action by default, to complement `do_robots()`.
* Introduce `do_faviconico` action to complement `do_robotstxt`, for plugins to override the default behavior.
* Mark `wp_favicon_request()` as deprecated in favor of `do_favicon()`.
Props jonoaldersonwp, birgire, joostdevalk, mukesh27, SergeyBiryukov.
Fixes #47398.
Built from https://develop.svn.wordpress.org/trunk@47018
git-svn-id: http://core.svn.wordpress.org/trunk@46818 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-12-28 16:20:04 -05:00
* page / post previews , WP admin , Trackbacks , robots . txt , favicon . ico , searches ,
* or on POST requests .
2007-12-25 15:48:47 -05:00
*
2008-05-25 11:45:05 -04:00
* Will also attempt to find the correct link when a user enters a URL that does
* not exist based on exact WordPress query . Will instead try to parse the URL
* or query in an attempt to figure the correct page to go to .
2007-12-25 15:48:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.3 . 0
2015-05-22 00:26:26 -04:00
*
2019-08-03 21:19:56 -04:00
* @ global WP_Rewrite $wp_rewrite WordPress rewrite component .
2019-08-03 21:59:56 -04:00
* @ global bool $is_IIS
* @ global WP_Query $wp_query WordPress Query object .
* @ global wpdb $wpdb WordPress database abstraction object .
* @ global WP $wp Current WordPress environment instance .
2007-12-25 15:48:47 -05:00
*
2008-05-25 11:45:05 -04:00
* @ param string $requested_url Optional . The URL that was requested , used to
2017-11-30 18:11:00 -05:00
* figure if redirect is needed .
2007-12-25 15:48:47 -05:00
* @ param bool $do_redirect Optional . Redirect to the new URL .
2015-05-24 01:40:25 -04:00
* @ return string | void The string of the URL , if redirect needed .
2007-12-25 15:48:47 -05:00
*/
2010-12-08 06:04:40 -05:00
function redirect_canonical ( $requested_url = null , $do_redirect = true ) {
2015-09-27 18:11:25 -04:00
global $wp_rewrite , $is_IIS , $wp_query , $wpdb , $wp ;
2007-08-16 23:45:59 -04:00
2020-04-04 23:02:11 -04:00
if ( isset ( $_SERVER [ 'REQUEST_METHOD' ] ) && ! in_array ( strtoupper ( $_SERVER [ 'REQUEST_METHOD' ] ), array ( 'GET' , 'HEAD' ), true ) ) {
2014-07-02 10:11:14 -04:00
return ;
}
2014-06-27 22:13:15 -04:00
// If we're not in wp-admin and the post has been published and preview nonce
2020-01-28 19:45:18 -05:00
// is non-existent or invalid then no need for preview in query.
2020-05-04 05:05:08 -04:00
if ( is_preview () && get_query_var ( 'p' ) && 'publish' === get_post_status ( get_query_var ( 'p' ) ) ) {
2014-06-27 22:13:15 -04:00
if ( ! isset ( $_GET [ 'preview_id' ] )
|| ! isset ( $_GET [ 'preview_nonce' ] )
2020-05-04 05:05:08 -04:00
|| ! wp_verify_nonce ( $_GET [ 'preview_nonce' ], 'post_preview_' . ( int ) $_GET [ 'preview_id' ] )
) {
2014-06-27 22:13:15 -04:00
$wp_query -> is_preview = false ;
}
}
2020-05-04 05:05:08 -04:00
if ( is_admin () || is_search () || is_preview () || is_trackback ()
|| is_robots () || is_favicon ()
|| ( $is_IIS && ! iis7_supports_permalinks () )
) {
2007-08-16 23:45:59 -04:00
return ;
2014-07-02 10:11:14 -04:00
}
2007-08-16 23:45:59 -04:00
2015-08-27 23:31:20 -04:00
if ( ! $requested_url && isset ( $_SERVER [ 'HTTP_HOST' ] ) ) {
2020-01-28 19:45:18 -05:00
// Build the URL in the address bar.
2010-02-26 01:21:47 -05:00
$requested_url = is_ssl () ? 'https://' : 'http://' ;
2007-09-11 17:21:40 -04:00
$requested_url .= $_SERVER [ 'HTTP_HOST' ];
$requested_url .= $_SERVER [ 'REQUEST_URI' ];
}
2007-08-16 23:45:59 -04:00
2020-04-24 03:28:10 -04:00
$original = parse_url ( $requested_url );
2015-10-01 01:09:50 -04:00
if ( false === $original ) {
2007-08-16 23:45:59 -04:00
return ;
2015-10-01 01:09:50 -04:00
}
2008-02-05 01:47:27 -05:00
2017-11-30 18:11:00 -05:00
$redirect = $original ;
2007-08-16 23:45:59 -04:00
$redirect_url = false ;
2020-01-28 19:45:18 -05:00
// Notice fixing.
2017-11-30 18:11:00 -05:00
if ( ! isset ( $redirect [ 'path' ] ) ) {
2010-03-28 02:05:50 -04:00
$redirect [ 'path' ] = '' ;
2017-11-30 18:11:00 -05:00
}
if ( ! isset ( $redirect [ 'query' ] ) ) {
2010-03-28 02:05:50 -04:00
$redirect [ 'query' ] = '' ;
2017-11-30 18:11:00 -05:00
}
2008-11-03 22:22:24 -05:00
2020-01-28 19:45:18 -05:00
/*
* If the original URL ended with non - breaking spaces , they were almost
* certainly inserted by accident . Let 's remove them, so the reader doesn' t
* see a 404 error with no obvious cause .
*/
2015-03-19 21:02:28 -04:00
$redirect [ 'path' ] = preg_replace ( '|(%C2%A0)+$|i' , '' , $redirect [ 'path' ] );
2020-01-28 19:45:18 -05:00
// It's not a preview, so remove it from URL.
2014-06-30 13:19:14 -04:00
if ( get_query_var ( 'preview' ) ) {
2014-06-27 22:13:15 -04:00
$redirect [ 'query' ] = remove_query_arg ( 'preview' , $redirect [ 'query' ] );
}
2020-05-04 05:05:08 -04:00
$post_id = get_query_var ( 'p' );
if ( is_feed () && $post_id ) {
$redirect_url = get_post_comments_feed_link ( $post_id , get_query_var ( 'feed' ) );
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2020-05-04 05:05:08 -04:00
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url (
$redirect [ 'query' ],
array ( 'p' , 'page_id' , 'attachment_id' , 'pagename' , 'name' , 'post_type' , 'feed' ),
$redirect_url
);
$redirect [ 'path' ] = parse_url ( $redirect_url , PHP_URL_PATH );
2012-04-07 01:02:45 -04:00
}
}
2020-05-04 05:05:08 -04:00
if ( is_singular () && $wp_query -> post_count < 1 && $post_id ) {
2008-09-07 21:50:08 -04:00
2020-05-04 05:05:08 -04:00
$vars = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT post_type, post_parent FROM $wpdb->posts WHERE ID = %d " , $post_id ) );
2008-09-07 21:50:08 -04:00
2019-07-02 19:42:58 -04:00
if ( ! empty ( $vars [ 0 ] ) ) {
$vars = $vars [ 0 ];
2020-05-04 05:05:08 -04:00
if ( 'revision' === $vars -> post_type && $vars -> post_parent > 0 ) {
$post_id = $vars -> post_parent ;
2017-11-30 18:11:00 -05:00
}
2008-09-07 21:50:08 -04:00
2020-05-04 05:05:08 -04:00
$redirect_url = get_permalink ( $post_id );
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2020-05-04 05:05:08 -04:00
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url (
$redirect [ 'query' ],
array ( 'p' , 'page_id' , 'attachment_id' , 'pagename' , 'name' , 'post_type' ),
$redirect_url
);
2017-11-30 18:11:00 -05:00
}
2008-09-07 21:50:08 -04:00
}
}
2020-01-28 19:45:18 -05:00
// These tests give us a WP-generated permalink.
2007-08-16 23:45:59 -04:00
if ( is_404 () ) {
2010-05-02 20:37:11 -04:00
2020-01-28 19:45:18 -05:00
// Redirect ?page_id, ?p=, ?attachment_id= to their respective URLs.
2020-05-04 05:05:08 -04:00
$post_id = max ( get_query_var ( 'p' ), get_query_var ( 'page_id' ), get_query_var ( 'attachment_id' ) );
$redirect_post = $post_id ? get_post ( $post_id ) : false ;
2019-07-02 19:42:58 -04:00
if ( $redirect_post ) {
2017-11-30 18:11:00 -05:00
$post_type_obj = get_post_type_object ( $redirect_post -> post_type );
2020-05-04 05:05:08 -04:00
if ( $post_type_obj -> public && 'auto-draft' !== $redirect_post -> post_status ) {
$redirect_url = get_permalink ( $redirect_post );
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url (
$redirect [ 'query' ],
array ( 'p' , 'page_id' , 'attachment_id' , 'pagename' , 'name' , 'post_type' ),
$redirect_url
);
2010-05-13 11:09:43 -04:00
}
}
2010-05-03 16:26:11 -04:00
2020-05-04 05:05:08 -04:00
$year = get_query_var ( 'year' );
$month = get_query_var ( 'monthnum' );
$day = get_query_var ( 'day' );
if ( $year && $month && $day ) {
$date = sprintf ( '%04d-%02d-%02d' , $year , $month , $day );
2013-09-06 12:36:09 -04:00
if ( ! wp_checkdate ( $month , $day , $year , $date ) ) {
2020-05-04 05:05:08 -04:00
$redirect_url = get_month_link ( $year , $month );
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url (
$redirect [ 'query' ],
array ( 'year' , 'monthnum' , 'day' ),
$redirect_url
);
2013-09-06 12:36:09 -04:00
}
2020-05-04 05:05:08 -04:00
} elseif ( $year && $month && $month > 12 ) {
$redirect_url = get_year_link ( $year );
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url (
$redirect [ 'query' ],
array ( 'year' , 'monthnum' ),
$redirect_url
);
2013-09-06 12:36:09 -04:00
}
2020-05-04 06:42:07 -04:00
// Strip off non-existing <!--nextpage--> links from single posts or pages.
if ( get_query_var ( 'page' ) ) {
$post_id = 0 ;
if ( $wp_query -> queried_object instanceof WP_Post ) {
$post_id = $wp_query -> queried_object -> ID ;
} elseif ( $wp_query -> post ) {
$post_id = $wp_query -> post -> ID ;
}
2020-05-04 06:49:07 -04:00
if ( $post_id ) {
$redirect_url = get_permalink ( $post_id );
2020-05-04 06:42:07 -04:00
2020-05-04 06:49:07 -04:00
$redirect [ 'path' ] = rtrim ( $redirect [ 'path' ], ( int ) get_query_var ( 'page' ) . '/' );
$redirect [ 'query' ] = remove_query_arg ( 'page' , $redirect [ 'query' ] );
}
2020-05-04 06:42:07 -04:00
}
2012-04-06 15:49:34 -04:00
if ( ! $redirect_url ) {
2019-07-02 19:42:58 -04:00
$redirect_url = redirect_guess_404_permalink ();
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2020-05-04 05:05:08 -04:00
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url (
$redirect [ 'query' ],
array ( 'page' , 'feed' , 'p' , 'page_id' , 'attachment_id' , 'pagename' , 'name' , 'post_type' ),
$redirect_url
);
2012-04-06 21:03:55 -04:00
}
2012-04-06 15:49:34 -04:00
}
2017-11-30 18:11:00 -05:00
} elseif ( is_object ( $wp_rewrite ) && $wp_rewrite -> using_permalinks () ) {
2020-05-04 05:05:08 -04:00
2020-01-28 19:45:18 -05:00
// Rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101.
2020-05-04 05:05:08 -04:00
if ( is_attachment ()
&& ! array_diff ( array_keys ( $wp -> query_vars ), array ( 'attachment' , 'attachment_id' ) )
&& ! $redirect_url
) {
2015-09-17 17:32:24 -04:00
if ( ! empty ( $_GET [ 'attachment_id' ] ) ) {
$redirect_url = get_attachment_link ( get_query_var ( 'attachment_id' ) );
2020-05-04 05:05:08 -04:00
2015-09-17 17:32:24 -04:00
if ( $redirect_url ) {
$redirect [ 'query' ] = remove_query_arg ( 'attachment_id' , $redirect [ 'query' ] );
}
} else {
$redirect_url = get_attachment_link ();
}
2017-11-30 18:11:00 -05:00
} elseif ( is_single () && ! empty ( $_GET [ 'p' ] ) && ! $redirect_url ) {
2019-07-02 19:42:58 -04:00
$redirect_url = get_permalink ( get_query_var ( 'p' ) );
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2017-11-30 18:11:00 -05:00
$redirect [ 'query' ] = remove_query_arg ( array ( 'p' , 'post_type' ), $redirect [ 'query' ] );
}
} elseif ( is_single () && ! empty ( $_GET [ 'name' ] ) && ! $redirect_url ) {
2019-07-02 19:42:58 -04:00
$redirect_url = get_permalink ( $wp_query -> get_queried_object_id () );
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2017-11-30 18:11:00 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'name' , $redirect [ 'query' ] );
}
} elseif ( is_page () && ! empty ( $_GET [ 'page_id' ] ) && ! $redirect_url ) {
2019-07-02 19:42:58 -04:00
$redirect_url = get_permalink ( get_query_var ( 'page_id' ) );
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2017-11-30 18:11:00 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'page_id' , $redirect [ 'query' ] );
}
2020-05-04 05:05:08 -04:00
} elseif ( is_page () && ! is_feed () && ! $redirect_url
&& 'page' === get_option ( 'show_on_front' ) && get_queried_object_id () === ( int ) get_option ( 'page_on_front' )
) {
2017-11-30 18:11:00 -05:00
$redirect_url = home_url ( '/' );
2020-05-04 05:05:08 -04:00
} elseif ( is_home () && ! empty ( $_GET [ 'page_id' ] ) && ! $redirect_url
&& 'page' === get_option ( 'show_on_front' ) && get_query_var ( 'page_id' ) === ( int ) get_option ( 'page_for_posts' )
) {
2019-07-02 19:42:58 -04:00
$redirect_url = get_permalink ( get_option ( 'page_for_posts' ) );
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2017-11-30 18:11:00 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'page_id' , $redirect [ 'query' ] );
}
} elseif ( ! empty ( $_GET [ 'm' ] ) && ( is_year () || is_month () || is_day () ) ) {
$m = get_query_var ( 'm' );
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
switch ( strlen ( $m ) ) {
2020-01-28 19:45:18 -05:00
case 4 : // Yearly.
2017-11-30 18:11:00 -05:00
$redirect_url = get_year_link ( $m );
2007-08-16 23:45:59 -04:00
break ;
2020-01-28 19:45:18 -05:00
case 6 : // Monthly.
2017-11-30 18:11:00 -05:00
$redirect_url = get_month_link ( substr ( $m , 0 , 4 ), substr ( $m , 4 , 2 ) );
2007-08-16 23:45:59 -04:00
break ;
2020-01-28 19:45:18 -05:00
case 8 : // Daily.
2017-11-30 18:11:00 -05:00
$redirect_url = get_day_link ( substr ( $m , 0 , 4 ), substr ( $m , 4 , 2 ), substr ( $m , 6 , 2 ) );
2007-08-16 23:45:59 -04:00
break ;
}
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( $redirect_url ) {
$redirect [ 'query' ] = remove_query_arg ( 'm' , $redirect [ 'query' ] );
}
2020-01-28 19:45:18 -05:00
// Now moving on to non ?m=X year/month/day links.
2020-05-04 05:05:08 -04:00
} elseif ( is_date () ) {
$year = get_query_var ( 'year' );
$month = get_query_var ( 'monthnum' );
$day = get_query_var ( 'day' );
if ( is_day () && $year && $month && ! empty ( $_GET [ 'day' ] ) ) {
$redirect_url = get_day_link ( $year , $month , $day );
if ( $redirect_url ) {
$redirect [ 'query' ] = remove_query_arg ( array ( 'year' , 'monthnum' , 'day' ), $redirect [ 'query' ] );
}
} elseif ( is_month () && $year && ! empty ( $_GET [ 'monthnum' ] ) ) {
$redirect_url = get_month_link ( $year , $month );
if ( $redirect_url ) {
$redirect [ 'query' ] = remove_query_arg ( array ( 'year' , 'monthnum' ), $redirect [ 'query' ] );
}
} elseif ( is_year () && ! empty ( $_GET [ 'year' ] ) ) {
$redirect_url = get_year_link ( $year );
if ( $redirect_url ) {
$redirect [ 'query' ] = remove_query_arg ( 'year' , $redirect [ 'query' ] );
}
2017-11-30 18:11:00 -05:00
}
} elseif ( is_author () && ! empty ( $_GET [ 'author' ] ) && preg_match ( '|^[0-9]+$|' , $_GET [ 'author' ] ) ) {
$author = get_userdata ( get_query_var ( 'author' ) );
2020-05-04 05:05:08 -04:00
if ( false !== $author
&& $wpdb -> get_var ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE $wpdb->posts .post_author = %d AND $wpdb->posts .post_status = 'publish' LIMIT 1 " , $author -> ID ) )
) {
2019-07-02 19:42:58 -04:00
$redirect_url = get_author_posts_url ( $author -> ID , $author -> user_nicename );
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $redirect_url ) {
2017-11-30 18:11:00 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'author' , $redirect [ 'query' ] );
}
2011-05-22 19:18:06 -04:00
}
2020-01-28 19:45:18 -05:00
} elseif ( is_category () || is_tag () || is_tax () ) { // Terms (tags/categories).
2010-02-27 21:49:01 -05:00
$term_count = 0 ;
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
foreach ( $wp_query -> tax_query -> queried_terms as $tax_query ) {
2010-09-14 07:34:40 -04:00
$term_count += count ( $tax_query [ 'terms' ] );
2017-11-30 18:11:00 -05:00
}
2007-08-16 23:45:59 -04:00
2010-02-16 04:08:26 -05:00
$obj = $wp_query -> get_queried_object ();
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $term_count <= 1 && ! empty ( $obj -> term_id ) ) {
$tax_url = get_term_link ( ( int ) $obj -> term_id , $obj -> taxonomy );
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( $tax_url && ! is_wp_error ( $tax_url ) ) {
if ( ! empty ( $redirect [ 'query' ] ) ) {
2020-01-28 19:45:18 -05:00
// Strip taxonomy query vars off the URL.
2019-07-02 19:42:58 -04:00
$qv_remove = array ( 'term' , 'taxonomy' );
2020-05-04 05:05:08 -04:00
2019-07-02 19:42:58 -04:00
if ( is_category () ) {
$qv_remove [] = 'category_name' ;
$qv_remove [] = 'cat' ;
} elseif ( is_tag () ) {
$qv_remove [] = 'tag' ;
$qv_remove [] = 'tag_id' ;
2020-01-28 19:45:18 -05:00
} else {
// Custom taxonomies will have a custom query var, remove those too.
2019-07-02 19:42:58 -04:00
$tax_obj = get_taxonomy ( $obj -> taxonomy );
if ( false !== $tax_obj -> query_var ) {
$qv_remove [] = $tax_obj -> query_var ;
}
2017-11-30 18:11:00 -05:00
}
2011-04-26 06:49:00 -04:00
2019-07-02 19:42:58 -04:00
$rewrite_vars = array_diff ( array_keys ( $wp_query -> query ), array_keys ( $_GET ) );
2011-05-31 02:13:27 -04:00
2020-01-28 19:45:18 -05:00
// Check to see if all the query vars are coming from the rewrite, none are set via $_GET.
if ( ! array_diff ( $rewrite_vars , array_keys ( $_GET ) ) ) {
// Remove all of the per-tax query vars.
$redirect [ 'query' ] = remove_query_arg ( $qv_remove , $redirect [ 'query' ] );
2011-05-31 02:13:27 -04:00
2020-01-28 19:45:18 -05:00
// Create the destination URL for this taxonomy.
2019-07-02 19:42:58 -04:00
$tax_url = parse_url ( $tax_url );
2020-05-04 05:05:08 -04:00
2020-01-28 19:45:18 -05:00
if ( ! empty ( $tax_url [ 'query' ] ) ) {
// Taxonomy accessible via ?taxonomy=...&term=... or any custom query var.
2019-07-02 19:42:58 -04:00
parse_str ( $tax_url [ 'query' ], $query_vars );
$redirect [ 'query' ] = add_query_arg ( $query_vars , $redirect [ 'query' ] );
2020-01-28 19:45:18 -05:00
} else {
// Taxonomy is accessible via a "pretty URL".
2019-07-02 19:42:58 -04:00
$redirect [ 'path' ] = $tax_url [ 'path' ];
}
2020-01-28 19:45:18 -05:00
} else {
// Some query vars are set via $_GET. Unset those from $_GET that exist via the rewrite.
2019-07-02 19:42:58 -04:00
foreach ( $qv_remove as $_qv ) {
if ( isset ( $rewrite_vars [ $_qv ] ) ) {
$redirect [ 'query' ] = remove_query_arg ( $_qv , $redirect [ 'query' ] );
}
2017-11-30 18:11:00 -05:00
}
2011-05-31 02:13:27 -04:00
}
2011-04-26 06:49:00 -04:00
}
2010-02-16 04:08:26 -05:00
}
2010-02-13 01:17:59 -05:00
}
2019-07-02 19:42:58 -04:00
} elseif ( is_single () && strpos ( $wp_rewrite -> permalink_structure , '%category%' ) !== false ) {
2020-05-04 05:05:08 -04:00
$category_name = get_query_var ( 'category_name' );
if ( $category_name ) {
$category = get_category_by_path ( $category_name );
if ( ! $category || is_wp_error ( $category )
|| ! has_term ( $category -> term_id , 'category' , $wp_query -> get_queried_object_id () )
) {
2019-07-02 19:42:58 -04:00
$redirect_url = get_permalink ( $wp_query -> get_queried_object_id () );
}
2016-04-20 11:35:27 -04:00
}
2010-02-13 01:17:59 -05:00
}
2020-05-04 05:05:08 -04:00
// Post paging.
2017-11-30 18:11:00 -05:00
if ( is_singular () && get_query_var ( 'page' ) ) {
2020-05-04 05:05:08 -04:00
$page = get_query_var ( 'page' );
2017-11-30 18:11:00 -05:00
if ( ! $redirect_url ) {
2012-04-07 01:18:50 -04:00
$redirect_url = get_permalink ( get_queried_object_id () );
2017-11-30 18:11:00 -05:00
}
2016-01-09 02:33:27 -05:00
if ( $page > 1 ) {
2020-05-04 05:05:08 -04:00
$redirect_url = trailingslashit ( $redirect_url );
2016-01-09 02:33:27 -05:00
if ( is_front_page () ) {
2020-05-04 05:05:08 -04:00
$redirect_url .= user_trailingslashit ( " $wp_rewrite->pagination_base / $page " , 'paged' );
2016-01-09 02:33:27 -05:00
} else {
2020-05-04 05:05:08 -04:00
$redirect_url .= user_trailingslashit ( $page , 'single_paged' );
2016-01-09 02:33:27 -05:00
}
}
2020-05-04 05:05:08 -04:00
$redirect [ 'query' ] = remove_query_arg ( 'page' , $redirect [ 'query' ] );
2010-10-04 07:30:11 -04:00
}
2020-05-04 05:05:08 -04:00
// Paging and feeds.
2017-11-30 18:11:00 -05:00
if ( get_query_var ( 'paged' ) || is_feed () || get_query_var ( 'cpage' ) ) {
2020-05-04 05:05:08 -04:00
$paged = get_query_var ( 'paged' );
$feed = get_query_var ( 'feed' );
$cpage = get_query_var ( 'cpage' );
while ( preg_match ( " #/ $wp_rewrite->pagination_base /?[0-9]+?(/+)? $ # " , $redirect [ 'path' ] )
|| preg_match ( '#/(comments/?)?(feed|rss2?|rdf|atom)(/+)?$#' , $redirect [ 'path' ] )
|| preg_match ( " #/ { $wp_rewrite -> comments_pagination_base } -[0-9]+(/+)? $ # " , $redirect [ 'path' ] )
) {
// Strip off any existing paging.
$redirect [ 'path' ] = preg_replace ( " #/ $wp_rewrite->pagination_base /?[0-9]+?(/+)? $ # " , '/' , $redirect [ 'path' ] );
// Strip off feed endings.
$redirect [ 'path' ] = preg_replace ( '#/(comments/?)?(feed|rss2?|rdf|atom)(/+|$)#' , '/' , $redirect [ 'path' ] );
// Strip off any existing comment paging.
$redirect [ 'path' ] = preg_replace ( " #/ { $wp_rewrite -> comments_pagination_base } -[0-9]+?(/+)? $ # " , '/' , $redirect [ 'path' ] );
}
$addl_path = '' ;
$default_feed = get_default_feed ();
if ( is_feed () && in_array ( $feed , $wp_rewrite -> feeds , true ) ) {
2017-11-30 18:11:00 -05:00
$addl_path = ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ;
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! is_singular () && get_query_var ( 'withcomments' ) ) {
2008-11-25 16:28:42 -05:00
$addl_path .= 'comments/' ;
2017-11-30 18:11:00 -05:00
}
2020-05-04 05:05:08 -04:00
if ( ( 'rss' === $default_feed && 'feed' === $feed ) || 'rss' === $feed ) {
$format = ( 'rss2' === $default_feed ) ? '' : 'rss2' ;
2017-11-30 18:11:00 -05:00
} else {
2020-05-04 05:05:08 -04:00
$format = ( $default_feed === $feed || 'feed' === $feed ) ? '' : $feed ;
2017-11-30 18:11:00 -05:00
}
2020-05-04 05:05:08 -04:00
$addl_path .= user_trailingslashit ( 'feed/' . $format , 'feed' );
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'feed' , $redirect [ 'query' ] );
2020-05-04 05:05:08 -04:00
} elseif ( is_feed () && 'old' === $feed ) {
2011-08-11 21:41:23 -04:00
$old_feed_files = array (
'wp-atom.php' => 'atom' ,
'wp-commentsrss2.php' => 'comments_rss2' ,
2020-05-04 05:05:08 -04:00
'wp-feed.php' => $default_feed ,
2011-11-20 13:32:42 -05:00
'wp-rdf.php' => 'rdf' ,
2011-08-11 21:41:23 -04:00
'wp-rss.php' => 'rss2' ,
'wp-rss2.php' => 'rss2' ,
);
2020-05-04 05:05:08 -04:00
2011-08-11 21:41:23 -04:00
if ( isset ( $old_feed_files [ basename ( $redirect [ 'path' ] ) ] ) ) {
$redirect_url = get_feed_link ( $old_feed_files [ basename ( $redirect [ 'path' ] ) ] );
2020-05-04 05:05:08 -04:00
2011-08-11 21:41:23 -04:00
wp_redirect ( $redirect_url , 301 );
die ();
}
2008-10-14 01:51:01 -04:00
}
2020-05-04 05:05:08 -04:00
if ( $paged > 0 ) {
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'paged' , $redirect [ 'query' ] );
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! is_feed () ) {
2020-05-04 05:05:08 -04:00
if ( ! is_single () ) {
2017-11-30 18:11:00 -05:00
$addl_path = ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ;
2020-05-04 05:05:08 -04:00
if ( $paged > 1 ) {
$addl_path .= user_trailingslashit ( " $wp_rewrite->pagination_base / $paged " , 'paged' );
}
2008-11-14 17:48:22 -05:00
}
} elseif ( $paged > 1 ) {
$redirect [ 'query' ] = add_query_arg ( 'paged' , $paged , $redirect [ 'query' ] );
2007-08-29 17:06:51 -04:00
}
2007-08-16 23:45:59 -04:00
}
2008-11-14 17:48:22 -05:00
2020-05-04 05:05:08 -04:00
$default_comments_page = get_option ( 'default_comments_page' );
if ( get_option ( 'page_comments' )
&& ( 'newest' === $default_comments_page && $cpage > 0
|| 'newest' !== $default_comments_page && $cpage > 1 )
) {
$addl_path = ( ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' );
$addl_path .= user_trailingslashit ( $wp_rewrite -> comments_pagination_base . '-' . $cpage , 'commentpaged' );
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'cpage' , $redirect [ 'query' ] );
2008-10-23 14:55:22 -04:00
}
2008-11-14 17:48:22 -05:00
2020-05-04 05:05:08 -04:00
// Strip off trailing /index.php/.
$redirect [ 'path' ] = preg_replace ( '|/' . preg_quote ( $wp_rewrite -> index , '|' ) . '/?$|' , '/' , $redirect [ 'path' ] );
$redirect [ 'path' ] = user_trailingslashit ( $redirect [ 'path' ] );
if ( ! empty ( $addl_path )
&& $wp_rewrite -> using_index_permalinks ()
&& strpos ( $redirect [ 'path' ], '/' . $wp_rewrite -> index . '/' ) === false
) {
2017-11-30 18:11:00 -05:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ] ) . $wp_rewrite -> index . '/' ;
}
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $addl_path ) ) {
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ] ) . $addl_path ;
}
2020-05-04 05:05:08 -04:00
2010-12-14 11:55:35 -05:00
$redirect_url = $redirect [ 'scheme' ] . '://' . $redirect [ 'host' ] . $redirect [ 'path' ];
2007-08-16 23:45:59 -04:00
}
2012-04-25 16:49:57 -04:00
2020-05-04 05:05:08 -04:00
if ( 'wp-register.php' === basename ( $redirect [ 'path' ] ) ) {
2014-04-25 03:12:14 -04:00
if ( is_multisite () ) {
2013-10-24 18:59:20 -04:00
/** This filter is documented in wp-login.php */
2012-09-11 08:27:25 -04:00
$redirect_url = apply_filters ( 'wp_signup_location' , network_site_url ( 'wp-signup.php' ) );
2014-04-25 03:12:14 -04:00
} else {
2015-09-15 13:11:35 -04:00
$redirect_url = wp_registration_url ();
2014-04-25 03:12:14 -04:00
}
2012-04-25 16:49:57 -04:00
wp_redirect ( $redirect_url , 301 );
die ();
}
2007-08-16 23:45:59 -04:00
}
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = preg_replace ( '#^\??&*?#' , '' , $redirect [ 'query' ] );
2020-05-04 05:05:08 -04:00
// Tack on any additional query vars.
2017-11-30 18:11:00 -05:00
if ( $redirect_url && ! empty ( $redirect [ 'query' ] ) ) {
2010-12-17 15:23:34 -05:00
parse_str ( $redirect [ 'query' ], $_parsed_query );
2020-04-24 03:28:10 -04:00
$redirect = parse_url ( $redirect_url );
2010-12-17 15:57:03 -05:00
if ( ! empty ( $_parsed_query [ 'name' ] ) && ! empty ( $redirect [ 'query' ] ) ) {
parse_str ( $redirect [ 'query' ], $_parsed_redirect_query );
2017-11-30 18:11:00 -05:00
if ( empty ( $_parsed_redirect_query [ 'name' ] ) ) {
2010-12-17 15:57:03 -05:00
unset ( $_parsed_query [ 'name' ] );
2017-11-30 18:11:00 -05:00
}
2010-12-17 15:57:03 -05:00
}
2019-04-07 21:10:55 -04:00
$_parsed_query = array_combine (
rawurlencode_deep ( array_keys ( $_parsed_query ) ),
rawurlencode_deep ( array_values ( $_parsed_query ) )
);
2020-05-04 05:05:08 -04:00
$redirect_url = add_query_arg ( $_parsed_query , $redirect_url );
2007-09-13 15:12:53 -04:00
}
2007-08-16 23:45:59 -04:00
2017-11-30 18:11:00 -05:00
if ( $redirect_url ) {
2020-04-24 03:28:10 -04:00
$redirect = parse_url ( $redirect_url );
2017-11-30 18:11:00 -05:00
}
2007-08-16 23:45:59 -04:00
2020-01-28 19:45:18 -05:00
// www.example.com vs. example.com
2020-04-24 03:28:10 -04:00
$user_home = parse_url ( home_url () );
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $user_home [ 'host' ] ) ) {
2008-05-09 14:23:05 -04:00
$redirect [ 'host' ] = $user_home [ 'host' ];
2017-11-30 18:11:00 -05:00
}
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( empty ( $user_home [ 'path' ] ) ) {
2008-10-14 17:08:28 -04:00
$user_home [ 'path' ] = '/' ;
2017-11-30 18:11:00 -05:00
}
2007-08-16 23:45:59 -04:00
2020-01-28 19:45:18 -05:00
// Handle ports.
2017-11-30 18:11:00 -05:00
if ( ! empty ( $user_home [ 'port' ] ) ) {
2007-09-13 15:24:05 -04:00
$redirect [ 'port' ] = $user_home [ 'port' ];
2017-11-30 18:11:00 -05:00
} else {
unset ( $redirect [ 'port' ] );
}
2007-09-13 15:24:05 -04:00
2020-01-28 19:45:18 -05:00
// Trailing /index.php.
2017-11-30 18:11:00 -05:00
$redirect [ 'path' ] = preg_replace ( '|/' . preg_quote ( $wp_rewrite -> index , '|' ) . '/*?$|' , '/' , $redirect [ 'path' ] );
$punctuation_pattern = implode (
2018-08-16 21:51:36 -04:00
'|' ,
array_map (
'preg_quote' ,
array (
2017-11-30 18:11:00 -05:00
' ' ,
2020-01-28 19:45:18 -05:00
'%20' , // Space.
2017-11-30 18:11:00 -05:00
'!' ,
2020-01-28 19:45:18 -05:00
'%21' , // Exclamation mark.
2017-11-30 18:11:00 -05:00
'"' ,
2020-01-28 19:45:18 -05:00
'%22' , // Double quote.
2017-11-30 18:11:00 -05:00
" ' " ,
2020-01-28 19:45:18 -05:00
'%27' , // Single quote.
2017-11-30 18:11:00 -05:00
'(' ,
2020-01-28 19:45:18 -05:00
'%28' , // Opening bracket.
2017-11-30 18:11:00 -05:00
')' ,
2020-01-28 19:45:18 -05:00
'%29' , // Closing bracket.
2017-11-30 18:11:00 -05:00
',' ,
2020-01-28 19:45:18 -05:00
'%2C' , // Comma.
2017-11-30 18:11:00 -05:00
'.' ,
2020-01-28 19:45:18 -05:00
'%2E' , // Period.
2017-11-30 18:11:00 -05:00
';' ,
2020-01-28 19:45:18 -05:00
'%3B' , // Semicolon.
2017-11-30 18:11:00 -05:00
'{' ,
2020-01-28 19:45:18 -05:00
'%7B' , // Opening curly bracket.
2017-11-30 18:11:00 -05:00
'}' ,
2020-01-28 19:45:18 -05:00
'%7D' , // Closing curly bracket.
'%E2%80%9C' , // Opening curly quote.
'%E2%80%9D' , // Closing curly quote.
2017-11-30 18:11:00 -05:00
)
)
);
2017-10-24 10:18:48 -04:00
// Remove trailing spaces and end punctuation from the path.
$redirect [ 'path' ] = preg_replace ( " #( $punctuation_pattern )+ $ # " , '' , $redirect [ 'path' ] );
2008-08-18 23:21:12 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $redirect [ 'query' ] ) ) {
2017-10-24 10:18:48 -04:00
// Remove trailing spaces and end punctuation from certain terminating query string args.
2020-02-02 19:14:07 -05:00
$redirect [ 'query' ] = preg_replace ( " #((^|&)(p|page_id|cat|tag)=[^&]*?)( $punctuation_pattern )+ $ # " , '$1' , $redirect [ 'query' ] );
2008-08-18 23:21:12 -04:00
2020-01-28 19:45:18 -05:00
// Clean up empty query strings.
2017-11-30 18:11:00 -05:00
$redirect [ 'query' ] = trim ( preg_replace ( '#(^|&)(p|page_id|cat|tag)=?(&|$)#' , '&' , $redirect [ 'query' ] ), '&' );
2008-11-12 15:09:16 -05:00
2020-01-28 19:45:18 -05:00
// Redirect obsolete feeds.
2013-06-22 08:09:28 -04:00
$redirect [ 'query' ] = preg_replace ( '#(^|&)feed=rss(&|$)#' , '$1feed=rss2$2' , $redirect [ 'query' ] );
2011-08-11 19:30:59 -04:00
2020-01-28 19:45:18 -05:00
// Remove redundant leading ampersands.
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = preg_replace ( '#^\??&*?#' , '' , $redirect [ 'query' ] );
2008-08-25 17:50:11 -04:00
}
2008-08-18 23:21:12 -04:00
2020-01-28 19:45:18 -05:00
// Strip /index.php/ when we're not using PATHINFO permalinks.
2017-11-30 18:11:00 -05:00
if ( ! $wp_rewrite -> using_index_permalinks () ) {
2013-01-18 08:44:22 -05:00
$redirect [ 'path' ] = str_replace ( '/' . $wp_rewrite -> index . '/' , '/' , $redirect [ 'path' ] );
2017-11-30 18:11:00 -05:00
}
2007-08-16 23:45:59 -04:00
2020-01-28 19:45:18 -05:00
// Trailing slashes.
2020-05-04 05:05:08 -04:00
if ( is_object ( $wp_rewrite ) && $wp_rewrite -> using_permalinks ()
&& ! is_404 () && ( ! is_front_page () || is_front_page () && get_query_var ( 'paged' ) > 1 )
) {
2007-08-29 17:06:51 -04:00
$user_ts_type = '' ;
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( get_query_var ( 'paged' ) > 0 ) {
2007-08-29 17:06:51 -04:00
$user_ts_type = 'paged' ;
} else {
2017-11-30 18:11:00 -05:00
foreach ( array ( 'single' , 'category' , 'page' , 'day' , 'month' , 'year' , 'home' ) as $type ) {
2007-08-29 17:06:51 -04:00
$func = 'is_' . $type ;
2017-11-30 18:11:00 -05:00
if ( call_user_func ( $func ) ) {
2007-08-29 17:06:51 -04:00
$user_ts_type = $type ;
break ;
}
}
2008-08-08 13:43:44 -04:00
}
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
$redirect [ 'path' ] = user_trailingslashit ( $redirect [ 'path' ], $user_ts_type );
2008-10-16 17:14:42 -04:00
} elseif ( is_front_page () ) {
2017-11-30 18:11:00 -05:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ] );
2007-08-29 17:06:51 -04:00
}
2020-01-28 19:45:18 -05:00
// Strip multiple slashes out of the URL.
2017-11-30 18:11:00 -05:00
if ( strpos ( $redirect [ 'path' ], '//' ) > - 1 ) {
$redirect [ 'path' ] = preg_replace ( '|/+|' , '/' , $redirect [ 'path' ] );
}
2010-02-12 19:11:23 -05:00
2020-01-28 19:45:18 -05:00
// Always trailing slash the Front Page URL.
2020-05-04 05:05:08 -04:00
if ( trailingslashit ( $redirect [ 'path' ] ) === trailingslashit ( $user_home [ 'path' ] ) ) {
2017-11-30 18:11:00 -05:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ] );
}
2007-09-11 17:21:40 -04:00
2020-05-04 05:05:08 -04:00
$original_host_low = strtolower ( $original [ 'host' ] );
$redirect_host_low = strtolower ( $redirect [ 'host' ] );
2020-01-28 19:45:18 -05:00
// Ignore differences in host capitalization, as this can lead to infinite redirects.
// Only redirect no-www <=> yes-www.
2020-05-04 05:05:08 -04:00
if ( $original_host_low === $redirect_host_low
|| ( 'www.' . $original_host_low !== $redirect_host_low
&& 'www.' . $redirect_host_low !== $original_host_low )
) {
2007-09-12 16:44:41 -04:00
$redirect [ 'host' ] = $original [ 'host' ];
2017-11-30 18:11:00 -05:00
}
2007-09-12 16:44:41 -04:00
2014-10-29 14:37:25 -04:00
$compare_original = array ( $original [ 'host' ], $original [ 'path' ] );
2008-08-08 13:05:10 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $original [ 'port' ] ) ) {
2008-08-08 13:05:10 -04:00
$compare_original [] = $original [ 'port' ];
2017-11-30 18:11:00 -05:00
}
2008-08-08 13:05:10 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $original [ 'query' ] ) ) {
2008-08-08 13:05:10 -04:00
$compare_original [] = $original [ 'query' ];
2017-11-30 18:11:00 -05:00
}
2008-08-08 13:05:10 -04:00
2014-10-29 14:37:25 -04:00
$compare_redirect = array ( $redirect [ 'host' ], $redirect [ 'path' ] );
2008-08-08 13:05:10 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $redirect [ 'port' ] ) ) {
2008-08-08 13:05:10 -04:00
$compare_redirect [] = $redirect [ 'port' ];
2017-11-30 18:11:00 -05:00
}
2008-08-08 13:05:10 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $redirect [ 'query' ] ) ) {
2008-08-08 13:05:10 -04:00
$compare_redirect [] = $redirect [ 'query' ];
2017-11-30 18:11:00 -05:00
}
2008-08-08 13:05:10 -04:00
if ( $compare_original !== $compare_redirect ) {
2007-09-13 15:24:05 -04:00
$redirect_url = $redirect [ 'scheme' ] . '://' . $redirect [ 'host' ];
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $redirect [ 'port' ] ) ) {
2008-10-27 12:31:26 -04:00
$redirect_url .= ':' . $redirect [ 'port' ];
2017-11-30 18:11:00 -05:00
}
2020-05-04 05:05:08 -04:00
2007-09-13 15:24:05 -04:00
$redirect_url .= $redirect [ 'path' ];
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! empty ( $redirect [ 'query' ] ) ) {
2007-08-29 17:06:51 -04:00
$redirect_url .= '?' . $redirect [ 'query' ];
2017-11-30 18:11:00 -05:00
}
2007-08-16 23:45:59 -04:00
}
2020-05-04 05:05:08 -04:00
if ( ! $redirect_url || $redirect_url === $requested_url ) {
2015-05-21 16:30:25 -04:00
return ;
}
2010-10-21 15:55:28 -04:00
2010-10-19 03:48:22 -04:00
// Hex encoded octets are case-insensitive.
2017-11-30 18:11:00 -05:00
if ( false !== strpos ( $requested_url , '%' ) ) {
if ( ! function_exists ( 'lowercase_octets' ) ) {
2016-07-19 15:32:32 -04:00
/**
* Converts the first hex - encoded octet match to lowercase .
*
2016-07-19 15:34:29 -04:00
* @ since 3.1 . 0
2016-07-19 15:32:32 -04:00
* @ ignore
*
* @ param array $matches Hex - encoded octet matches for the requested URL .
* @ return string Lowercased version of the first match .
*/
2017-11-30 18:11:00 -05:00
function lowercase_octets ( $matches ) {
2010-10-19 03:48:22 -04:00
return strtolower ( $matches [ 0 ] );
}
2010-07-18 09:46:35 -04:00
}
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
$requested_url = preg_replace_callback ( '|%[a-fA-F0-9][a-fA-F0-9]|' , 'lowercase_octets' , $requested_url );
2010-07-18 09:46:35 -04:00
}
2013-09-20 19:31:10 -04:00
/**
2016-05-22 14:50:28 -04:00
* Filters the canonical redirect URL .
2013-09-20 19:31:10 -04:00
*
* Returning false to this filter will cancel the redirect .
*
* @ since 2.3 . 0
*
* @ param string $redirect_url The redirect URL .
* @ param string $requested_url The requested URL .
*/
$redirect_url = apply_filters ( 'redirect_canonical' , $redirect_url , $requested_url );
2008-02-06 17:57:15 -05:00
2020-01-28 19:45:18 -05:00
// Yes, again -- in case the filter aborted the request.
2020-05-04 05:05:08 -04:00
if ( ! $redirect_url || strip_fragment_from_url ( $redirect_url ) === strip_fragment_from_url ( $requested_url ) ) {
2015-05-21 16:30:25 -04:00
return ;
}
2008-02-06 17:57:15 -05:00
if ( $do_redirect ) {
2020-01-28 19:45:18 -05:00
// Protect against chained redirects.
2017-11-30 18:11:00 -05:00
if ( ! redirect_canonical ( $redirect_url , false ) ) {
wp_redirect ( $redirect_url , 301 );
2008-02-06 17:57:15 -05:00
exit ();
2007-09-11 17:21:40 -04:00
} else {
2020-01-28 19:45:18 -05:00
// Debug.
2008-10-14 01:51:01 -04:00
// die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) );
2015-05-21 16:30:25 -04:00
return ;
2007-09-11 17:21:40 -04:00
}
} else {
2008-02-06 17:57:15 -05:00
return $redirect_url ;
2007-08-16 23:45:59 -04:00
}
}
2012-04-06 21:03:55 -04:00
/**
* Removes arguments from a query string if they are not present in a URL
* DO NOT use this in plugin code .
*
2013-12-24 13:57:12 -05:00
* @ since 3.4 . 0
2012-04-06 21:03:55 -04:00
* @ access private
*
2014-11-30 20:34:24 -05:00
* @ param string $query_string
* @ param array $args_to_check
* @ param string $url
2012-04-06 21:03:55 -04:00
* @ return string The altered query string
*/
2017-11-30 18:11:00 -05:00
function _remove_qs_args_if_not_in_url ( $query_string , array $args_to_check , $url ) {
2020-04-24 03:28:10 -04:00
$parsed_url = parse_url ( $url );
2020-05-04 05:05:08 -04:00
2012-05-01 14:26:38 -04:00
if ( ! empty ( $parsed_url [ 'query' ] ) ) {
parse_str ( $parsed_url [ 'query' ], $parsed_query );
2020-05-04 05:05:08 -04:00
2012-05-01 14:26:38 -04:00
foreach ( $args_to_check as $qv ) {
2017-11-30 18:11:00 -05:00
if ( ! isset ( $parsed_query [ $qv ] ) ) {
2012-05-01 14:26:38 -04:00
$query_string = remove_query_arg ( $qv , $query_string );
2017-11-30 18:11:00 -05:00
}
2012-05-01 14:26:38 -04:00
}
} else {
$query_string = remove_query_arg ( $args_to_check , $query_string );
2012-04-06 21:03:55 -04:00
}
2020-05-04 05:05:08 -04:00
2012-04-06 21:03:55 -04:00
return $query_string ;
}
2015-12-04 18:11:26 -05:00
/**
* Strips the #fragment from a URL, if one is present.
*
* @ since 4.4 . 0
*
* @ param string $url The URL to strip .
* @ return string The altered URL .
*/
function strip_fragment_from_url ( $url ) {
2020-04-24 03:28:10 -04:00
$parsed_url = parse_url ( $url );
2020-05-04 05:05:08 -04:00
2015-12-04 18:11:26 -05:00
if ( ! empty ( $parsed_url [ 'host' ] ) ) {
// This mirrors code in redirect_canonical(). It does not handle every case.
$url = $parsed_url [ 'scheme' ] . '://' . $parsed_url [ 'host' ];
if ( ! empty ( $parsed_url [ 'port' ] ) ) {
$url .= ':' . $parsed_url [ 'port' ];
}
2017-08-16 17:11:43 -04:00
if ( ! empty ( $parsed_url [ 'path' ] ) ) {
$url .= $parsed_url [ 'path' ];
}
2015-12-04 18:11:26 -05:00
if ( ! empty ( $parsed_url [ 'query' ] ) ) {
$url .= '?' . $parsed_url [ 'query' ];
}
}
return $url ;
}
2007-12-25 15:48:47 -05:00
/**
2012-06-25 16:41:14 -04:00
* Attempts to guess the correct URL based on query vars
2007-12-25 15:48:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.3 . 0
2014-10-31 13:56:22 -04:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2007-12-25 15:48:47 -05:00
*
2020-01-11 13:32:05 -05:00
* @ return string | false The correct URL if one is found . False on failure .
2007-12-25 15:48:47 -05:00
*/
2012-06-25 16:41:14 -04:00
function redirect_guess_404_permalink () {
2015-09-22 16:27:25 -04:00
global $wpdb ;
2012-01-28 15:40:55 -05:00
2017-11-30 18:11:00 -05:00
if ( get_query_var ( 'name' ) ) {
$where = $wpdb -> prepare ( 'post_name LIKE %s' , $wpdb -> esc_like ( get_query_var ( 'name' ) ) . '%' );
2012-01-28 15:40:55 -05:00
2020-01-28 19:45:18 -05:00
// If any of post_type, year, monthnum, or day are set, use them to refine the query.
2017-11-30 18:11:00 -05:00
if ( get_query_var ( 'post_type' ) ) {
$where .= $wpdb -> prepare ( ' AND post_type = %s' , get_query_var ( 'post_type' ) );
} else {
2012-05-02 13:39:43 -04:00
$where .= " AND post_type IN (' " . implode ( " ', ' " , get_post_types ( array ( 'public' => true ) ) ) . " ') " ;
2017-11-30 18:11:00 -05:00
}
2012-05-02 13:39:43 -04:00
2017-11-30 18:11:00 -05:00
if ( get_query_var ( 'year' ) ) {
$where .= $wpdb -> prepare ( ' AND YEAR(post_date) = %d' , get_query_var ( 'year' ) );
}
if ( get_query_var ( 'monthnum' ) ) {
$where .= $wpdb -> prepare ( ' AND MONTH(post_date) = %d' , get_query_var ( 'monthnum' ) );
}
if ( get_query_var ( 'day' ) ) {
$where .= $wpdb -> prepare ( ' AND DAYOFMONTH(post_date) = %d' , get_query_var ( 'day' ) );
}
2012-01-28 15:40:55 -05:00
2020-05-04 05:05:08 -04:00
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
2017-11-30 18:11:00 -05:00
$post_id = $wpdb -> get_var ( " SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish' " );
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! $post_id ) {
2012-01-28 15:40:55 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( get_query_var ( 'feed' ) ) {
2012-04-07 01:39:08 -04:00
return get_post_comments_feed_link ( $post_id , get_query_var ( 'feed' ) );
2020-05-04 05:05:08 -04:00
} elseif ( get_query_var ( 'page' ) > 1 ) {
2012-04-07 01:39:08 -04:00
return trailingslashit ( get_permalink ( $post_id ) ) . user_trailingslashit ( get_query_var ( 'page' ), 'single_paged' );
2017-11-30 18:11:00 -05:00
} else {
2012-04-07 01:39:08 -04:00
return get_permalink ( $post_id );
2017-11-30 18:11:00 -05:00
}
2012-01-28 15:40:55 -05:00
}
2007-08-16 23:45:59 -04:00
2012-01-28 15:40:55 -05:00
return false ;
2007-08-16 23:45:59 -04:00
}
2015-05-22 00:26:26 -04:00
/**
2015-12-18 18:08:26 -05:00
* Redirects a variety of shorthand URLs to the admin .
*
* If a user visits example . com / admin , they ' ll be redirected to / wp - admin .
* Visiting / login redirects to / wp - login . php , and so on .
*
* @ since 3.4 . 0
2015-05-22 00:26:26 -04:00
*
2019-08-03 21:19:56 -04:00
* @ global WP_Rewrite $wp_rewrite WordPress rewrite component .
2015-05-22 00:26:26 -04:00
*/
2012-02-08 15:11:52 -05:00
function wp_redirect_admin_locations () {
global $wp_rewrite ;
2020-05-04 05:05:08 -04:00
2017-11-30 18:11:00 -05:00
if ( ! ( is_404 () && $wp_rewrite -> using_permalinks () ) ) {
2012-02-08 15:11:52 -05:00
return ;
2017-11-30 18:11:00 -05:00
}
2012-02-08 15:11:52 -05:00
$admins = array (
home_url ( 'wp-admin' , 'relative' ),
home_url ( 'dashboard' , 'relative' ),
home_url ( 'admin' , 'relative' ),
site_url ( 'dashboard' , 'relative' ),
site_url ( 'admin' , 'relative' ),
);
2020-05-04 05:05:08 -04:00
2020-04-04 23:02:11 -04:00
if ( in_array ( untrailingslashit ( $_SERVER [ 'REQUEST_URI' ] ), $admins , true ) ) {
2012-02-08 15:11:52 -05:00
wp_redirect ( admin_url () );
exit ;
}
$logins = array (
home_url ( 'wp-login.php' , 'relative' ),
home_url ( 'login' , 'relative' ),
site_url ( 'login' , 'relative' ),
);
2020-05-04 05:05:08 -04:00
2020-04-04 23:02:11 -04:00
if ( in_array ( untrailingslashit ( $_SERVER [ 'REQUEST_URI' ] ), $logins , true ) ) {
2015-09-15 13:11:35 -04:00
wp_redirect ( wp_login_url () );
2012-02-08 15:11:52 -05:00
exit ;
}
}