100 |
101 |
101 $post_id = get_query_var( 'p' ); |
102 $post_id = get_query_var( 'p' ); |
102 |
103 |
103 if ( is_feed() && $post_id ) { |
104 if ( is_feed() && $post_id ) { |
104 $redirect_url = get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); |
105 $redirect_url = get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); |
|
106 $redirect_obj = get_post( $post_id ); |
105 |
107 |
106 if ( $redirect_url ) { |
108 if ( $redirect_url ) { |
107 $redirect['query'] = _remove_qs_args_if_not_in_url( |
109 $redirect['query'] = _remove_qs_args_if_not_in_url( |
108 $redirect['query'], |
110 $redirect['query'], |
109 array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type', 'feed' ), |
111 array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type', 'feed' ), |
124 if ( 'revision' === $vars->post_type && $vars->post_parent > 0 ) { |
126 if ( 'revision' === $vars->post_type && $vars->post_parent > 0 ) { |
125 $post_id = $vars->post_parent; |
127 $post_id = $vars->post_parent; |
126 } |
128 } |
127 |
129 |
128 $redirect_url = get_permalink( $post_id ); |
130 $redirect_url = get_permalink( $post_id ); |
|
131 $redirect_obj = get_post( $post_id ); |
129 |
132 |
130 if ( $redirect_url ) { |
133 if ( $redirect_url ) { |
131 $redirect['query'] = _remove_qs_args_if_not_in_url( |
134 $redirect['query'] = _remove_qs_args_if_not_in_url( |
132 $redirect['query'], |
135 $redirect['query'], |
133 array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), |
136 array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), |
146 $redirect_post = $post_id ? get_post( $post_id ) : false; |
149 $redirect_post = $post_id ? get_post( $post_id ) : false; |
147 |
150 |
148 if ( $redirect_post ) { |
151 if ( $redirect_post ) { |
149 $post_type_obj = get_post_type_object( $redirect_post->post_type ); |
152 $post_type_obj = get_post_type_object( $redirect_post->post_type ); |
150 |
153 |
151 if ( $post_type_obj->public && 'auto-draft' !== $redirect_post->post_status ) { |
154 if ( $post_type_obj && $post_type_obj->public && 'auto-draft' !== $redirect_post->post_status ) { |
152 $redirect_url = get_permalink( $redirect_post ); |
155 $redirect_url = get_permalink( $redirect_post ); |
|
156 $redirect_obj = get_post( $redirect_post ); |
153 |
157 |
154 $redirect['query'] = _remove_qs_args_if_not_in_url( |
158 $redirect['query'] = _remove_qs_args_if_not_in_url( |
155 $redirect['query'], |
159 $redirect['query'], |
156 array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), |
160 array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), |
157 $redirect_url |
161 $redirect_url |
195 $post_id = $wp_query->post->ID; |
199 $post_id = $wp_query->post->ID; |
196 } |
200 } |
197 |
201 |
198 if ( $post_id ) { |
202 if ( $post_id ) { |
199 $redirect_url = get_permalink( $post_id ); |
203 $redirect_url = get_permalink( $post_id ); |
|
204 $redirect_obj = get_post( $post_id ); |
200 |
205 |
201 $redirect['path'] = rtrim( $redirect['path'], (int) get_query_var( 'page' ) . '/' ); |
206 $redirect['path'] = rtrim( $redirect['path'], (int) get_query_var( 'page' ) . '/' ); |
202 $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); |
207 $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); |
203 } |
208 } |
204 } |
209 } |
221 && ! array_diff( array_keys( $wp->query_vars ), array( 'attachment', 'attachment_id' ) ) |
226 && ! array_diff( array_keys( $wp->query_vars ), array( 'attachment', 'attachment_id' ) ) |
222 && ! $redirect_url |
227 && ! $redirect_url |
223 ) { |
228 ) { |
224 if ( ! empty( $_GET['attachment_id'] ) ) { |
229 if ( ! empty( $_GET['attachment_id'] ) ) { |
225 $redirect_url = get_attachment_link( get_query_var( 'attachment_id' ) ); |
230 $redirect_url = get_attachment_link( get_query_var( 'attachment_id' ) ); |
|
231 $redirect_obj = get_post( get_query_var( 'attachment_id' ) ); |
226 |
232 |
227 if ( $redirect_url ) { |
233 if ( $redirect_url ) { |
228 $redirect['query'] = remove_query_arg( 'attachment_id', $redirect['query'] ); |
234 $redirect['query'] = remove_query_arg( 'attachment_id', $redirect['query'] ); |
229 } |
235 } |
230 } else { |
236 } else { |
231 $redirect_url = get_attachment_link(); |
237 $redirect_url = get_attachment_link(); |
|
238 $redirect_obj = get_post(); |
232 } |
239 } |
233 } elseif ( is_single() && ! empty( $_GET['p'] ) && ! $redirect_url ) { |
240 } elseif ( is_single() && ! empty( $_GET['p'] ) && ! $redirect_url ) { |
234 $redirect_url = get_permalink( get_query_var( 'p' ) ); |
241 $redirect_url = get_permalink( get_query_var( 'p' ) ); |
|
242 $redirect_obj = get_post( get_query_var( 'p' ) ); |
235 |
243 |
236 if ( $redirect_url ) { |
244 if ( $redirect_url ) { |
237 $redirect['query'] = remove_query_arg( array( 'p', 'post_type' ), $redirect['query'] ); |
245 $redirect['query'] = remove_query_arg( array( 'p', 'post_type' ), $redirect['query'] ); |
238 } |
246 } |
239 } elseif ( is_single() && ! empty( $_GET['name'] ) && ! $redirect_url ) { |
247 } elseif ( is_single() && ! empty( $_GET['name'] ) && ! $redirect_url ) { |
240 $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); |
248 $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); |
|
249 $redirect_obj = get_post( $wp_query->get_queried_object_id() ); |
241 |
250 |
242 if ( $redirect_url ) { |
251 if ( $redirect_url ) { |
243 $redirect['query'] = remove_query_arg( 'name', $redirect['query'] ); |
252 $redirect['query'] = remove_query_arg( 'name', $redirect['query'] ); |
244 } |
253 } |
245 } elseif ( is_page() && ! empty( $_GET['page_id'] ) && ! $redirect_url ) { |
254 } elseif ( is_page() && ! empty( $_GET['page_id'] ) && ! $redirect_url ) { |
246 $redirect_url = get_permalink( get_query_var( 'page_id' ) ); |
255 $redirect_url = get_permalink( get_query_var( 'page_id' ) ); |
|
256 $redirect_obj = get_post( get_query_var( 'page_id' ) ); |
247 |
257 |
248 if ( $redirect_url ) { |
258 if ( $redirect_url ) { |
249 $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); |
259 $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); |
250 } |
260 } |
251 } elseif ( is_page() && ! is_feed() && ! $redirect_url |
261 } elseif ( is_page() && ! is_feed() && ! $redirect_url |
254 $redirect_url = home_url( '/' ); |
264 $redirect_url = home_url( '/' ); |
255 } elseif ( is_home() && ! empty( $_GET['page_id'] ) && ! $redirect_url |
265 } elseif ( is_home() && ! empty( $_GET['page_id'] ) && ! $redirect_url |
256 && 'page' === get_option( 'show_on_front' ) && get_query_var( 'page_id' ) === (int) get_option( 'page_for_posts' ) |
266 && 'page' === get_option( 'show_on_front' ) && get_query_var( 'page_id' ) === (int) get_option( 'page_for_posts' ) |
257 ) { |
267 ) { |
258 $redirect_url = get_permalink( get_option( 'page_for_posts' ) ); |
268 $redirect_url = get_permalink( get_option( 'page_for_posts' ) ); |
|
269 $redirect_obj = get_post( get_option( 'page_for_posts' ) ); |
259 |
270 |
260 if ( $redirect_url ) { |
271 if ( $redirect_url ) { |
261 $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); |
272 $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); |
262 } |
273 } |
263 } elseif ( ! empty( $_GET['m'] ) && ( is_year() || is_month() || is_day() ) ) { |
274 } elseif ( ! empty( $_GET['m'] ) && ( is_year() || is_month() || is_day() ) ) { |
308 |
319 |
309 if ( false !== $author |
320 if ( false !== $author |
310 && $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 ) ) |
321 && $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 ) ) |
311 ) { |
322 ) { |
312 $redirect_url = get_author_posts_url( $author->ID, $author->user_nicename ); |
323 $redirect_url = get_author_posts_url( $author->ID, $author->user_nicename ); |
|
324 $redirect_obj = $author; |
313 |
325 |
314 if ( $redirect_url ) { |
326 if ( $redirect_url ) { |
315 $redirect['query'] = remove_query_arg( 'author', $redirect['query'] ); |
327 $redirect['query'] = remove_query_arg( 'author', $redirect['query'] ); |
316 } |
328 } |
317 } |
329 } |
383 |
395 |
384 if ( ! $category || is_wp_error( $category ) |
396 if ( ! $category || is_wp_error( $category ) |
385 || ! has_term( $category->term_id, 'category', $wp_query->get_queried_object_id() ) |
397 || ! has_term( $category->term_id, 'category', $wp_query->get_queried_object_id() ) |
386 ) { |
398 ) { |
387 $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); |
399 $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); |
|
400 $redirect_obj = get_post( $wp_query->get_queried_object_id() ); |
388 } |
401 } |
389 } |
402 } |
390 } |
403 } |
391 |
404 |
392 // Post paging. |
405 // Post paging. |
393 if ( is_singular() && get_query_var( 'page' ) ) { |
406 if ( is_singular() && get_query_var( 'page' ) ) { |
394 $page = get_query_var( 'page' ); |
407 $page = get_query_var( 'page' ); |
395 |
408 |
396 if ( ! $redirect_url ) { |
409 if ( ! $redirect_url ) { |
397 $redirect_url = get_permalink( get_queried_object_id() ); |
410 $redirect_url = get_permalink( get_queried_object_id() ); |
|
411 $redirect_obj = get_post( get_queried_object_id() ); |
398 } |
412 } |
399 |
413 |
400 if ( $page > 1 ) { |
414 if ( $page > 1 ) { |
401 $redirect_url = trailingslashit( $redirect_url ); |
415 $redirect_url = trailingslashit( $redirect_url ); |
402 |
416 |
738 } |
752 } |
739 |
753 |
740 $requested_url = preg_replace_callback( '|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url ); |
754 $requested_url = preg_replace_callback( '|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url ); |
741 } |
755 } |
742 |
756 |
|
757 if ( $redirect_obj instanceof WP_Post ) { |
|
758 $post_status_obj = get_post_status_object( get_post_status( $redirect_obj ) ); |
|
759 /* |
|
760 * Unset the redirect object and URL if they are not readable by the user. |
|
761 * This condition is a little confusing as the condition needs to pass if |
|
762 * the post is not readable by the user. That's why there are ! (not) conditions |
|
763 * throughout. |
|
764 */ |
|
765 if ( |
|
766 // Private post statuses only redirect if the user can read them. |
|
767 ! ( |
|
768 $post_status_obj->private && |
|
769 current_user_can( 'read_post', $redirect_obj->ID ) |
|
770 ) && |
|
771 // For other posts, only redirect if publicly viewable. |
|
772 ! is_post_publicly_viewable( $redirect_obj ) |
|
773 ) { |
|
774 $redirect_obj = false; |
|
775 $redirect_url = false; |
|
776 } |
|
777 } |
|
778 |
743 /** |
779 /** |
744 * Filters the canonical redirect URL. |
780 * Filters the canonical redirect URL. |
745 * |
781 * |
746 * Returning false to this filter will cancel the redirect. |
782 * Returning false to this filter will cancel the redirect. |
747 * |
783 * |
893 $where = $wpdb->prepare( 'post_name LIKE %s', $wpdb->esc_like( get_query_var( 'name' ) ) . '%' ); |
929 $where = $wpdb->prepare( 'post_name LIKE %s', $wpdb->esc_like( get_query_var( 'name' ) ) . '%' ); |
894 } |
930 } |
895 |
931 |
896 // If any of post_type, year, monthnum, or day are set, use them to refine the query. |
932 // If any of post_type, year, monthnum, or day are set, use them to refine the query. |
897 if ( get_query_var( 'post_type' ) ) { |
933 if ( get_query_var( 'post_type' ) ) { |
898 $where .= $wpdb->prepare( ' AND post_type = %s', get_query_var( 'post_type' ) ); |
934 if ( is_array( get_query_var( 'post_type' ) ) ) { |
|
935 // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare |
|
936 $where .= " AND post_type IN ('" . join( "', '", esc_sql( get_query_var( 'post_type' ) ) ) . "')"; |
|
937 } else { |
|
938 $where .= $wpdb->prepare( ' AND post_type = %s', get_query_var( 'post_type' ) ); |
|
939 } |
899 } else { |
940 } else { |
900 $where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')"; |
941 $where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')"; |
901 } |
942 } |
902 |
943 |
903 if ( get_query_var( 'year' ) ) { |
944 if ( get_query_var( 'year' ) ) { |