2007-08-17 05:45:59 +02:00
< ? php
2007-12-25 21:48:47 +01:00
/**
* Canonical API to handle WordPress Redirecting
*
2008-05-25 17:45:05 +02:00
* Based on " Permalink Redirect " from Scott Yang and " Enforce www. Preference "
* by Mark Jaquith
2007-12-25 21:48:47 +01:00
*
* @ package WordPress
2008-08-27 08:45:13 +02:00
* @ since 2.3 . 0
2007-12-25 21:48:47 +01:00
*/
/**
2008-08-27 08:45:13 +02:00
* Redirects incoming links to the proper URL based on the site url .
2007-12-25 21:48:47 +01:00
*
2008-05-25 17:45:05 +02: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 18:02:41 +02:00
* prevents penalty for duplicate content by redirecting all incoming links to
2008-05-25 17:45:05 +02:00
* one or the other .
2007-12-25 21:48:47 +01:00
*
2008-05-25 17:45:05 +02:00
* Prevents redirection for feeds , trackbacks , searches , comment popup , and
2013-07-08 22:27:06 +02:00
* admin URLs . Does not redirect on non - pretty - permalink - supporting IIS 7 + ,
2012-07-05 15:23:39 +02:00
* page / post previews , WP admin , Trackbacks , robots . txt , searches , or on POST
* requests .
2007-12-25 21:48:47 +01:00
*
2008-05-25 17:45:05 +02: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 21:48:47 +01:00
*
2008-08-27 08:45:13 +02:00
* @ since 2.3 . 0
2015-05-22 06:26:26 +02:00
*
* @ global WP_Rewrite $wp_rewrite
* @ global bool $is_IIS
* @ global WP_Query $wp_query
* @ global wpdb $wpdb
2007-12-25 21:48:47 +01:00
*
2008-05-25 17:45:05 +02:00
* @ param string $requested_url Optional . The URL that was requested , used to
* figure if redirect is needed .
2007-12-25 21:48:47 +01:00
* @ param bool $do_redirect Optional . Redirect to the new URL .
2015-05-24 07:40:25 +02:00
* @ return string | void The string of the URL , if redirect needed .
2007-12-25 21:48:47 +01:00
*/
2010-12-08 12:04:40 +01:00
function redirect_canonical ( $requested_url = null , $do_redirect = true ) {
2012-07-05 21:59:35 +02:00
global $wp_rewrite , $is_IIS , $wp_query , $wpdb ;
2007-08-17 05:45:59 +02:00
2014-09-02 06:48:17 +02:00
if ( isset ( $_SERVER [ 'REQUEST_METHOD' ] ) && ! in_array ( strtoupper ( $_SERVER [ 'REQUEST_METHOD' ] ), array ( 'GET' , 'HEAD' ) ) ) {
2014-07-02 16:11:14 +02:00
return ;
}
2014-06-28 04:13:15 +02:00
// If we're not in wp-admin and the post has been published and preview nonce
2014-06-28 05:30:16 +02:00
// is non-existent or invalid then no need for preview in query
2014-06-28 04:13:15 +02:00
if ( is_preview () && get_query_var ( 'p' ) && 'publish' == get_post_status ( get_query_var ( 'p' ) ) ) {
if ( ! isset ( $_GET [ 'preview_id' ] )
|| ! isset ( $_GET [ 'preview_nonce' ] )
|| ! wp_verify_nonce ( $_GET [ 'preview_nonce' ], 'post_preview_' . ( int ) $_GET [ 'preview_id' ] ) ) {
$wp_query -> is_preview = false ;
}
}
2014-07-02 16:11:14 +02:00
if ( is_trackback () || is_search () || is_comments_popup () || is_admin () || is_preview () || is_robots () || ( $is_IIS && ! iis7_supports_permalinks () ) ) {
2007-08-17 05:45:59 +02:00
return ;
2014-07-02 16:11:14 +02:00
}
2007-08-17 05:45:59 +02:00
2015-08-28 05:31:20 +02:00
if ( ! $requested_url && isset ( $_SERVER [ 'HTTP_HOST' ] ) ) {
2007-09-11 23:21:40 +02:00
// build the URL in the address bar
2010-02-26 07:21:47 +01:00
$requested_url = is_ssl () ? 'https://' : 'http://' ;
2007-09-11 23:21:40 +02:00
$requested_url .= $_SERVER [ 'HTTP_HOST' ];
$requested_url .= $_SERVER [ 'REQUEST_URI' ];
}
2007-08-17 05:45:59 +02:00
$original = @ parse_url ( $requested_url );
if ( false === $original )
return ;
2007-09-20 22:25:43 +02:00
// Some PHP setups turn requests for / into /index.php in REQUEST_URI
2014-09-29 15:37:16 +02:00
// See: https://core.trac.wordpress.org/ticket/5017
// See: https://core.trac.wordpress.org/ticket/7173
2008-10-16 21:17:04 +02:00
// Disabled, for now:
// $original['path'] = preg_replace('|/index\.php$|', '/', $original['path']);
2008-02-05 07:47:27 +01:00
2007-08-17 05:45:59 +02:00
$redirect = $original ;
$redirect_url = false ;
2008-11-04 04:22:24 +01:00
// Notice fixing
2010-03-28 08:05:50 +02:00
if ( ! isset ( $redirect [ 'path' ]) )
$redirect [ 'path' ] = '' ;
if ( ! isset ( $redirect [ 'query' ]) )
$redirect [ 'query' ] = '' ;
2008-11-04 04:22:24 +01:00
2015-03-20 02:02:28 +01: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.
$redirect [ 'path' ] = preg_replace ( '|(%C2%A0)+$|i' , '' , $redirect [ 'path' ] );
2014-06-30 19:19:14 +02:00
// It's not a preview, so remove it from URL
if ( get_query_var ( 'preview' ) ) {
2014-06-28 04:13:15 +02:00
$redirect [ 'query' ] = remove_query_arg ( 'preview' , $redirect [ 'query' ] );
}
2012-04-07 07:02:45 +02: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-08 03:50:08 +02: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-07 03:03:55 +02: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-08 03:50:08 +02:00
}
}
2007-08-17 05:45:59 +02:00
// These tests give us a WP-generated permalink
if ( is_404 () ) {
2010-05-03 02:37:11 +02:00
// Redirect ?page_id, ?p=, ?attachment_id= to their respective url's
2010-05-13 17:09:43 +02: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-07 03:03:55 +02: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 17:09:43 +02:00
}
}
2010-05-03 22:26:11 +02:00
2013-09-06 18:36:09 +02:00
if ( get_query_var ( 'day' ) && get_query_var ( 'monthnum' ) && get_query_var ( 'year' ) ) {
$year = get_query_var ( 'year' );
$month = get_query_var ( 'monthnum' );
$day = get_query_var ( 'day' );
$date = sprintf ( '%04d-%02d-%02d' , $year , $month , $day );
if ( ! wp_checkdate ( $month , $day , $year , $date ) ) {
$redirect_url = get_month_link ( $year , $month );
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url ( $redirect [ 'query' ], array ( 'year' , 'monthnum' , 'day' ), $redirect_url );
}
} elseif ( get_query_var ( 'monthnum' ) && get_query_var ( 'year' ) && 12 < get_query_var ( 'monthnum' ) ) {
$redirect_url = get_year_link ( get_query_var ( 'year' ) );
$redirect [ 'query' ] = _remove_qs_args_if_not_in_url ( $redirect [ 'query' ], array ( 'year' , 'monthnum' ), $redirect_url );
}
2012-04-06 21:49:34 +02:00
if ( ! $redirect_url ) {
2012-06-25 22:41:14 +02:00
if ( $redirect_url = redirect_guess_404_permalink () ) {
2012-04-07 07:39:08 +02: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-07 03:03:55 +02:00
}
2012-04-06 21:49:34 +02:00
}
2010-05-03 02:37:11 +02:00
2015-09-24 16:04:24 +02:00
if ( get_query_var ( 'page' ) && $wp_query -> post &&
false !== strpos ( $wp_query -> post -> post_content , '<!--nextpage-->' ) ) {
$redirect [ 'path' ] = rtrim ( $redirect [ 'path' ], ( int ) get_query_var ( 'page' ) . '/' );
$redirect [ 'query' ] = remove_query_arg ( 'page' , $redirect [ 'query' ] );
$redirect_url = get_permalink ( $wp_query -> post -> ID );
}
2007-08-17 05:45:59 +02:00
} elseif ( is_object ( $wp_rewrite ) && $wp_rewrite -> using_permalinks () ) {
// rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101
2015-09-17 23:32:24 +02:00
if ( is_attachment () && ! $redirect_url ) {
if ( ! empty ( $_GET [ 'attachment_id' ] ) ) {
$redirect_url = get_attachment_link ( get_query_var ( 'attachment_id' ) );
if ( $redirect_url ) {
$redirect [ 'query' ] = remove_query_arg ( 'attachment_id' , $redirect [ 'query' ] );
}
} else {
$redirect_url = get_attachment_link ();
}
2009-08-24 20:03:49 +02:00
} elseif ( is_single () && ! empty ( $_GET [ 'p' ]) && ! $redirect_url ) {
2007-08-17 05:45:59 +02:00
if ( $redirect_url = get_permalink ( get_query_var ( 'p' )) )
2010-05-26 21:56:26 +02:00
$redirect [ 'query' ] = remove_query_arg ( array ( 'p' , 'post_type' ), $redirect [ 'query' ]);
2009-07-26 19:16:53 +02:00
} elseif ( is_single () && ! empty ( $_GET [ 'name' ]) && ! $redirect_url ) {
2009-09-14 16:03:32 +02:00
if ( $redirect_url = get_permalink ( $wp_query -> get_queried_object_id () ) )
$redirect [ 'query' ] = remove_query_arg ( 'name' , $redirect [ 'query' ]);
2008-10-16 18:08:00 +02:00
} elseif ( is_page () && ! empty ( $_GET [ 'page_id' ]) && ! $redirect_url ) {
2007-08-17 05:45:59 +02:00
if ( $redirect_url = get_permalink ( get_query_var ( 'page_id' )) )
$redirect [ 'query' ] = remove_query_arg ( 'page_id' , $redirect [ 'query' ]);
2010-04-18 08:51:16 +02: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-06 04:40:24 +01:00
$redirect_url = home_url ( '/' );
2010-02-06 04:50:55 +01: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 18:08:00 +02:00
} elseif ( ! empty ( $_GET [ 'm' ]) && ( is_year () || is_month () || is_day () ) ) {
2007-08-17 05:45:59 +02: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 18:08:00 +02:00
} elseif ( is_day () && get_query_var ( 'year' ) && get_query_var ( 'monthnum' ) && ! empty ( $_GET [ 'day' ]) ) {
2007-08-17 05:45:59 +02: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 18:08:00 +02:00
} elseif ( is_month () && get_query_var ( 'year' ) && ! empty ( $_GET [ 'monthnum' ]) ) {
2007-08-17 05:45:59 +02: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 18:08:00 +02:00
} elseif ( is_year () && ! empty ( $_GET [ 'year' ]) ) {
2007-08-17 05:45:59 +02:00
if ( $redirect_url = get_year_link ( get_query_var ( 'year' )) )
$redirect [ 'query' ] = remove_query_arg ( 'year' , $redirect [ 'query' ]);
2009-11-17 22:01:03 +01:00
} elseif ( is_author () && ! empty ( $_GET [ 'author' ]) && preg_match ( '|^[0-9]+$|' , $_GET [ 'author' ] ) ) {
2007-08-17 05:45:59 +02:00
$author = get_userdata ( get_query_var ( 'author' ));
2011-05-23 01:18:06 +02: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-28 03:49:01 +01:00
} elseif ( is_category () || is_tag () || is_tax () ) { // Terms (Tags/categories)
$term_count = 0 ;
2014-10-15 17:43:19 +02:00
foreach ( $wp_query -> tax_query -> queried_terms as $tax_query )
2010-09-14 13:34:40 +02:00
$term_count += count ( $tax_query [ 'terms' ] );
2007-08-17 05:45:59 +02:00
2010-02-16 10:08:26 +01:00
$obj = $wp_query -> get_queried_object ();
2010-10-04 12:37:25 +02: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 08:13:27 +02:00
// Strip taxonomy query vars off the url.
$qv_remove = array ( 'term' , 'taxonomy' );
2010-10-04 12:37:25 +02:00
if ( is_category () ) {
2011-05-31 08:13:27 +02:00
$qv_remove [] = 'category_name' ;
$qv_remove [] = 'cat' ;
2010-10-04 12:37:25 +02:00
} elseif ( is_tag () ) {
2011-05-31 08:13:27 +02: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 12:37:25 +02:00
}
2011-04-26 12:49:00 +02:00
2011-05-31 08:13:27 +02: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 18:02:41 +02:00
if ( ! empty ( $tax_url [ 'query' ]) ) { // Taxonomy accessible via ?taxonomy=..&term=.. or any custom qv..
2011-05-31 08:13:27 +02:00
parse_str ( $tax_url [ 'query' ], $query_vars );
$redirect [ 'query' ] = add_query_arg ( $query_vars , $redirect [ 'query' ]);
2011-09-03 18:02:41 +02:00
} else { // Taxonomy is accessible via a "pretty-URL"
2011-05-31 08:13:27 +02: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-11 01:01:45 +02:00
if ( isset ( $rewrite_vars [ $_qv ]) )
2011-05-31 08:13:27 +02:00
$redirect [ 'query' ] = remove_query_arg ( $_qv , $redirect [ 'query' ]);
}
2011-04-26 12:49:00 +02:00
}
2010-02-16 10:08:26 +01:00
}
2011-05-31 08:13:27 +02:00
2010-02-13 07:17:59 +01:00
}
2012-02-21 20:00:06 +01: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 22:47:18 +02: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 07:27:27 +01:00
$redirect_url = get_permalink ( $wp_query -> get_queried_object_id ());
2010-02-13 07:17:59 +01:00
}
2010-10-04 13:30:11 +02:00
// Post Paging
2012-04-11 23:18:40 +02:00
if ( is_singular () && ! is_front_page () && get_query_var ( 'page' ) ) {
2012-04-07 07:18:50 +02:00
if ( ! $redirect_url )
$redirect_url = get_permalink ( get_queried_object_id () );
2010-10-04 13:30:11 +02:00
$redirect_url = trailingslashit ( $redirect_url ) . user_trailingslashit ( get_query_var ( 'page' ), 'single_paged' );
$redirect [ 'query' ] = remove_query_arg ( 'page' , $redirect [ 'query' ] );
}
2010-02-06 04:40:24 +01:00
// paging and feeds
2008-10-23 20:55:22 +02:00
if ( get_query_var ( 'paged' ) || is_feed () || get_query_var ( 'cpage' ) ) {
2015-02-14 04:48:27 +01:00
while ( preg_match ( " #/ $wp_rewrite->pagination_base /?[0-9]+?(/+)? $ # " , $redirect [ 'path' ] ) || preg_match ( '#/(comments/?)?(feed|rss|rdf|atom|rss2)(/+)?$#' , $redirect [ 'path' ] ) || preg_match ( " #/ { $wp_rewrite -> comments_pagination_base } -[0-9]+(/+)? $ # " , $redirect [ 'path' ] ) ) {
2008-10-14 07:51:01 +02:00
// Strip off paging and feed
2010-12-14 17:55:35 +01: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
2015-02-14 04:48:27 +01:00
$redirect [ 'path' ] = preg_replace ( " #/ { $wp_rewrite -> comments_pagination_base } -[0-9]+?(/+)? $ # " , '/' , $redirect [ 'path' ]); // strip off any existing comment paging
2008-11-14 23:48:22 +01:00
}
$addl_path = '' ;
2011-03-03 16:55:24 +01:00
if ( is_feed () && in_array ( get_query_var ( 'feed' ), $wp_rewrite -> feeds ) ) {
2008-11-25 22:28:42 +01:00
$addl_path = ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ;
2012-04-07 07:02:45 +02:00
if ( ! is_singular () && get_query_var ( 'withcomments' ) )
2008-11-25 22:28:42 +01:00
$addl_path .= 'comments/' ;
2011-11-20 19:32:42 +01:00
if ( ( 'rss' == get_default_feed () && 'feed' == get_query_var ( 'feed' ) ) || 'rss' == get_query_var ( 'feed' ) )
2011-08-12 01:30:59 +02: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 23:48:22 +01:00
$redirect [ 'query' ] = remove_query_arg ( 'feed' , $redirect [ 'query' ] );
2011-08-12 03:41:23 +02: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 19:32:42 +01:00
'wp-rdf.php' => 'rdf' ,
2011-08-12 03:41:23 +02: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 07:51:01 +02:00
}
if ( get_query_var ( 'paged' ) > 0 ) {
$paged = get_query_var ( 'paged' );
2008-11-14 23:48:22 +01:00
$redirect [ 'query' ] = remove_query_arg ( 'paged' , $redirect [ 'query' ] );
if ( ! is_feed () ) {
if ( $paged > 1 && ! is_single () ) {
2010-09-07 03:18:42 +02:00
$addl_path = ( ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ) . user_trailingslashit ( " $wp_rewrite->pagination_base / $paged " , 'paged' );
2008-11-14 23:48:22 +01:00
} elseif ( ! is_single () ) {
2010-01-10 19:56:03 +01:00
$addl_path = ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ;
2008-11-14 23:48:22 +01:00
}
} elseif ( $paged > 1 ) {
$redirect [ 'query' ] = add_query_arg ( 'paged' , $paged , $redirect [ 'query' ] );
2007-08-29 23:06:51 +02:00
}
2007-08-17 05:45:59 +02:00
}
2008-11-14 23:48:22 +01:00
Force comment pagination on single posts.
Previously, the 'page_comments' toggle allowed users to disable comment
pagination. This toggle was only superficial, however. Even with
'page_comments' turned on, `comments_template()` loaded all of a post's
comments into memory, and passed them to `wp_list_comments()` and
`Walker_Comment`, the latter of which produced markup for only the
current page of comments. In other words, it was possible to enable
'page_comments', thereby showing only a subset of a post's comments on a given
page, but all comments continued to be loaded in the background. This technique
scaled poorly. Posts with hundreds or thousands of comments would load slowly,
or not at all, even when the 'comments_per_page' setting was set to a
reasonable number.
Recent changesets have addressed this problem through more efficient tree-
walking, better descendant caching, and more selective queries for top-level
post comments. The current changeset completes the project by addressing the
root issue: that loading a post causes all of its comments to be loaded too.
Here's the breakdown:
* Comment pagination is now forced. Setting 'page_comments' to false leads to evil things when you have many comments. If you want to avoid pagination, set 'comments_per_page' to something high.
* The 'page_comments' setting has been expunged from options-discussion.php, and from places in the codebase where it was referenced. For plugins relying on 'page_comments', we now force the value to `true` with a `pre_option` filter.
* `comments_template()` now queries for an appropriately small number of comments. Usually, this means the `comments_per_page` value.
* To preserve the current (odd) behavior for comment pagination links, some unholy hacks have been inserted into `comments_template()`. The ugliness is insulated in this function for backward compatibility and to minimize collateral damage. A side-effect is that, for certain settings of 'default_comments_page', up to 2x the value of `comments_per_page` might be fetched at a time.
* In support of these changes, a `$format` parameter has been added to `WP_Comment::get_children()`. This param allows you to request a flattened array of comment children, suitable for feeding into `Walker_Comment`.
* `WP_Query` loops are now informed about total available comment counts and comment pages by the `WP_Comment_Query` (`found_comments`, `max_num_pages`), instead of by `Walker_Comment`.
Aside from radical performance improvements in the case of a post with many
comments, this changeset fixes a bug that caused the first page of comments to
be partial (`found_comments` % `comments_per_page`), rather than the last, as
you'd expect.
Props boonebgorges, wonderboymusic.
Fixes #8071.
Built from https://develop.svn.wordpress.org/trunk@34561
git-svn-id: http://core.svn.wordpress.org/trunk@34525 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-09-25 22:40:25 +02:00
if ( ( 'newest' == get_option ( 'default_comments_page' ) && get_query_var ( 'cpage' ) > 0 ) || ( 'newest' != get_option ( 'default_comments_page' ) && get_query_var ( 'cpage' ) > 1 ) ) {
2015-02-14 04:48:27 +01:00
$addl_path = ( ! empty ( $addl_path ) ? trailingslashit ( $addl_path ) : '' ) . user_trailingslashit ( $wp_rewrite -> comments_pagination_base . '-' . get_query_var ( 'cpage' ), 'commentpaged' );
2008-11-14 23:48:22 +01:00
$redirect [ 'query' ] = remove_query_arg ( 'cpage' , $redirect [ 'query' ] );
2008-10-23 20:55:22 +02:00
}
2008-11-14 23:48:22 +01:00
2013-01-18 14:44:22 +01:00
$redirect [ 'path' ] = user_trailingslashit ( preg_replace ( '|/' . preg_quote ( $wp_rewrite -> index , '|' ) . '/?$|' , '/' , $redirect [ 'path' ]) ); // strip off trailing /index.php/
if ( ! empty ( $addl_path ) && $wp_rewrite -> using_index_permalinks () && strpos ( $redirect [ 'path' ], '/' . $wp_rewrite -> index . '/' ) === false )
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]) . $wp_rewrite -> index . '/' ;
2008-11-21 18:33:05 +01:00
if ( ! empty ( $addl_path ) )
2010-12-14 17:55:35 +01:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]) . $addl_path ;
$redirect_url = $redirect [ 'scheme' ] . '://' . $redirect [ 'host' ] . $redirect [ 'path' ];
2007-08-17 05:45:59 +02:00
}
2012-04-25 22:49:57 +02:00
if ( 'wp-register.php' == basename ( $redirect [ 'path' ] ) ) {
2014-04-25 09:12:14 +02:00
if ( is_multisite () ) {
2013-10-25 00:59:20 +02:00
/** This filter is documented in wp-login.php */
2012-09-11 14:27:25 +02:00
$redirect_url = apply_filters ( 'wp_signup_location' , network_site_url ( 'wp-signup.php' ) );
2014-04-25 09:12:14 +02:00
} else {
2015-09-15 19:11:35 +02:00
$redirect_url = wp_registration_url ();
2014-04-25 09:12:14 +02:00
}
2012-04-25 22:49:57 +02:00
wp_redirect ( $redirect_url , 301 );
die ();
}
2007-08-17 05:45:59 +02:00
}
2007-09-13 21:12:53 +02:00
// tack on any additional query vars
2008-11-14 23:48:22 +01:00
$redirect [ 'query' ] = preg_replace ( '#^\??&*?#' , '' , $redirect [ 'query' ] );
2008-11-02 21:53:15 +01:00
if ( $redirect_url && ! empty ( $redirect [ 'query' ]) ) {
2010-12-17 21:23:34 +01:00
parse_str ( $redirect [ 'query' ], $_parsed_query );
2010-12-17 21:57:03 +01: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' ] );
}
2012-04-27 17:40:00 +02:00
$_parsed_query = rawurlencode_deep ( $_parsed_query );
2010-12-17 21:23:34 +01:00
$redirect_url = add_query_arg ( $_parsed_query , $redirect_url );
2007-09-13 21:12:53 +02:00
}
2007-08-17 05:45:59 +02:00
2007-09-13 21:12:53 +02:00
if ( $redirect_url )
$redirect = @ parse_url ( $redirect_url );
2007-08-17 05:45:59 +02:00
2007-08-29 23:06:51 +02:00
// www.example.com vs example.com
2010-01-04 18:23:29 +01:00
$user_home = @ parse_url ( home_url ());
2008-10-16 18:08:00 +02:00
if ( ! empty ( $user_home [ 'host' ]) )
2008-05-09 20:23:05 +02:00
$redirect [ 'host' ] = $user_home [ 'host' ];
2008-10-16 18:08:00 +02:00
if ( empty ( $user_home [ 'path' ]) )
2008-10-14 23:08:28 +02:00
$user_home [ 'path' ] = '/' ;
2007-08-17 05:45:59 +02:00
2007-09-13 21:24:05 +02:00
// Handle ports
2008-10-16 18:08:00 +02:00
if ( ! empty ( $user_home [ 'port' ]) )
2007-09-13 21:24:05 +02:00
$redirect [ 'port' ] = $user_home [ 'port' ];
else
unset ( $redirect [ 'port' ]);
2008-10-16 21:17:04 +02:00
// trailing /index.php
2013-01-18 14:44:22 +01:00
$redirect [ 'path' ] = preg_replace ( '|/' . preg_quote ( $wp_rewrite -> index , '|' ) . '/*?$|' , '/' , $redirect [ 'path' ]);
2007-08-17 05:45:59 +02:00
2008-08-19 05:21:12 +02:00
// Remove trailing spaces from the path
$redirect [ 'path' ] = preg_replace ( '#(%20| )+$#' , '' , $redirect [ 'path' ] );
2008-10-16 18:08:00 +02:00
if ( ! empty ( $redirect [ 'query' ] ) ) {
2008-11-12 21:09:16 +01:00
// Remove trailing spaces from certain terminating query string args
2008-08-25 23:50:11 +02:00
$redirect [ 'query' ] = preg_replace ( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#' , '$1' , $redirect [ 'query' ] );
2008-08-19 05:21:12 +02:00
2008-08-25 23:50:11 +02:00
// Clean up empty query strings
2008-11-12 22:08:48 +01:00
$redirect [ 'query' ] = trim ( preg_replace ( '#(^|&)(p|page_id|cat|tag)=?(&|$)#' , '&' , $redirect [ 'query' ]), '&' );
2008-11-12 21:09:16 +01:00
2011-08-12 01:30:59 +02:00
// Redirect obsolete feeds
2013-06-22 14:09:28 +02:00
$redirect [ 'query' ] = preg_replace ( '#(^|&)feed=rss(&|$)#' , '$1feed=rss2$2' , $redirect [ 'query' ] );
2011-08-12 01:30:59 +02:00
2008-11-12 21:09:16 +01:00
// Remove redundant leading ampersands
2008-11-14 23:48:22 +01:00
$redirect [ 'query' ] = preg_replace ( '#^\??&*?#' , '' , $redirect [ 'query' ] );
2008-08-25 23:50:11 +02:00
}
2008-08-19 05:21:12 +02:00
2007-08-29 23:06:51 +02:00
// strip /index.php/ when we're not using PATHINFO permalinks
if ( ! $wp_rewrite -> using_index_permalinks () )
2013-01-18 14:44:22 +01:00
$redirect [ 'path' ] = str_replace ( '/' . $wp_rewrite -> index . '/' , '/' , $redirect [ 'path' ] );
2007-08-17 05:45:59 +02:00
2007-08-29 23:06:51 +02:00
// trailing slashes
2008-10-16 23:14:42 +02: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 23:06:51 +02:00
$user_ts_type = '' ;
if ( get_query_var ( 'paged' ) > 0 ) {
$user_ts_type = 'paged' ;
} else {
2008-10-16 23:14:42 +02:00
foreach ( array ( 'single' , 'category' , 'page' , 'day' , 'month' , 'year' , 'home' ) as $type ) {
2007-08-29 23:06:51 +02:00
$func = 'is_' . $type ;
2008-08-08 19:43:44 +02:00
if ( call_user_func ( $func ) ) {
2007-08-29 23:06:51 +02:00
$user_ts_type = $type ;
break ;
}
}
2008-08-08 19:43:44 +02:00
}
2007-08-29 23:06:51 +02:00
$redirect [ 'path' ] = user_trailingslashit ( $redirect [ 'path' ], $user_ts_type );
2008-10-16 23:14:42 +02:00
} elseif ( is_front_page () ) {
2007-09-14 21:41:23 +02:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]);
2007-08-29 23:06:51 +02:00
}
2010-02-13 01:11:23 +01:00
// Strip multiple slashes out of the URL
2010-02-13 09:29:55 +01:00
if ( strpos ( $redirect [ 'path' ], '//' ) > - 1 )
2010-02-13 07:17:59 +01:00
$redirect [ 'path' ] = preg_replace ( '|/+|' , '/' , $redirect [ 'path' ]);
2010-02-13 01:11:23 +01:00
2008-10-16 23:14:42 +02:00
// Always trailing slash the Front Page URL
if ( trailingslashit ( $redirect [ 'path' ] ) == trailingslashit ( $user_home [ 'path' ] ) )
2007-09-11 23:21:40 +02:00
$redirect [ 'path' ] = trailingslashit ( $redirect [ 'path' ]);
2007-09-12 22:44:41 +02:00
// Ignore differences in host capitalization, as this can lead to infinite redirects
2008-11-12 22:27:19 +01: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 22:44:41 +02:00
$redirect [ 'host' ] = $original [ 'host' ];
2014-10-29 19:37:25 +01:00
$compare_original = array ( $original [ 'host' ], $original [ 'path' ] );
2008-08-08 19:05:10 +02:00
2008-10-16 18:08:00 +02:00
if ( ! empty ( $original [ 'port' ] ) )
2008-08-08 19:05:10 +02:00
$compare_original [] = $original [ 'port' ];
2008-10-16 18:08:00 +02:00
if ( ! empty ( $original [ 'query' ] ) )
2008-08-08 19:05:10 +02:00
$compare_original [] = $original [ 'query' ];
2014-10-29 19:37:25 +01:00
$compare_redirect = array ( $redirect [ 'host' ], $redirect [ 'path' ] );
2008-08-08 19:05:10 +02:00
2008-10-16 18:08:00 +02:00
if ( ! empty ( $redirect [ 'port' ] ) )
2008-08-08 19:05:10 +02:00
$compare_redirect [] = $redirect [ 'port' ];
2008-10-16 18:08:00 +02:00
if ( ! empty ( $redirect [ 'query' ] ) )
2008-08-08 19:05:10 +02:00
$compare_redirect [] = $redirect [ 'query' ];
if ( $compare_original !== $compare_redirect ) {
2007-09-13 21:24:05 +02:00
$redirect_url = $redirect [ 'scheme' ] . '://' . $redirect [ 'host' ];
2008-10-16 18:08:00 +02:00
if ( ! empty ( $redirect [ 'port' ]) )
2008-10-27 17:31:26 +01:00
$redirect_url .= ':' . $redirect [ 'port' ];
2007-09-13 21:24:05 +02:00
$redirect_url .= $redirect [ 'path' ];
2008-10-16 18:08:00 +02:00
if ( ! empty ( $redirect [ 'query' ]) )
2007-08-29 23:06:51 +02:00
$redirect_url .= '?' . $redirect [ 'query' ];
2007-08-17 05:45:59 +02:00
}
2015-05-21 22:30:25 +02:00
if ( ! $redirect_url || $redirect_url == $requested_url ) {
return ;
}
2010-10-21 21:55:28 +02:00
2010-10-19 09:48:22 +02:00
// Hex encoded octets are case-insensitive.
2010-07-18 15:46:35 +02:00
if ( false !== strpos ( $requested_url , '%' ) ) {
if ( ! function_exists ( 'lowercase_octets' ) ) {
2010-10-19 09:48:22 +02:00
function lowercase_octets ( $matches ) {
return strtolower ( $matches [ 0 ] );
}
2010-07-18 15:46:35 +02:00
}
$requested_url = preg_replace_callback ( '|%[a-fA-F0-9][a-fA-F0-9]|' , 'lowercase_octets' , $requested_url );
}
2013-09-21 01:31:10 +02:00
/**
* Filter the canonical redirect URL .
*
* 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 23:57:15 +01:00
2015-05-21 22:30:25 +02:00
// yes, again -- in case the filter aborted the request
if ( ! $redirect_url || $redirect_url == $requested_url ) {
return ;
}
2008-02-06 23:57:15 +01:00
if ( $do_redirect ) {
// protect against chained redirects
if ( ! redirect_canonical ( $redirect_url , false ) ) {
wp_redirect ( $redirect_url , 301 );
exit ();
2007-09-11 23:21:40 +02:00
} else {
2008-10-14 07:51:01 +02:00
// Debug
// die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) );
2015-05-21 22:30:25 +02:00
return ;
2007-09-11 23:21:40 +02:00
}
} else {
2008-02-06 23:57:15 +01:00
return $redirect_url ;
2007-08-17 05:45:59 +02:00
}
}
2012-04-07 03:03:55 +02: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 19:57:12 +01:00
* @ since 3.4 . 0
2012-04-07 03:03:55 +02:00
* @ access private
*
2014-12-01 02:34:24 +01:00
* @ param string $query_string
* @ param array $args_to_check
* @ param string $url
2012-04-07 03:03:55 +02:00
* @ 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 );
2012-05-01 20:26:38 +02:00
if ( ! empty ( $parsed_url [ 'query' ] ) ) {
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 );
}
} else {
$query_string = remove_query_arg ( $args_to_check , $query_string );
2012-04-07 03:03:55 +02:00
}
return $query_string ;
}
2007-12-25 21:48:47 +01:00
/**
2012-06-25 22:41:14 +02:00
* Attempts to guess the correct URL based on query vars
2007-12-25 21:48:47 +01:00
*
2008-08-27 08:45:13 +02:00
* @ since 2.3 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2007-12-25 21:48:47 +01:00
*
2015-05-21 22:30:25 +02:00
* @ return false | string The correct URL if one is found . False on failure .
2007-12-25 21:48:47 +01:00
*/
2012-06-25 22:41:14 +02:00
function redirect_guess_404_permalink () {
2015-09-22 22:27:25 +02:00
global $wpdb ;
2012-01-28 21:40:55 +01:00
if ( get_query_var ( 'name' ) ) {
2014-06-10 02:44:15 +02:00
$where = $wpdb -> prepare ( " post_name LIKE %s " , $wpdb -> esc_like ( get_query_var ( 'name' ) ) . '%' );
2012-01-28 21:40:55 +01:00
// 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' ));
2012-05-02 19:39:43 +02:00
else
$where .= " AND post_type IN (' " . implode ( " ', ' " , get_post_types ( array ( 'public' => true ) ) ) . " ') " ;
2012-01-28 21:40:55 +01: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' ));
$post_id = $wpdb -> get_var ( " SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish' " );
if ( ! $post_id )
return false ;
2012-04-07 07:39:08 +02:00
if ( get_query_var ( 'feed' ) )
return get_post_comments_feed_link ( $post_id , get_query_var ( 'feed' ) );
2015-09-24 16:04:24 +02:00
elseif ( get_query_var ( 'page' ) && 1 < get_query_var ( 'page' ) )
2012-04-07 07:39:08 +02:00
return trailingslashit ( get_permalink ( $post_id ) ) . user_trailingslashit ( get_query_var ( 'page' ), 'single_paged' );
else
return get_permalink ( $post_id );
2012-01-28 21:40:55 +01:00
}
2007-08-17 05:45:59 +02:00
2012-01-28 21:40:55 +01:00
return false ;
2007-08-17 05:45:59 +02:00
}
2015-05-22 06:26:26 +02:00
/**
*
* @ global WP_Rewrite $wp_rewrite
*/
2012-02-08 21:11:52 +01: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 ) ) {
2015-09-15 19:11:35 +02:00
wp_redirect ( wp_login_url () );
2012-02-08 21:11:52 +01:00
exit ;
}
}