If other people are looking for it, here is a variation of Matthew answer (which work perfectly) to achieve this:
Blog archive : /blog/
Blog category : /blog/category-name/
Blog post : /blog/category-name/post-name/
add_action( 'generate_rewrite_rules', 'add_blog_rewrites' );
function add_blog_rewrites( $wp_rewrite ) {
$wp_rewrite->rules = array(
'blog/([^/]+)/?$' => 'index.php?taxonomy=category&term=$matches[1]',
'blog/([^/]+)/page/([0-9]+)/?$' => 'index.php?taxonomy=category&term=$matches[1]&paged=$matches[2]',
'blog/[^/]+/([^/0-9]+)/?$' => 'index.php?name=$matches[1]',
'blog/[^/]+/[^/]+/attachment/([^/]+)/?$' => 'index.php?attachment=$matches[1]',
'blog/[^/]+/[^/]+/attachment/([^/]+)/trackback/?$' => 'index.php?attachment=$matches[1]&tb=1',
'blog/[^/]+/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?attachment=$matches[1]&feed=$matches[2]',
'blog/[^/]+/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?attachment=$matches[1]&feed=$matches[2]',
'blog/[^/]+/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$' => 'index.php?attachment=$matches[1]&cpage=$matches[2]',
'blog/[^/]+/([^/]+)/trackback/?$' => 'index.php?name=$matches[1]&tb=1',
'blog/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?name=$matches[1]&feed=$matches[2]',
'blog/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?name=$matches[1]&feed=$matches[2]',
'blog/[^/]+/([^/]+)/[^/]+/page/?([0-9]{1,})/?$' => 'index.php?name=$matches[1]&paged=$matches[2]',
'blog/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$' => 'index.php?name=$matches[1]&cpage=$matches[2]',
'blog/[^/]+/([^/]+)/[^/]+(/[0-9]+)?/?$' => 'index.php?name=$matches[1]&page=$matches[2]',
'blog/[^/]+/[^/]+/([^/0-9]+)/?$' => 'index.php?attachment=$matches[1]',
'blog/[^/]+/[^/]+/trackback/?$' => 'index.php?attachment=$matches[1]&tb=1',
'blog/[^/]+/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?attachment=$matches[1]&feed=$matches[2]',
'blog/[^/]+/[^/]+/([^/])+/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?attachment=$matches[1]&feed=$matches[2]',
'blog/[^/]+/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$' => 'index.php?attachment=$matches[1]&cpage=$matches[2]'
) + $wp_rewrite->rules;
}
With /%category%/%postname%/
for the permalink structure and this for the categories links:
function filter_category_link($permalink, $term) {
if($term->taxonomy !== 'category') {
return $permalink;
}
return 'blog' . str_replace('category/', '', $permalink);
}
add_filter('pre_term_link', 'filter_category_link', 10, 2);
/blog/%postname%/
?