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
*
2008-05-25 11:45:05 -04:00
* Prevents redirection for feeds , trackbacks , searches , comment popup , and
* admin URLs . Does not redirect on IIS , page / post previews , and on form data .
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
2007-12-25 15:48:47 -05:00
* @ uses $wp_rewrite
* @ uses $is_IIS
*
2008-05-25 11:45:05 -04:00
* @ param string $requested_url Optional . The URL that was requested , used to
* figure if redirect is needed .
2007-12-25 15:48:47 -05:00
* @ param bool $do_redirect Optional . Redirect to the new URL .
2008-05-25 11:45:05 -04:00
* @ return null | false | string Null , if redirect not needed . False , if redirect
* not needed or the string of the URL
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 ) {
2011-03-02 10:33:11 -05:00
global $wp_rewrite , $is_IIS , $wp_query , $wpdb ;
2007-08-16 23:45:59 -04:00
2011-03-02 10:33:11 -05:00
if ( is_trackback () || is_search () || is_comments_popup () || is_admin () || ! empty ( $_POST ) || is_preview () || is_robots () || $is_IIS )
2007-08-16 23:45:59 -04:00
return ;
2007-09-11 17:21:40 -04:00
if ( ! $requested_url ) {
// 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
$original = @ parse_url ( $requested_url );
if ( false === $original )
return ;
2007-09-20 16:25:43 -04:00
// Some PHP setups turn requests for / into /index.php in REQUEST_URI
2008-10-16 15:17:04 -04:00
// See: http://trac.wordpress.org/ticket/5017
// See: http://trac.wordpress.org/ticket/7173
// Disabled, for now:
// $original['path'] = preg_replace('|/index\.php$|', '/', $original['path']);
2008-02-05 01:47:27 -05:00
2007-08-16 23:45:59 -04:00
$redirect = $original ;
$redirect_url = false ;
2008-11-03 22:22:24 -05:00
// Notice fixing
2010-03-28 02:05:50 -04:00
if ( ! isset ( $redirect [ 'path' ]) )
$redirect [ 'path' ] = '' ;
if ( ! isset ( $redirect [ 'query' ]) )
$redirect [ 'query' ] = '' ;
2008-11-03 22:22:24 -05:00
2012-04-07 01:02:45 -04:00
if ( is_feed () && ( $id = get_query_var ( 'p' ) ) ) {
if ( $redirect_url = get_post_comments_feed_link ( $id , get_query_var ( 'feed' ) ) ) {
$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 );
}
}
2008-09-07 21:50:08 -04:00
if ( is_singular () && 1 > $wp_query -> post_count && ( $id = get_query_var ( 'p' )) ) {
$vars = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT post_type, post_parent FROM $wpdb->posts WHERE ID = %d " , $id ) );
if ( isset ( $vars [ 0 ]) && $vars = $vars [ 0 ] ) {
if ( 'revision' == $vars -> post_type && $vars -> post_parent > 0 )
$id = $vars -> post_parent ;
if ( $redirect_url = get_permalink ( $id ) )
2012-04-06 21:03:55 -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 );
2008-09-07 21:50:08 -04:00
}
}
2007-08-16 23:45:59 -04:00
// These tests give us a WP-generated permalink
if ( is_404 () ) {
2010-05-02 20:37:11 -04:00
// Redirect ?page_id, ?p=, ?attachment_id= to their respective url's
2010-05-13 11:09:43 -04:00
$id = max ( get_query_var ( 'p' ), get_query_var ( 'page_id' ), get_query_var ( 'attachment_id' ) );
if ( $id && $redirect_post = get_post ( $id ) ) {
$post_type_obj = get_post_type_object ( $redirect_post -> post_type );
if ( $post_type_obj -> public ) {
$redirect_url = get_permalink ( $redirect_post );
2012-04-06 21:03:55 -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 );
2010-05-13 11:09:43 -04:00
}
}
2010-05-03 16:26:11 -04:00
2012-04-06 15:49:34 -04:00
if ( ! $redirect_url ) {
2012-04-06 21:03:55 -04:00
if ( $redirect_url = redirect_guess_404_permalink ( $requested_url ) ) {
2012-04-07 01:39: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
}
2010-05-02 20:37:11 -04:00
2007-08-16 23:45:59 -04:00
} elseif ( is_object ( $wp_rewrite ) && $wp_rewrite -> using_permalinks () ) {
// rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101
2009-08-24 14:03:49 -04:00
if ( is_attachment () && ! empty ( $_GET [ 'attachment_id' ]) && ! $redirect_url ) {
if ( $redirect_url = get_attachment_link ( get_query_var ( 'attachment_id' )) )
$redirect [ 'query' ] = remove_query_arg ( 'attachment_id' , $redirect [ 'query' ]);
} elseif ( is_single () && ! empty ( $_GET [ 'p' ]) && ! $redirect_url ) {
2007-08-16 23:45:59 -04:00
if ( $redirect_url = get_permalink ( get_query_var ( 'p' )) )
2010-05-26 15:56:26 -04:00
$redirect [ 'query' ] = remove_query_arg ( array ( 'p' , 'post_type' ), $redirect [ 'query' ]);
2009-07-26 13:16:53 -04:00
} elseif ( is_single () && ! empty ( $_GET [ 'name' ]) && ! $redirect_url ) {
2009-09-14 10:03:32 -04:00
if ( $redirect_url = get_permalink ( $wp_query -> get_queried_object_id () ) )
$redirect [ 'query' ] = remove_query_arg ( 'name' , $redirect [ 'query' ]);
2008-10-16 12:08:00 -04:00
} elseif ( is_page () && ! empty ( $_GET [ 'page_id' ]) && ! $redirect_url ) {
2007-08-16 23:45:59 -04:00
if ( $redirect_url = get_permalink ( get_query_var ( 'page_id' )) )
$redirect [ 'query' ] = remove_query_arg ( 'page_id' , $redirect [ 'query' ]);
2010-04-18 02:51:16 -04:00
} elseif ( is_page () && ! is_feed () && isset ( $wp_query -> queried_object ) && 'page' == get_option ( 'show_on_front' ) && $wp_query -> queried_object -> ID == get_option ( 'page_on_front' ) && ! $redirect_url ) {
2010-02-05 22:40:24 -05:00
$redirect_url = home_url ( '/' );
2010-02-05 22:50:55 -05:00
} elseif ( is_home () && ! empty ( $_GET [ 'page_id' ]) && 'page' == get_option ( 'show_on_front' ) && get_query_var ( 'page_id' ) == get_option ( 'page_for_posts' ) && ! $redirect_url ) {
if ( $redirect_url = get_permalink ( get_option ( 'page_for_posts' )) )
$redirect [ 'query' ] = remove_query_arg ( 'page_id' , $redirect [ 'query' ]);
2008-10-16 12:08:00 -04:00
} elseif ( ! empty ( $_GET [ 'm' ]) && ( is_year () || is_month () || is_day () ) ) {
2007-08-16 23:45:59 -04:00
$m = get_query_var ( 'm' );
switch ( strlen ( $m ) ) {
case 4 : // Yearly
$redirect_url = get_year_link ( $m );
break ;
case 6 : // Monthly
$redirect_url = get_month_link ( substr ( $m , 0 , 4 ), substr ( $m , 4 , 2 ) );
break ;
case 8 : // Daily
$redirect_url = get_day_link ( substr ( $m , 0 , 4 ), substr ( $m , 4 , 2 ), substr ( $m , 6 , 2 ));
break ;
}
if ( $redirect_url )
$redirect [ 'query' ] = remove_query_arg ( 'm' , $redirect [ 'query' ]);
// now moving on to non ?m=X year/month/day links
2008-10-16 12:08:00 -04:00
} elseif ( is_day () && get_query_var ( 'year' ) && get_query_var ( 'monthnum' ) && ! empty ( $_GET [ 'day' ]) ) {
2007-08-16 23:45:59 -04:00
if ( $redirect_url = get_day_link ( get_query_var ( 'year' ), get_query_var ( 'monthnum' ), get_query_var ( 'day' )) )
$redirect [ 'query' ] = remove_query_arg ( array ( 'year' , 'monthnum' , 'day' ), $redirect [ 'query' ]);
2008-10-16 12:08:00 -04:00
} elseif ( is_month () && get_query_var ( 'year' ) && ! empty ( $_GET [ 'monthnum' ]) ) {
2007-08-16 23:45:59 -04:00
if ( $redirect_url = get_month_link ( get_query_var ( 'year' ), get_query_var ( 'monthnum' )) )
$redirect [ 'query' ] = remove_query_arg ( array ( 'year' , 'monthnum' ), $redirect [ 'query' ]);
2008-10-16 12:08:00 -04:00
} elseif ( is_year () && ! empty ( $_GET [ 'year' ]) ) {
2007-08-16 23:45:59 -04:00
if ( $redirect_url = get_year_link ( get_query_var ( 'year' )) )
$redirect [ 'query' ] = remove_query_arg ( 'year' , $redirect [ 'query' ]);
2009-11-17 16:01:03 -05:00
} elseif ( is_author () && ! empty ( $_GET [ 'author' ]) && preg_match ( '|^[0-9]+$|' , $_GET [ 'author' ] ) ) {
2007-08-16 23:45:59 -04:00
$author = get_userdata ( get_query_var ( 'author' ));
2011-05-22 19:18:06 -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 ) ) ) {
if ( $redirect_url = get_author_posts_url ( $author -> ID , $author -> user_nicename ) )
$redirect [ 'query' ] = remove_query_arg ( 'author' , $redirect [ 'query' ]);
}
2010-02-27 21:49:01 -05:00
} elseif ( is_category () || is_tag () || is_tax () ) { // Terms (Tags/categories)
$term_count = 0 ;
2010-12-09 14:29:21 -05:00
foreach ( $wp_query -> tax_query -> queries as $tax_query )
2010-09-14 07:34:40 -04:00
$term_count += count ( $tax_query [ 'terms' ] );
2007-08-16 23:45:59 -04:00
2010-02-16 04:08:26 -05:00
$obj = $wp_query -> get_queried_object ();
2010-10-04 06:37:25 -04:00
if ( $term_count <= 1 && ! empty ( $obj -> term_id ) && ( $tax_url = get_term_link (( int ) $obj -> term_id , $obj -> taxonomy ) ) && ! is_wp_error ( $tax_url ) ) {
if ( ! empty ( $redirect [ 'query' ]) ) {
2011-05-31 02:13:27 -04:00
// Strip taxonomy query vars off the url.
$qv_remove = array ( 'term' , 'taxonomy' );
2010-10-04 06:37:25 -04:00
if ( is_category () ) {
2011-05-31 02:13:27 -04:00
$qv_remove [] = 'category_name' ;
$qv_remove [] = 'cat' ;
2010-10-04 06:37:25 -04:00
} elseif ( is_tag () ) {
2011-05-31 02:13:27 -04:00
$qv_remove [] = 'tag' ;
$qv_remove [] = 'tag_id' ;
} else { // Custom taxonomies will have a custom query var, remove those too:
$tax_obj = get_taxonomy ( $obj -> taxonomy );
if ( false !== $tax_obj -> query_var )
$qv_remove [] = $tax_obj -> query_var ;
2010-10-04 06:37:25 -04:00
}
2011-04-26 06:49:00 -04:00
2011-05-31 02:13:27 -04:00
$rewrite_vars = array_diff ( array_keys ( $wp_query -> query ), array_keys ( $_GET ) );
if ( ! array_diff ( $rewrite_vars , array_keys ( $_GET )) ) { // Check to see if all the Query vars are coming from the rewrite, none are set via $_GET
$redirect [ 'query' ] = remove_query_arg ( $qv_remove , $redirect [ 'query' ]); //Remove all of the per-tax qv's
// Create the destination url for this taxonomy
$tax_url = parse_url ( $tax_url );
2011-09-03 12:02:41 -04:00
if ( ! empty ( $tax_url [ 'query' ]) ) { // Taxonomy accessible via ?taxonomy=..&term=.. or any custom qv..
2011-05-31 02:13:27 -04:00
parse_str ( $tax_url [ 'query' ], $query_vars );
$redirect [ 'query' ] = add_query_arg ( $query_vars , $redirect [ 'query' ]);
2011-09-03 12:02:41 -04:00
} else { // Taxonomy is accessible via a "pretty-URL"
2011-05-31 02:13:27 -04:00
$redirect [ 'path' ] = $tax_url [ 'path' ];
}
} else { // Some query vars are set via $_GET. Unset those from $_GET that exist via the rewrite
foreach ( $qv_remove as $_qv ) {
2011-06-10 19:01:45 -04:00
if ( isset ( $rewrite_vars [ $_qv ]) )
2011-05-31 02:13:27 -04:00
$redirect [ 'query' ] = remove_query_arg ( $_qv , $redirect [ 'query' ]);
}
2011-04-26 06:49:00 -04:00
}
2010-02-16 04:08:26 -05:00
}
2011-05-31 02:13:27 -04:00
2010-02-13 01:17:59 -05:00
}
2012-02-21 14:00:06 -05:00
} elseif ( is_single () && strpos ( $wp_rewrite -> permalink_structure , '%category%' ) !== false && $cat = get_query_var ( 'category_name' ) ) {
$category = get_category_by_path ( $cat );
2010-05-16 16:47:18 -04:00
$post_terms = wp_get_object_terms ( $wp_query -> get_queried_object_id (), 'category' , array ( 'fields' => 'tt_ids' ));
if ( ( ! $category || is_wp_error ( $category )) || ( ! is_wp_error ( $post_terms ) && ! empty ( $post_terms ) && ! in_array ( $category -> term_taxonomy_id , $post_terms ) ) )
2010-03-20 02:27:27 -04:00
$redirect_url = get_permalink ( $wp_query -> get_queried_object_id ());
2010-02-13 01:17:59 -05:00
}
2010-10-04 07:30:11 -04:00
// Post Paging
2012-04-11 17:18:40 -04:00
if ( is_singular () && ! is_front_page () && get_query_var ( 'page' ) ) {
2012-04-07 01:18:50 -04:00
if ( ! $redirect_url )
$redirect_url = get_permalink ( get_queried_object_id () );
2010-10-04 07:30:11 -04:00
$redirect_url = trailingslashit ( $redirect_url ) . user_trailingslashit ( get_query_var ( 'page' ), 'single_paged' );
$redirect [ 'query' ] = remove_query_arg ( 'page' , $redirect [ 'query' ] );
}
2010-02-05 22:40:24 -05:00
// paging and feeds
2008-10-23 14:55:22 -04:00
if ( get_query_var ( 'paged' ) || is_feed () || get_query_var ( 'cpage' ) ) {
2010-12-14 11:55:35 -05:00
while ( preg_match ( " #/ $wp_rewrite->pagination_base /?[0-9]+?(/+)? $ # " , $redirect [ 'path' ] ) || preg_match ( '#/(comments/?)?(feed|rss|rdf|atom|rss2)(/+)?$#' , $redirect [ 'path' ] ) || preg_match ( '#/comment-page-[0-9]+(/+)?$#' , $redirect [ 'path' ] ) ) {
2008-10-14 01:51:01 -04:00
// Strip off paging and feed
2010-12-14 11:55:35 -05:00
$redirect [ 'path' ] = preg_replace ( " #/ $wp_rewrite->pagination_base /?[0-9]+?(/+)? $ # " , '/' , $redirect [ 'path' ]); // strip off any existing paging
$redirect [ 'path' ] = preg_replace ( '#/(comments/?)?(feed|rss2?|rdf|atom)(/+|$)#' , '/' , $redirect [ 'path' ]); // strip off feed endings
$redirect [ 'path' ] = preg_replace ( '#/comment-page-[0-9]+?(/+)?$#' , '/' , $redirect [ 'path' ]); // strip off any existing comment paging
2008-11-14 17:48:22 -05:00
}
$addl_path = '' ;
2011-03-03 10:55:24 -05:00
if ( is_feed () && in_array ( get_query_var ( 'feed' ), $wp_rewrite -> feeds ) ) {
2008-11-25 16:28:42 -05:00
$addl_path = ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ;
2012-04-07 01:02:45 -04:00
if ( ! is_singular () && get_query_var ( 'withcomments' ) )
2008-11-25 16:28:42 -05:00
$addl_path .= 'comments/' ;
2011-11-20 13:32:42 -05:00
if ( ( 'rss' == get_default_feed () && 'feed' == get_query_var ( 'feed' ) ) || 'rss' == get_query_var ( 'feed' ) )
2011-08-11 19:30:59 -04:00
$addl_path .= user_trailingslashit ( 'feed/' . ( ( get_default_feed () == 'rss2' ) ? '' : 'rss2' ), 'feed' );
else
$addl_path .= user_trailingslashit ( 'feed/' . ( ( get_default_feed () == get_query_var ( 'feed' ) || 'feed' == get_query_var ( 'feed' ) ) ? '' : get_query_var ( 'feed' ) ), 'feed' );
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'feed' , $redirect [ 'query' ] );
2011-08-11 21:41:23 -04:00
} elseif ( is_feed () && 'old' == get_query_var ( 'feed' ) ) {
$old_feed_files = array (
'wp-atom.php' => 'atom' ,
'wp-commentsrss2.php' => 'comments_rss2' ,
'wp-feed.php' => get_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' ,
);
if ( isset ( $old_feed_files [ basename ( $redirect [ 'path' ] ) ] ) ) {
$redirect_url = get_feed_link ( $old_feed_files [ basename ( $redirect [ 'path' ] ) ] );
wp_redirect ( $redirect_url , 301 );
die ();
}
2008-10-14 01:51:01 -04:00
}
if ( get_query_var ( 'paged' ) > 0 ) {
$paged = get_query_var ( 'paged' );
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = remove_query_arg ( 'paged' , $redirect [ 'query' ] );
if ( ! is_feed () ) {
if ( $paged > 1 && ! is_single () ) {
2010-09-06 21:18:42 -04:00
$addl_path = ( ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ) . user_trailingslashit ( " $wp_rewrite->pagination_base / $paged " , 'paged' );
2008-11-14 17:48:22 -05:00
} elseif ( ! is_single () ) {
2010-01-10 13:56:03 -05:00
$addl_path = ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ;
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
2008-10-24 06:53:09 -04:00
if ( get_option ( 'page_comments' ) && ( ( 'newest' == get_option ( 'default_comments_page' ) && get_query_var ( 'cpage' ) > 0 ) || ( 'newest' != get_option ( 'default_comments_page' ) && get_query_var ( 'cpage' ) > 1 ) ) ) {
2008-11-14 17:48:22 -05:00
$addl_path = ( ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ) . user_trailingslashit ( 'comment-page-' . get_query_var ( 'cpage' ), 'commentpaged' );
$redirect [ 'query' ] = remove_query_arg ( 'cpage' , $redirect [ 'query' ] );
2008-10-23 14:55:22 -04:00
}
2008-11-14 17:48:22 -05:00
2010-12-14 11:55:35 -05:00
$redirect [ 'path' ] = user_trailingslashit ( preg_replace ( '|/index.php/?$|' , '/' , $redirect [ 'path' ]) ); // strip off trailing /index.php/
if ( ! empty ( $addl_path ) && $wp_rewrite -> using_index_permalinks () && strpos ( $redirect [ 'path' ], '/index.php/' ) === false )
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]) . 'index.php/' ;
2008-11-21 12:33:05 -05:00
if ( ! empty ( $addl_path ) )
2010-12-14 11:55:35 -05:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]) . $addl_path ;
$redirect_url = $redirect [ 'scheme' ] . '://' . $redirect [ 'host' ] . $redirect [ 'path' ];
2007-08-16 23:45:59 -04:00
}
}
2007-09-13 15:12:53 -04:00
// tack on any additional query vars
2008-11-14 17:48:22 -05:00
$redirect [ 'query' ] = preg_replace ( '#^\??&*?#' , '' , $redirect [ 'query' ] );
2008-11-02 15:53:15 -05:00
if ( $redirect_url && ! empty ( $redirect [ 'query' ]) ) {
2010-12-17 15:23:34 -05:00
parse_str ( $redirect [ 'query' ], $_parsed_query );
2010-12-17 15:57:03 -05:00
$redirect = @ parse_url ( $redirect_url );
if ( ! empty ( $_parsed_query [ 'name' ] ) && ! empty ( $redirect [ 'query' ] ) ) {
parse_str ( $redirect [ 'query' ], $_parsed_redirect_query );
if ( empty ( $_parsed_redirect_query [ 'name' ] ) )
unset ( $_parsed_query [ 'name' ] );
}
2011-10-05 07:00:28 -04:00
$_parsed_query = array_map ( 'rawurlencode' , $_parsed_query );
2010-12-17 15:23:34 -05: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
2007-09-13 15:12:53 -04:00
if ( $redirect_url )
$redirect = @ parse_url ( $redirect_url );
2007-08-16 23:45:59 -04:00
2007-08-29 17:06:51 -04:00
// www.example.com vs example.com
2010-01-04 12:23:29 -05:00
$user_home = @ parse_url ( home_url ());
2008-10-16 12:08:00 -04:00
if ( ! empty ( $user_home [ 'host' ]) )
2008-05-09 14:23:05 -04:00
$redirect [ 'host' ] = $user_home [ 'host' ];
2008-10-16 12:08:00 -04:00
if ( empty ( $user_home [ 'path' ]) )
2008-10-14 17:08:28 -04:00
$user_home [ 'path' ] = '/' ;
2007-08-16 23:45:59 -04:00
2007-09-13 15:24:05 -04:00
// Handle ports
2008-10-16 12:08:00 -04:00
if ( ! empty ( $user_home [ 'port' ]) )
2007-09-13 15:24:05 -04:00
$redirect [ 'port' ] = $user_home [ 'port' ];
else
unset ( $redirect [ 'port' ]);
2008-10-16 15:17:04 -04:00
// trailing /index.php
$redirect [ 'path' ] = preg_replace ( '|/index.php/*?$|' , '/' , $redirect [ 'path' ]);
2007-08-16 23:45:59 -04:00
2008-08-18 23:21:12 -04:00
// Remove trailing spaces from the path
$redirect [ 'path' ] = preg_replace ( '#(%20| )+$#' , '' , $redirect [ 'path' ] );
2008-10-16 12:08:00 -04:00
if ( ! empty ( $redirect [ 'query' ] ) ) {
2008-11-12 15:09:16 -05:00
// Remove trailing spaces from certain terminating query string args
2008-08-25 17:50:11 -04:00
$redirect [ 'query' ] = preg_replace ( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#' , '$1' , $redirect [ 'query' ] );
2008-08-18 23:21:12 -04:00
2008-08-25 17:50:11 -04:00
// Clean up empty query strings
2008-11-12 16:08:48 -05:00
$redirect [ 'query' ] = trim ( preg_replace ( '#(^|&)(p|page_id|cat|tag)=?(&|$)#' , '&' , $redirect [ 'query' ]), '&' );
2008-11-12 15:09:16 -05:00
2011-08-11 19:30:59 -04:00
// Redirect obsolete feeds
2011-11-20 13:32:42 -05:00
$redirect [ 'query' ] = preg_replace ( '#(^|&)feed=rss(&|$)#' , '$1feed=rss2$3' , $redirect [ 'query' ] );
2011-08-11 19:30:59 -04:00
2008-11-12 15:09:16 -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
2007-08-29 17:06:51 -04:00
// strip /index.php/ when we're not using PATHINFO permalinks
if ( ! $wp_rewrite -> using_index_permalinks () )
$redirect [ 'path' ] = str_replace ( '/index.php/' , '/' , $redirect [ 'path' ]);
2007-08-16 23:45:59 -04:00
2007-08-29 17:06:51 -04:00
// trailing slashes
2008-10-16 17:14:42 -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 = '' ;
if ( get_query_var ( 'paged' ) > 0 ) {
$user_ts_type = 'paged' ;
} else {
2008-10-16 17:14:42 -04:00
foreach ( array ( 'single' , 'category' , 'page' , 'day' , 'month' , 'year' , 'home' ) as $type ) {
2007-08-29 17:06:51 -04:00
$func = 'is_' . $type ;
2008-08-08 13:43:44 -04: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
}
2007-08-29 17:06:51 -04:00
$redirect [ 'path' ] = user_trailingslashit ( $redirect [ 'path' ], $user_ts_type );
2008-10-16 17:14:42 -04:00
} elseif ( is_front_page () ) {
2007-09-14 15:41:23 -04:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]);
2007-08-29 17:06:51 -04:00
}
2010-02-12 19:11:23 -05:00
// Strip multiple slashes out of the URL
2010-02-13 03:29:55 -05:00
if ( strpos ( $redirect [ 'path' ], '//' ) > - 1 )
2010-02-13 01:17:59 -05:00
$redirect [ 'path' ] = preg_replace ( '|/+|' , '/' , $redirect [ 'path' ]);
2010-02-12 19:11:23 -05:00
2008-10-16 17:14:42 -04:00
// Always trailing slash the Front Page URL
if ( trailingslashit ( $redirect [ 'path' ] ) == trailingslashit ( $user_home [ 'path' ] ) )
2007-09-11 17:21:40 -04:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]);
2007-09-12 16:44:41 -04:00
// Ignore differences in host capitalization, as this can lead to infinite redirects
2008-11-12 16:27:19 -05:00
// Only redirect no-www <=> yes-www
if ( strtolower ( $original [ 'host' ]) == strtolower ( $redirect [ 'host' ]) ||
( strtolower ( $original [ 'host' ]) != 'www.' . strtolower ( $redirect [ 'host' ]) && 'www.' . strtolower ( $original [ 'host' ]) != strtolower ( $redirect [ 'host' ]) ) )
2007-09-12 16:44:41 -04:00
$redirect [ 'host' ] = $original [ 'host' ];
2008-08-08 13:05:10 -04:00
$compare_original = array ( $original [ 'host' ], $original [ 'path' ]);
2008-10-16 12:08:00 -04:00
if ( ! empty ( $original [ 'port' ] ) )
2008-08-08 13:05:10 -04:00
$compare_original [] = $original [ 'port' ];
2008-10-16 12:08:00 -04:00
if ( ! empty ( $original [ 'query' ] ) )
2008-08-08 13:05:10 -04:00
$compare_original [] = $original [ 'query' ];
$compare_redirect = array ( $redirect [ 'host' ], $redirect [ 'path' ]);
2008-10-16 12:08:00 -04:00
if ( ! empty ( $redirect [ 'port' ] ) )
2008-08-08 13:05:10 -04:00
$compare_redirect [] = $redirect [ 'port' ];
2008-10-16 12:08:00 -04:00
if ( ! empty ( $redirect [ 'query' ] ) )
2008-08-08 13:05:10 -04:00
$compare_redirect [] = $redirect [ 'query' ];
if ( $compare_original !== $compare_redirect ) {
2007-09-13 15:24:05 -04:00
$redirect_url = $redirect [ 'scheme' ] . '://' . $redirect [ 'host' ];
2008-10-16 12:08:00 -04:00
if ( ! empty ( $redirect [ 'port' ]) )
2008-10-27 12:31:26 -04:00
$redirect_url .= ':' . $redirect [ 'port' ];
2007-09-13 15:24:05 -04:00
$redirect_url .= $redirect [ 'path' ];
2008-10-16 12:08:00 -04:00
if ( ! empty ( $redirect [ 'query' ]) )
2007-08-29 17:06:51 -04:00
$redirect_url .= '?' . $redirect [ 'query' ];
2007-08-16 23:45:59 -04:00
}
2010-01-10 14:05:43 -05:00
if ( ! $redirect_url || $redirect_url == $requested_url )
2008-10-27 12:31:26 -04:00
return false ;
2010-10-21 15:55:28 -04:00
2010-10-19 03:48:22 -04:00
// Hex encoded octets are case-insensitive.
2010-07-18 09:46:35 -04:00
if ( false !== strpos ( $requested_url , '%' ) ) {
if ( ! function_exists ( 'lowercase_octets' ) ) {
2010-10-19 03:48:22 -04:00
function lowercase_octets ( $matches ) {
return strtolower ( $matches [ 0 ] );
}
2010-07-18 09:46:35 -04:00
}
$requested_url = preg_replace_callback ( '|%[a-fA-F0-9][a-fA-F0-9]|' , 'lowercase_octets' , $requested_url );
}
2012-01-05 15:50:54 -05:00
// Note that you can use the "redirect_canonical" filter to cancel a canonical redirect for whatever reason by returning false
2008-02-06 17:57:15 -05:00
$redirect_url = apply_filters ( 'redirect_canonical' , $redirect_url , $requested_url );
if ( ! $redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
2008-10-27 12:31:26 -04:00
return false ;
2008-02-06 17:57:15 -05:00
if ( $do_redirect ) {
// protect against chained redirects
if ( ! redirect_canonical ( $redirect_url , false ) ) {
wp_redirect ( $redirect_url , 301 );
exit ();
2007-09-11 17:21:40 -04:00
} else {
2008-10-14 01:51:01 -04:00
// Debug
// die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) );
2008-02-06 17:57:15 -05:00
return false ;
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 .
*
* @ since 3.4
* @ access private
*
* @ return string The altered query string
*/
function _remove_qs_args_if_not_in_url ( $query_string , Array $args_to_check , $url ) {
$parsed_url = @ parse_url ( $url );
parse_str ( $parsed_url [ 'query' ], $parsed_query );
foreach ( $args_to_check as $qv ) {
if ( ! isset ( $parsed_query [ $qv ] ) )
$query_string = remove_query_arg ( $qv , $query_string );
}
return $query_string ;
}
2007-12-25 15:48:47 -05:00
/**
2012-01-28 15:40:55 -05:00
* Attempts to guess the correct URL from the current URL ( that produced a 404 ) or
* the current query variables .
2007-12-25 15:48:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.3 . 0
2007-12-25 15:48:47 -05:00
* @ uses $wpdb
*
2012-01-28 15:40:55 -05:00
* @ param string $current_url Optional . The URL that has 404 ' d .
* @ return bool | string The correct URL if one is found . False on failure .
2007-12-25 15:48:47 -05:00
*/
2012-01-28 15:40:55 -05:00
function redirect_guess_404_permalink ( $current_url = '' ) {
global $wpdb , $wp_rewrite ;
if ( ! empty ( $current_url ) )
$parsed_url = @ parse_url ( $current_url );
// Attempt to redirect bare category slugs if the permalink structure starts
// with the %category% tag.
if ( isset ( $parsed_url [ 'path' ] )
&& preg_match ( '#^[^%]+%category%#' , $wp_rewrite -> permalink_structure )
&& $cat = get_category_by_path ( $parsed_url [ 'path' ] )
) {
if ( ! is_wp_error ( $cat ) )
return get_term_link ( $cat );
}
2007-08-16 23:45:59 -04:00
2012-01-28 15:40:55 -05:00
if ( get_query_var ( 'name' ) ) {
$where = $wpdb -> prepare ( " post_name LIKE %s " , like_escape ( get_query_var ( 'name' ) ) . '%' );
// if any of post_type, year, monthnum, or day are set, use them to refine the query
if ( get_query_var ( 'post_type' ) )
$where .= $wpdb -> prepare ( " AND post_type = %s " , get_query_var ( 'post_type' ));
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' ));
$post_id = $wpdb -> get_var ( " SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish' " );
if ( ! $post_id )
return false ;
2012-04-07 01:39:08 -04:00
if ( get_query_var ( 'feed' ) )
return get_post_comments_feed_link ( $post_id , get_query_var ( 'feed' ) );
elseif ( get_query_var ( 'page' ) )
return trailingslashit ( get_permalink ( $post_id ) ) . user_trailingslashit ( get_query_var ( 'page' ), 'single_paged' );
else
return get_permalink ( $post_id );
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
}
add_action ( 'template_redirect' , 'redirect_canonical' );
2012-02-08 15:11:52 -05:00
function wp_redirect_admin_locations () {
global $wp_rewrite ;
if ( ! ( is_404 () && $wp_rewrite -> using_permalinks () ) )
return ;
$admins = array (
home_url ( 'wp-admin' , 'relative' ),
home_url ( 'dashboard' , 'relative' ),
home_url ( 'admin' , 'relative' ),
site_url ( 'dashboard' , 'relative' ),
site_url ( 'admin' , 'relative' ),
);
if ( in_array ( untrailingslashit ( $_SERVER [ 'REQUEST_URI' ] ), $admins ) ) {
wp_redirect ( admin_url () );
exit ;
}
$logins = array (
home_url ( 'wp-login.php' , 'relative' ),
home_url ( 'login' , 'relative' ),
site_url ( 'login' , 'relative' ),
);
if ( in_array ( untrailingslashit ( $_SERVER [ 'REQUEST_URI' ] ), $logins ) ) {
wp_redirect ( site_url ( 'wp-login.php' , 'login' ) );
exit ;
}
}
2012-02-21 14:00:06 -05:00
add_action ( 'template_redirect' , 'wp_redirect_admin_locations' , 1000 );