WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Possible Duplicate:
Remove parent category from permalink? Basically only have the child category?

We've seen plugins to do this, and a lot of people with different code modifications. We really would like to achieve this the cleanest and simplest way possible, without worrying about out-dated plugins or causing problems with too many mods.

share|improve this question

marked as duplicate by EAMann Jan 26 '11 at 15:11

This question was marked as an exact duplicate of an existing question.

up vote 0 down vote accepted

Not sure how clean or easy this is, but it seems to work. This code pretty much does the job for this question and another one about removing the parent category from the permalinks. Got it from a plugin that does this, and decided to just use the raw code.

So the permalinks only have the lowest child-category listed.

First, we had:


and now...


The RSS feeds, however, don't seem to work with this shorter url, and still require the long-form url. (Not sure if there's a fix for that.) Paste the code below into your functions.php file. I'm using Wordpress 3.0+.

// 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;
share|improve this answer
Ouch, that's alot of work just to remove the category base. Its a shame you can't just pass a single parameter (or filter) to wp_list_categories and be done. – Scott B Jan 25 '11 at 16:54

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