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() {

register_post_type('riders', 
array(  
    '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() {

register_post_type('sponsors', 
array(  
    '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')
    ) 
);

}

*************Update***********************************

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() {
register_taxonomy( 
'teamtype', 
array('riders','sponsors'),
array( 
    '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);
}

5 s
5

I’ve just done a project where two Custom Post Types needed to share the same slug. The trick is to overwrite the query vars via the request filter. Let’s call the post types ‘foo’ and ‘bar’, and they will share slug ‘foo’.

The following code is rough and from memory for example only. Salt to taste, do not copy-paste:

add_filter('request', 'overwriteQueryVars', 10, 1);

function overwriteQueryVars($query)
{
    if ( empty($query['post_type']) || $query['post_type']!='foo' ) {
        return $query;
    }

    // Run an SQL query that looks like this, against both post types
    $sql = "SELECT ID FROM wp_posts WHERE post_type="foo" and post_name="%s"";
    $post_name = urlencode($query['name']);

    // If you've found that the row exists for post_type 'bar' but not 'foo',
    // then simply return the $query array unaltered
    if ( in_foo_but_not_bar ) {
        return $query;
    }

    // If you've found that the row exists for post_type 'bar' but not 'foo',
    // then rewrite the $query array:

    // Original:
    $query = array (
        'page' => '',
        'foo' => 'some-nice-post',
        'post_type' => 'foo',
        'name' => 'some-nice-post',
    );

    // Make it look like this:
    $query = array (
        'page' => '',
        'bar' => 'some-nice-post',
        'post_type' => 'bar',
        'name' => 'some-nice-post',
    );

}

Leave a Reply

Your email address will not be published. Required fields are marked *