Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I know this is a fairly common topic around here, but I can't seem to figure out a solution to my particular case from reading similar threads.

Basically, my permalink structure needs to be /%postname%/ for compatibility with a finicky plugin. The plugin authors may fix this in the future, but for now I need to come up with my own solution. The problem is, I want my blog post urls to be /blog/%postname%/. I need some way to hook into the URL rewriting for just the post post type and change the permalink structure from /%postname%/ to /blog/%postname%/.

Any ideas?

share|improve this question
    
Have you tried changing permalink structure to /blog/%postname%/? –  Rilwis Nov 2 '11 at 4:11
    
@rilwis, yes, and that structure works perfectly. The problem is that I'm also using Shopp (1.2 Beta) plugin, and for some reason Shopp breaks completely with any permalink structure other than /%postname%/. I know, they should fix this on their end, but I have no idea how long that will take (or if they even will fix it), so I'm trying to find my own work around. –  Dominic P Nov 2 '11 at 23:07
    
Well, I never found a solution to this, but I wound up switching from Shopp to WooCommerce. So, my permalinks are working perfectly now. Thanks to everyone who helped on this. –  Dominic P Dec 2 '11 at 21:51
    
Please add your solution as an answer, so your question does not haunt site as unanswered. –  Rarst Jan 27 '12 at 18:49
    
@Rarst, as I said in my comment, I never found a solution for this unless you consider giving up on the problem a solution. If you like, I can post that I gave up and switched plugins so I wouldn't have to solve this as a solution. –  Dominic P Jan 28 '12 at 2:54

1 Answer 1

up vote 3 down vote accepted

Even though this is no longer a problem for you, I decided to pursue it for purely academic reasons. I got it working by prepending rewrite rules and filtering permalinks. Note that I wouldn't actually recommend doing this, but it's fun to know it's possible :)

function filter_post_link($permalink, $post) {
    if ($post->post_type != 'post')
        return $permalink;
    return 'blog'.$permalink;
}
add_filter('pre_post_link', 'filter_post_link', 10, 2);


add_action( 'generate_rewrite_rules', 'add_blog_rewrites' );
function add_blog_rewrites( $wp_rewrite ) {
    $wp_rewrite->rules = array(
        'blog/([^/]+)/?$' => '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/[^/]+/([^/]+)/?$' => '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;
}
share|improve this answer
    
Wow, that's an impressive list of rewrite rules. Thanks for taking the time to sort through this. I'm sure it will come in handy for someone down the line. I haven't tested this solution myself, but it looks great. –  Dominic P Jan 30 '12 at 19:08

protected by toscho Oct 23 '13 at 19:30

Thank you for your interest in this question. Because it has attracted low-quality answers, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.