Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change Wordpress' default posts permalinks programmatically?

In the backend of Wordpress I use the default http://localhost/sitename/example-post/ value for creating permalinks.

For custom post types I defined a custom slug this way, here is services for example:

register_post_type( 'service',
    array(
        'labels'      => array(
            'name'          => __( 'Services' ),
            'singular_name' => __( 'Service' )
        ),
        'public'      => true,
        'has_archive' => true,
        'rewrite'     => array(
            'slug'       => 'services',
            'with_front' => true
        ),
        'supports'    => array(
            'title',
            'editor',
            'excerpt',
            'thumbnail'
        ),
        'taxonomies'  => array( 'category' ),
    )
);

It creates services/post-name.

I also use this hook to create a custom page to create a custom page permalink:

function custom_base_rules() {
    global $wp_rewrite;

    $wp_rewrite->page_structure = $wp_rewrite->root . '/page/%pagename%/';
}

add_action( 'init', 'custom_base_rules' );

It creates page/post-name

Now the only thing I need to do is to create another custom permalink path for the normal Wordpress posts.

So the outcome world be for the post type of post:

post/post-name

I can't use the backed for this because I already defined a default way of handling the permalinks. I already managed to rewrite the paths of custom post types and pages...

How do I rewrite the normal post post type permalink path in Wordpress programmatically?

like image 328
Floris Avatar asked Aug 10 '26 22:08

Floris


1 Answers

You need to do it in two steps.

First enable rewrite with 'with_front' => true for the buildin post registration

add_filter(
    'register_post_type_args',
    function ($args, $post_type) {
        if ($post_type !== 'post') {
            return $args;
        }

        $args['rewrite'] = [
            'slug' => 'posts',
            'with_front' => true,
        ];

        return $args;
    },
    10,
    2
);

This way urls like http://foo.example/posts/a-title work but generated links in are now wrong.

Links can be fixed by forcing custom permalink structure for the buildin posts

add_filter(
    'pre_post_link',
    function ($permalink, $post) {
        if ($post->post_type !== 'post') {
            return $permalink;
        }

        return '/posts/%postname%/';
    },
    10,
    2
);

See https://github.com/WordPress/WordPress/blob/d46f9b4fb8fdf64e02a4a995c0c2ce9f014b9cb7/wp-includes/link-template.php#L166

like image 90
Epeli Avatar answered Aug 12 '26 11:08

Epeli



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!