Custom permalink structure leads to be 404 on pagination

I have a permalink issue. For your information, there are a few different categories within a website and there are many posts in a single category.

My permalink setting is:

Custom Stucture: /%category%/%postname%/

Category Base: .

After this setting saved, my url will be

www.mydomain.com/category-slug-name/

instead of

www.mydomain.com/category/category-slug-name/

I have set the Blog pages show at most: 8 posts under the Setting > Reading. The pagination will appear when there are more than 8 posts in a category page.

I clicked on “page 2”, and noticed that www.mydomain.com/category-slug-name/page/2/ brought me to 404 error page.

Originally, the url of any category “page2” is www.mydomain.com/category/category-slug-name/page/2/, it works fine if there is “category” within the url as original url. Or else, it would be 404 error page.

My main concern is, I don’t want the category appear in the url. But i want the slug name of category appear in url when i viewing the selected post. And “/page/2/” and the rest will work fine.

Hopefully that this issue is not going to be resolved with recommended plugins. Because, I don’t want the website to be too heavy.

Any suggestions?

5 s
5

That is totally normal behaviour. If you want to remove category base you will need to write some custom rewrite rules, not simple rules I must say. From my point of view, removing category base requires a extra job in each request that is worthless because it doesn’t provide any advantage for SEO or for better site navigation. Some popular plugins, like WordPres SEO by Yoast, had this option in the past and removed it some time ago. But this is just an opinion.

Configure category base to . (dot), put this code in the functions.php of your theme, or better in a plugin, and flush the rewrite rules (code from this post in Daily Web Kit):

add_filter( 'category_rewrite_rules', 'vipx_filter_category_rewrite_rules' );
function vipx_filter_category_rewrite_rules( $rules ) {
    $categories = get_categories( array( 'hide_empty' => false ) );

    if ( is_array( $categories ) && ! empty( $categories ) ) {
        $slugs = array();
        foreach ( $categories as $category ) {
            if ( is_object( $category ) && ! is_wp_error( $category ) ) {
                if ( 0 == $category->category_parent ) {
                    $slugs[] = $category->slug;
                } else {
                    $slugs[] = trim( get_category_parents( $category->term_id, false, "https://wordpress.stackexchange.com/", true ), "https://wordpress.stackexchange.com/" );
                }
            }
        }

        if ( ! empty( $slugs ) ) {
            $rules = array();

            foreach ( $slugs as $slug ) {
                $rules[ '(' . $slug . ')/feed/(feed|rdf|rss|rss2|atom)?/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
                $rules[ '(' . $slug . ')/(feed|rdf|rss|rss2|atom)/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
                $rules[ '(' . $slug . ')(/page/(\d)+/?)?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[3]';
            }
        }
    }
    return $rules;
}

Leave a Comment