Add rewrite rule to permalink structure

I have a Custom Structure setup for posts in Settings > Permalinks as:

/%category%/%post_id%-%postname%

This works great for most of my posts, but there is one category that I want to remove the post_id from so it looks like this:

/%category%/%postname%

So if the category is MOUSE and the post-id is 123 and postname(slug) is my-great-mouse-post, then the permalink correctly looks like this:

mydomain.com/mouse/123-my-great-mouse-post

But if the category is DOG then I do not want the post-id, so it should look like this:

mydomain.com/dog/my-great-dog-post

I understand how to use actions and filters in my functions.php and in a plugin and I think I want to use add_rewrite_rule but am honestly confused as how to write the rule as regex is complicated and I do not understand it.

1
1

1. Add a new rewrite rule:

add_action('init', function()
{
    add_rewrite_rule('^dog/([^/]+)/?$', 'index.php?cat=dog&name=$matches[1]', 'top');
}, 10, 0);

2. Filter the post link:

add_filter('post_link', function($post_link, $post, $leave_name = false, $sample = false)
{
    if ( is_object_in_term($post->ID, 'category', 'DOG') ) {
        $post_link = str_replace($post->ID . '-', '', $post_link);
    }

    return $post_link;

}, 10, 4);

Try it in your functions.php. Hope it works for you!

Leave a Comment