Custom permalink structure with a prefix just for posts

There are different ways to achieve this result, I used
pre_post_link and post_rewrite_rules filter hooks.

You can use eg. generate_rewrite_rules hook, but with post_rewrite_rules,
you can easily change permalinks not only to the post but also to its comments, attachments, etc.
Original permalinks you can keep or replace with new ones.

After adding the following code click Save in Dashboard -> Settings -> Permalinks.

add_filter('pre_post_link', 'se332921_pre_post_link', 20, 3);
add_filter('post_rewrite_rules', 'se332921_post_rewrite_rules');

/**
 * @param string  $permalink The site's permalink structure.
 * @param WP_Post $post      The post in question.
 * @param bool    $leavename Whether to keep the post name.
 */
function se332921_pre_post_link($permalink, $post, $leavename)
{
    if ( $post instanceof WP_Post && $post->post_type == 'post')
        $permalink = '/post-prefix'.$permalink;
    return $permalink;
}

/**
 * @param array $post_rewrite The rewrite rules for posts.
 */
function se332921_post_rewrite_rules($post_rewrite) 
{
    if ( is_array($post_rewrite) ) 
    {
        $rw_prefix = [];
        foreach( $post_rewrite as $k => $v) {
            $rw_prefix[ 'post-prefix/'.$k] = $v;
        }
        //
        // merge to keep original rules
        $post_rewrite = array_merge($rw_prefix, $post_rewrite);
        //
        // or return only prefixed:
        // $post_rewrite = $rw_prefix;
    }
    return $post_rewrite;
}

Leave a Comment

tech