How to give a CPT (custom post type) a date based url

Assuming that your event rewrite slug is event and you want your datebased URLs to look like: http://domain.com/event/2011-06-14/

function custom_permalink_for_my_cpt( $rules ) {
    $custom_rules = array();

    // a rewrite rule to add our custom date based urls
    $custom_rules['event/([0-9]{4}-[0-9]{2}-[0-9]{2})/?$'] = 'index.php?post_type=event&event-date=$matches[1]';
    return $custom_rules + $rules;
}
add_filter( 'rewrite_rules_array', 'custom_permalink_for_my_cpt' );

// add a query var so we can read the date passed in url
function my_custom_query_vars( $query_vars ) {
    $query_vars[] = 'event-date';
   return $query_vars; 
}
add_filter( 'query_vars', 'my_custom_query_vars' );

// modify the main wordpress query
function my_date_based_event_archives() {
    // only modify the wordpress query if its event archive and
    // we have got the event-date passed through the url
    if ( is_archive( 'event' ) && get_query_var( 'event-date' ) ) {
        global $wp_query;
        $meta_query = array(
            'meta_query' => array(
                array(
                    'key' => 'event-date',
                    'value' => get_query_var( 'event-date' )
                )
            )
        );
        $args = array_merge( $wp_query->query, $meta_query );
        query_posts( $args );
    }
}
add_action( 'get_template_part_loop', 'my_date_based_event_archives' );

Leave a Comment