I think you can create a rewrite rule for each “region” to don’t overwrite other important rules you could need (like pages, categories, etc..). I was playing with your code examples and with a small change in rewrite_resets could work:
public function rewrite_resets() {
global $wp_rewrite;
foreach($this->ENABLED_POST_TYPES as $post_type) {
$args = get_post_type_object($post_type);
switch($post_type) {
case 'post':
$slug = '/%region%/%postname%';
break;
case 'event':
$slug = '/%region%/events';
break;
}
$args->rewrite["slug"] = $slug;
$args->rewrite["with_front"] = 0;
register_post_type($args->name, $args);
}
$categories = get_terms( 'region', array(
'orderby' => 'count',
'hide_empty' => 0,
));
// Rewrite rule for each taxonomy
foreach($categories as $_category) {
add_rewrite_rule('^'.$_category->slug.'/([^/]+)?', 'index.php?name=$matches[1]', 'bottom');
}
}
This will work if your taxonomy name is “region” (I was playing with the taxonomy “category” the standard, in the end is the same)
In this way you can create a taxonomy region called “London”, like you are doing, and in the same time a page with the same slug (london). This rewrite works only if the url start with the name of the region and has one “path” more. If has tree or one doesn’t match, that’s why don’t break other rewrite rules.
Is just an idea, I hope this help to you 🙂