WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

With my website I work with my own taxonomy. And I want that the taxonomy is intergrated with the permalink. So if an news page has a taxonomy, the permalink change.

Like this: mysite.com/%custom_tax%/blog/%postname% And if it's a page this: mysite.com/%custom_tax%/%postname%

But if there is no taxonomy I want: mysite.com/blog/%postname% And if it is an page: mysite.com/%postname%

How can I easily do this?

I already set up the %custom_tax% :

add_filter('post_link', 'custom_tax_permalink', 10, 3);
add_filter('post_type_link', 'custom_tax_permalink', 10, 3);

function custom_tax_permalink($permalink, $post_id, $leavename) {
    if (strpos($permalink, '%custom_tax%') === FALSE) return $permalink;

    // Get post
    $post = get_post($post_id);
    if (!$post) return $permalink;

    // Get taxonomy terms
    $terms = wp_get_object_terms($post->ID, 'custom_tax');  
    if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $taxonomy_slug = $terms[0]->slug;
    else $taxonomy_slug = '';

    return str_replace('%custom_tax%', $taxonomy_slug, $permalink);
share|improve this question
Don't call flush_rewrite_rules();. Especially not every time you retrieve a link. You should flush rewrite rules only once and when the rewrite rules are changed. Take that line out and instead visit the Permalinks > Settings page to flush the rules. – Stephen Harris Apr 10 '12 at 15:20

Try something like this:

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        '(.+)/blog/(.+)'      =>  'index.php?custom_tax='.$wp_rewrite->preg_index(1).'&post_name=' . $wp_rewrite->preg_index(2)

    // ( array merge must be done this way, to ensure new rule comes first )
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );

Remember to flush permalinks by visiting the permalinks page and re-saving if you add/change this code. Also remove the flush_rewrite_rules(); as advised by Stephen, it's unnecessary and bad practice.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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