if ( !isset($redirect['query']) )
$redirect['query'] = '';
+ 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 );
+ }
+ }
+
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) );
$id = $vars->post_parent;
if ( $redirect_url = get_permalink($id) )
- $redirect['query'] = remove_query_arg(array('p', 'page_id', 'attachment_id', 'post_type'), $redirect['query']);
+ $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url );
}
}
$post_type_obj = get_post_type_object($redirect_post->post_type);
if ( $post_type_obj->public ) {
$redirect_url = get_permalink($redirect_post);
- $redirect['query'] = remove_query_arg(array('p', 'page_id', 'attachment_id', 'post_type'), $redirect['query']);
+ $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url );
}
}
- if ( ! $redirect_url )
- $redirect_url = redirect_guess_404_permalink();
+ if ( ! $redirect_url ) {
+ if ( $redirect_url = redirect_guess_404_permalink() ) {
+ $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 );
+ }
+ }
} elseif ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) {
// rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101
}
}
- } elseif ( is_single() && strpos($wp_rewrite->permalink_structure, '%category%') !== false ) {
- $category = get_category_by_path(get_query_var('category_name'));
+ } elseif ( is_single() && strpos($wp_rewrite->permalink_structure, '%category%') !== false && $cat = get_query_var( 'category_name' ) ) {
+ $category = get_category_by_path( $cat );
$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) ) )
$redirect_url = get_permalink($wp_query->get_queried_object_id());
}
// Post Paging
- if ( is_singular() && get_query_var('page') && $redirect_url ) {
+ if ( is_singular() && ! is_front_page() && get_query_var('page') ) {
+ if ( !$redirect_url )
+ $redirect_url = get_permalink( get_queried_object_id() );
$redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' );
$redirect['query'] = remove_query_arg( 'page', $redirect['query'] );
}
$addl_path = '';
if ( is_feed() && in_array( get_query_var('feed'), $wp_rewrite->feeds ) ) {
$addl_path = !empty( $addl_path ) ? trailingslashit($addl_path) : '';
- if ( get_query_var( 'withcomments' ) )
+ if ( !is_singular() && get_query_var( 'withcomments' ) )
$addl_path .= 'comments/';
if ( ( 'rss' == get_default_feed() && 'feed' == get_query_var('feed') ) || 'rss' == get_query_var('feed') )
$addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == 'rss2' ) ? '' : 'rss2' ), 'feed' );
$redirect['path'] = trailingslashit($redirect['path']) . $addl_path;
$redirect_url = $redirect['scheme'] . '://' . $redirect['host'] . $redirect['path'];
}
+
+ if ( 'wp-register.php' == basename( $redirect['path'] ) ) {
+ if ( is_multisite() )
+ $redirect_url = apply_filters( 'wp_signup_location', site_url( 'wp-signup.php' ) );
+ else
+ $redirect_url = site_url( 'wp-login.php?action=register' );
+ wp_redirect( $redirect_url, 301 );
+ die();
+ }
}
// tack on any additional query vars
unset( $_parsed_query['name'] );
}
- $_parsed_query = array_map( 'rawurlencode', $_parsed_query );
+ $_parsed_query = rawurlencode_deep( $_parsed_query );
$redirect_url = add_query_arg( $_parsed_query, $redirect_url );
}
$requested_url = preg_replace_callback('|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url);
}
- // Note that you can use the "redirect_canonical" filter to cancel a canonical redirect for whatever reason by returning FALSE
+ // Note that you can use the "redirect_canonical" filter to cancel a canonical redirect for whatever reason by returning false
$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
}
/**
- * Attempts to guess correct post based on query vars.
+ * 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 );
+ 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 );
+ }
+ return $query_string;
+}
+
+/**
+ * Attempts to guess the correct URL based on query vars
*
* @since 2.3.0
* @uses $wpdb
*
- * @return bool|string Returns False, if it can't find post, returns correct
- * location on success.
+ * @return bool|string The correct URL if one is found. False on failure.
*/
function redirect_guess_404_permalink() {
- global $wpdb;
+ global $wpdb, $wp_rewrite;
+
+ 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'));
+ else
+ $where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')";
+
+ 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;
+ 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 );
+ }
- if ( !get_query_var('name') )
- return false;
+ return false;
+}
+
+add_action('template_redirect', 'redirect_canonical');
- $where = $wpdb->prepare("post_name LIKE %s", like_escape( get_query_var('name') ) . '%');
+function wp_redirect_admin_locations() {
+ global $wp_rewrite;
+ if ( ! ( is_404() && $wp_rewrite->using_permalinks() ) )
+ return;
- // 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'));
+ $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;
+ }
- $post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'");
- if ( !$post_id )
- return false;
- return get_permalink($post_id);
+ $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;
+ }
}
-add_action('template_redirect', 'redirect_canonical');
-
-?>
+add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );