We have a site with categories and subcategories.

If anybody navigates to a content belongs to a subcategory the url will have the following form: domain/main-category/sub-category/mycontent/ But we need another form: domain/main-category/mycontent where mycontent belongs a subcategory inside main-category, but we don't want the subcategory to be displayed in the URL.

Is there any possible solution for this?

7 Answers 7


If you go to Settings->Permalinks you should be able to set the tag/category base URL rules which should solve this problem.

Or, use some sort of plugin to do what you want. This one came up first on Google: http://wordpress.org/plugins/custom-permalinks/


try the following code :

function remove_child_categories_from_permalinks( $category ) {
    while ( $category->parent ) {
        $category = get_term( $category->parent, 'category' );
    return $category;
add_filter( 'post_link_category', 'remove_child_categories_from_permalinks' );

Yes you can! Just select the primary category of the post.

I am sorry that this screenshot is german, but it is pretty self-explaining. Here we have a main group "Party" with a subgroup "Rezepte". We can set the url to only "/party" by selecting that category as a new main.

Wordpress select primary category

The screenshot is taken from WordPress 5.8

Also make sure your permalink structure (Settings->Permalinks) is set to /%category%/%postname%!


You can rewrite you .htaccess if you are familiar with this.

Add the below line and try it:

RewriteRule ^category/(.+)$ http://www.site.com/$1 [R=301,L]

This should work fine. Add this to your end of functions.php file.

examplesite.com/wp-content/theme/yourtheme/functions.php <<- right there.

// Remove category base
add_filter('category_link', 'no_category_parents',1000,2);
function no_category_parents($catlink, $category_id) {
    $category = &get_category( $category_id );
    if ( is_wp_error( $category ) )
        return $category;
    $category_nicename = $category->slug;

    $catlink = trailingslashit(get_option( 'home' )) . user_trailingslashit( $category_nicename, 'category' );
    return $catlink;

// Add our custom category rewrite rules
add_filter('category_rewrite_rules', 'no_category_parents_rewrite_rules');
function no_category_parents_rewrite_rules($category_rewrite) {
    //print_r($category_rewrite); // For Debugging

    foreach($categories as $category) {
        $category_nicename = $category->slug;
        $category_rewrite['('.$category_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite['('.$category_nicename.')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite['('.$category_nicename.')/?$'] = 'index.php?category_name=$matches[1]';
    // Redirect support from Old Category Base
    global $wp_rewrite;
    $old_base = $wp_rewrite->get_category_permastruct();
    $old_base = str_replace( '%category%', '(.+)', $old_base );
    $old_base = trim($old_base, '/');
    $category_rewrite[$old_base.'$'] = 'index.php?category_redirect=$matches[1]';

    //print_r($category_rewrite); // For Debugging
    return $category_rewrite;

// Add 'category_redirect' query variable
add_filter('query_vars', 'no_category_parents_query_vars');
function no_category_parents_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
// Redirect if 'category_redirect' is set
add_filter('request', 'no_category_parents_request');
function no_category_parents_request($query_vars) {
    //print_r($query_vars); // For Debugging
    if(isset($query_vars['category_redirect'])) {
        $catlink = trailingslashit(get_option( 'home' )) . user_trailingslashit( $query_vars['category_redirect'], 'category' );
        header("Location: $catlink");
    return $query_vars;
  • 2
    Even though your code contains quite some comments and we appreciate you trying to answer the question, this is considered code dumping. Could you elaborate on your answer?
    – engelen
    Jun 20, 2014 at 9:08

If you're using WP Category permalink plugin then disable it and use the following as your permalink custom structure


That's it


Just go to:

www.example.com/wp-admin/options-permalink.php (Settings->Permalinks)

and choose /%category%/%postname%/

That should do it.!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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