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

I've run into another wonderful 404 issue. I'm trying to have 2 seperate post types that share the same rewrite slug. I've flushed my rewrite rules, and when I test only 1 of the CPT works- the other gets a 404. My rewrite that I wish to use for both is:

'rewrite' => array('slug' => 'team/%teamtype%'),

Anyone know how to handle this?

add_action( 'init', 'create_rider_type' );

function create_rider_type() {

    'description' => 'rider custom post type',
    'show_ui' => true,
    'menu_position' => 5,
    'menu_icon' => get_stylesheet_directory_uri() . '/images/riders.png',
    'exclude_from_search' => false,
    'labels' => array(
        'name' => 'Team Riders',
        'singular_name' => 'Rider',
        'add_new' => 'Add New rider',
        'add_new_item' => 'Add New rider',
        'edit' => 'Edit riders',
        'edit_item' => 'Edit rider',
        'new_item' => 'New rider',
        'view' => 'View rider',
        'view_item' => 'View rider',
        'search_items' => 'Search riders',
        'not_found' => 'No riders found',
        'not_found_in_trash' => 'No riders found in Trash',
        'parent' => 'Parent rider',
    'hierarchical' => false,
    'supports' => array('title','editor','excerpt', 'trackbacks','custom-fields', 'comments','revisions','thumbnail','author','page-attributes'),
    'public' => true,
    'rewrite' => array('slug' => 'team/%teamtype%'),
    'taxonomies' => array('teamtype')


add_action( 'init', 'create_sponsor_type' );

function create_sponsor_type() {

    'description' => 'sponsor custom post type',
    'show_ui' => true,
    'menu_position' => 5,
    'menu_icon' => get_stylesheet_directory_uri() . '/images/sponsors.png',
    'exclude_from_search' => false,
    'labels' => array(
        'name' => 'Team sponsors',
        'singular_name' => 'sponsor',
        'add_new' => 'Add New sponsor',
        'add_new_item' => 'Add New sponsor',
        'edit' => 'Edit sponsors',
        'edit_item' => 'Edit sponsor',
        'new_item' => 'New sponsor',
        'view' => 'View sponsor',
        'view_item' => 'View sponsor',
        'search_items' => 'Search sponsors',
        'not_found' => 'No sponsors found',
        'not_found_in_trash' => 'No sponsors found in Trash',
        'parent' => 'Parent sponsor',
    'hierarchical' => false,
    'supports' => array('title','editor','excerpt', 'trackbacks','custom-fields', 'comments','revisions','thumbnail','author','page-attributes'),
    'public' => true,
    'rewrite' => array('slug' => 'team/%teamtype%'),
    'taxonomies' => array('teamtype')



The original CPT rewrite code I posted was simplified so I could get more straight to the point- however maybe it makes more sense if you can see how i'm handling those permalinks with my custom Taxonomy. I've updated the code to show.

I really wish to keep them as seperate post types- for organization as well as seperate metaboxes for each. Please check the updated rewrites for the CPT's, as well as my Taxonomy setup below:

add_action( 'init', 'create_team_taxonomies' );

function create_team_taxonomies() {
    'labels' => array(
        'name' => 'Team Types',
        'singular_name' => 'Team Type',
        'search_items' =>  'Search Team Types',
        'popular_items' => 'Popular Team Types',
        'all_items' => 'All Team Types',
        'parent_item' => 'Parent Team Type',
        'parent_item_colon' => 'Parent Team Type:',
        'edit_item' => 'Edit Team Type', 
        'update_item' => 'Update Team Type',
        'add_new_item' => 'Add New Team Type',
        'new_item_name' => 'New Team Type Name'
'hierarchical' => true, 
'public' => true,
'show_ui' => true,
'query_var' => 'teamtype',
'show_tagcloud' => true,
'rewrite' => array( 'slug' => 'team', 'with_front' => false) 


And here is how I setup the rewrite when I select the Taxonomy, and publish the post:

add_filter('post_link', 'teamtypepermalink', 10, 3);
add_filter('post_type_link', 'teamtypepermalink', 10, 3);

function teamtypepermalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%teamtype%') === FALSE) return $permalink;

    // Get post
    $post = get_post($post_id);
    if (!$post) return $permalink;

    // Get taxonomy terms
    $terms = wp_get_object_terms($post->ID, 'teamtype');    
    if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $taxonomy_slug = $terms[0]->slug;
    else $taxonomy_slug = 'not-specified';

return str_replace('%teamtype%', $taxonomy_slug, $permalink);
share|improve this question
It doesn't make sense to use same slug for both. If you want your URL structure to be same for both then its not the slug, then I think you will have to use custom permalinks for custom post types. Search this site, it has a lot of useful posts on the topic. – Hameedullah Khan May 19 '11 at 4:57
There's no way to use the same slug in taxonomies (including tags and categories). You can have same values but not same slugs. – Diana Jun 15 '12 at 15:44

As far as I know, you can't do that. Every slug is converted to a query_vars item that queries a specific object type (taxonomy or post type). If you analice your WP_Query, you'll see that is querying the first post type.

Maybe a WP Ninja here can enlighten us with this, but I'm almost sure that you can't do it. Or at least, you shouldn't.

share|improve this answer

As CPTs (and posts / pages, for that matter) are constructed, that's not possible. The slug is reserved for the specific type, with the understanding / assumption that 2 CPTs = 2 different types of content.

based on your code, it almost seems like each of the items you have in the CPT would be better be served as a custom taxonomy, with both being attached to a single CPT (I'm guessing some sort of event?)

share|improve this answer
See updated post above- – Joe May 19 '11 at 21:07
You've declared %teamtype% in your URL structure, yet it doesn't exist anywhere. Have you created that rewrite structure somewhere else in your code? – Norcross May 21 '11 at 22:31
My mistake, forgot to post that function in here. Added to the bottom – Joe May 22 '11 at 17:44

Your rewrite rules will overwrite each other, and WordPress will query for only one of the post types. I think it is the latest one that is registered that "wins", so /testslug/bmw/ will always query for a post with slug bmw and post type sponsors. If you go to /testslug/some-name/ and some-name is a rider, it will still query for post type sponsors and post slug some-name. It will find no post, and thus give you a 404. This happens in the "default" query that WordPress will do for you, before it loads the template page, so you can't solve this in your single-sponsors.php template file for example (you could in 404.php, but then it gets ugly).

The cleanest solution is to replace part of the logic that does this URL parsing, and make it accept an "ambiguous" URL. Test whether it is a rider or a sponsor, and change the parameters so WordPress will continue with either a rider or a sponsor. Mike once provided a way to do this with pages and taxonomies, it should be possible to extend this to work with posts only.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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