wp/wp-includes/canonical.php
changeset 18 be944660c56a
parent 16 a86126ab1dd4
child 19 3d72ae0968f4
equal deleted inserted replaced
17:34716fd837a4 18:be944660c56a
    75 		return;
    75 		return;
    76 	}
    76 	}
    77 
    77 
    78 	$redirect     = $original;
    78 	$redirect     = $original;
    79 	$redirect_url = false;
    79 	$redirect_url = false;
       
    80 	$redirect_obj = false;
    80 
    81 
    81 	// Notice fixing.
    82 	// Notice fixing.
    82 	if ( ! isset( $redirect['path'] ) ) {
    83 	if ( ! isset( $redirect['path'] ) ) {
    83 		$redirect['path'] = '';
    84 		$redirect['path'] = '';
    84 	}
    85 	}
   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' ) ) {