WordPress Version: 6.5
/**
* Attempts to guess the correct URL for a 404 request based on query vars.
*
* @since 2.3.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @return string|false The correct URL if one is found. False on failure.
*/
function redirect_guess_404_permalink()
{
global $wpdb;
/**
* Filters whether to attempt to guess a redirect URL for a 404 request.
*
* Returning a false value from the filter will disable the URL guessing
* and return early without performing a redirect.
*
* @since 5.5.0
*
* @param bool $do_redirect_guess Whether to attempt to guess a redirect URL
* for a 404 request. Default true.
*/
if (false === apply_filters('do_redirect_guess_404_permalink', true)) {
return false;
}
/**
* Short-circuits the redirect URL guessing for 404 requests.
*
* Returning a non-null value from the filter will effectively short-circuit
* the URL guessing, returning the passed value instead.
*
* @since 5.5.0
*
* @param null|string|false $pre Whether to short-circuit guessing the redirect for a 404.
* Default null to continue with the URL guessing.
*/
$pre = apply_filters('pre_redirect_guess_404_permalink', null);
if (null !== $pre) {
return $pre;
}
if (get_query_var('name')) {
$publicly_viewable_statuses = array_filter(get_post_stati(), 'is_post_status_viewable');
$publicly_viewable_post_types = array_filter(get_post_types(array('exclude_from_search' => false)), 'is_post_type_viewable');
/**
* Filters whether to perform a strict guess for a 404 redirect.
*
* Returning a truthy value from the filter will redirect only exact post_name matches.
*
* @since 5.5.0
*
* @param bool $strict_guess Whether to perform a strict guess. Default false (loose guess).
*/
$strict_guess = apply_filters('strict_redirect_guess_404_permalink', false);
if ($strict_guess) {
$where = $wpdb->prepare('post_name = %s', get_query_var('name'));
} else {
$where = $wpdb->prepare('post_name LIKE %s', $wpdb->esc_like(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')) {
if (is_array(get_query_var('post_type'))) {
$post_types = array_intersect(get_query_var('post_type'), $publicly_viewable_post_types);
if (empty($post_types)) {
return false;
}
$where .= " AND post_type IN ('" . join("', '", esc_sql(get_query_var('post_type'))) . "')";
} else {
if (!in_array(get_query_var('post_type'), $publicly_viewable_post_types, true)) {
return false;
}
$where .= $wpdb->prepare(' AND post_type = %s', get_query_var('post_type'));
}
} else {
$where .= " AND post_type IN ('" . implode("', '", esc_sql($publicly_viewable_post_types)) . "')";
}
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'));
}
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
$post_id = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE {$where} AND post_status IN ('" . implode("', '", esc_sql($publicly_viewable_statuses)) . "')");
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') > 1) {
return trailingslashit(get_permalink($post_id)) . user_trailingslashit(get_query_var('page'), 'single_paged');
} else {
return get_permalink($post_id);
}
}
return false;
}