admin管理员组

文章数量:1426292

my posts have urls of two different types: one with post id and other with post slug:

/post/789
/post/my-post-slug

i'm doing this using:

add_rewrite_rule(
    'post/(\d+)/?',
    'index.php?p=$matches[1]',
    'top'
);

and setting up permalinks using %post_name%.

both /post/123 and /post/my-post-slug open the same html page.

is it possible to make wordpress return the 301 redirect to /post/my-post-slug when accessing /post/123?

my posts have urls of two different types: one with post id and other with post slug:

/post/789
/post/my-post-slug

i'm doing this using:

add_rewrite_rule(
    'post/(\d+)/?',
    'index.php?p=$matches[1]',
    'top'
);

and setting up permalinks using %post_name%.

both /post/123 and /post/my-post-slug open the same html page.

is it possible to make wordpress return the 301 redirect to /post/my-post-slug when accessing /post/123?

Share Improve this question edited May 22, 2019 at 0:18 whyer asked May 22, 2019 at 0:01 whyerwhyer 1013 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

yes, it is possible. add a template_redirect hook handler:

add_filter('template_redirect', 'redirect_post_to_canonical_url');

function redirect_post_to_canonical_url(): void
{
    if (!is_single()) {
        // do not redirect nothing else except posts
        return;
    }


    $canonicalLocation = get_permalink();
    $requestUri = $_SERVER['REQUEST_URI'];
    $currentLocation = home_url('/') . substr($requestUri, 1);
    if ($currentLocation === $canonicalLocation) {
        // prevent from infinite redirect loop
        return;
    }

    wp_redirect($canonicalLocation, 301);
}

本文标签: categoriesHow to 301 redirect from url with post id to permalink with post name (slug)