How to have permalink like domain.com/term/postname?

Short answer

Add this to your functions.php file or wherever you have the rest of this code, assuming this is all in your theme. If this is a plugin, the first two lines need to happen on setup_theme, so you need to hook into that action.

Also, if it were me, I’d put everything into a class. If you did that, use a class property instead of a global $video_type_rewrite_rules variable.

$GLOBALS['wp_rewrite']->use_verbose_page_rules = true;

function wpse_135707_video_type_rewrite_rules( $rules ) {
    $GLOBALS['video_type_rewrite_rules'] = $rules;
    return array();
}
add_filter( 'video_type_rewrite_rules', 'wpse_135707_video_type_rewrite_rules' );

function wpse_135707_add_video_type_to_rewrite_rules_array( $rules ) {
    return array_merge( $rules, $GLOBALS['video_type_rewrite_rules'] );
}
add_filter( 'rewrite_rules_array', 'wpse_135707_add_video_type_to_rewrite_rules_array' );

Long Answer

What’s happening here is your rewrite rules are too generic. The way WordPress rewrite rules work, the rules are regular expressions in a specifically-ordered array. When a request comes in, the array is looped-through in an attempt to match the path. Once a match is found (with one exception, which I’ll get to soon), the code exits the loop and the remaining rules are ignored. Normally, a taxonomy or post type will have a static “anchor” for the rules, so two post types won’t conflict. That is, if your post type’s permastruct was 'video/%video_genre%' this wouldn’t have been a problem. In other words, %video_genre% gets replaced with a regular expression which is extremely generic. Without a fixed string of text in the regular expression, it will match any path at that url depth (same number of slashes in the URL).

All that said, you can set a permalink structure to /%category%/%postname%/, so why doesn’t that cause pages to break? There’s an exception for some permalink structures, and the solution above takes advantage of that. This is where $use_verbose_page_rules comes in; if the url structure starts with the postname, category, tag, or author, WordPress sets $use_verbose_page_rules to true, which causes two changes. First, the rewrite rule order changes, setting pages before posts, which isn’t a big deal. Second, when that rule matches a request, WordPress checks to see if the page actually exists before committing to that rewrite rule. If it doesn’t exist, it continues looping over the rules. This is the one exception where that happens. The main downside here is that every request which is not a page results in an extra database query with a search on text fields. If you have a massive database (hundreds of thousands of posts), this operation can have a noticeable impact on your page load. Anyway, the other thing we’re doing here is moving the post type’s rewrite rules after the page rewrite rules, so the page will match first, check to see if it exists, and if not, match the video rules.

Other Options

  1. By far the best option is to avoid rewrite rules which are this generic. To do this, provide static text in the rewrite rules for the post type, as mentioned above (e.g. 'video/%video_genre%'.
  2. Hook into the request process to see if a video exists before “committing” to that being the request. This is kind of a pain, but I covered it in this question. This option allows you to have any permalink structure you want, and have other post types with generic rewrite rules like this one.

The solution I provided is not as flexible as (2), and not as ideal as (1), but it’s a good compromise between the two. It’s also worth noting that your site’s permalink structure has to either have a static base or be date-based. That is, if you prefix your permalink structure with the category, tag, or author, or had no prefix, these rules would conflict.

Lastly, be sure to flush your rewrites after making any of these changes.