I found some good information here http://codex.wordpress.org/Plugin_API/Filter_Reference/request
I added a filter to the request
hook like so:
add_filter( 'request', 'alter_the_query' );
The hook function goes like this:
function alter_the_query( $request ) {
$dummy_query = new WP_Query(); // the query isn't run if we don't pass any query vars
$dummy_query->parse_query( $request );
// if requesting a schedule and no posts are found with existing query vars, try the meta query
if ( $request['post_type'] == 'schedule' && !$dummy_query->have_posts() ) {
$posts = get_posts( array(
'post_type' => 'schedule',
'meta_query' => array(
array(
'key' => 'wsb_schedule_id',
'value' => $request['schedule'],
)
),
) );
if ( count( $posts ) == 0 ) return $request; // no posts found still so return the request as is for normal processing
// a post was found, so fix the request vars and return the modified $request object for further processing
$request['schedule'] = $posts[0]->post_slug;
$request['name'] = $posts[0]->post_slug;
}
return $request;
}
My hook function runs the request with a locally scoped WP_Query object and if no schedules were returned, it tries the meta query. If the meta query succeeds, it makes the necessary modifications to the $request
array and then lets WordPress continue to process. If the meta query fails, it just returns the $request unmodified for normal processing once again.
I’m not sure how this will play out with permissions on the schedule, but that’s a different ball of wax.