My permalinks is set to /%post_id%/ (post id).


I want to change them all to /%postname%/ (which is the post slug).


Problem is, whenever I change it, it gives 404 errors from my old page urls.

for example, this: https://elrons.co.il/1779/

should change to: https://elrons.co.il/pil-kahol-font/

But it gives 404 instead.

How do I make 301 redirection from /%post_id%/ to /%postname%/?


I've written my own solution, sharing it and hoping it will help someone.

Add this to your functions.php:


add_action('parse_request', 'redirect_postid_to_postname');
function redirect_postid_to_postname($wp)
    // If /%post_id%/
    if (is_numeric($wp->request)) {

        $post_id = $wp->request;
        $slug = get_post_field( 'post_name', $post_id );

        // If the post slug === the post number, prevent redirection loops.
        if ($slug !== $post_id) {
            // Adding url parameters manually to $redirect_to
            $parameters = $_SERVER[QUERY_STRING];

            $redirect_from = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
            $redirect_to = get_permalink($post_id) . (!empty($parameters) ? ("?" . $parameters) : "");
            // Prevent loops
            if($redirect_from !== $redirect_to) {
                wp_redirect($redirect_to, 301);


You can do it by .htaccess file, for your case url format as;

Redirect 301 /%post_id%/ https://elrons.co.il/%postname%/


By redirection plugin, for example 301 Redirects – Easy Redirect Manager

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.