I'm developing a car site that has showrooms. Each showroom needs it's own custom URL based on it's location. The location (City and County/State) is already inserted as two custom fields. So for example, if it's "Showroom A", located in Liverpool, Merseyside, it's URL would be the following:-


I have a custom post type of "Showroom", that has it's rewrite rules set to false (though it was previously set to true earlier in the test). However when I create the post in question, there's an issue. The permalink is given as everything BAR the name of the showroom (i.e. http://www.domain.com/location/merseyside/liverpool/). Visting this URL causes a 404 error, and even adding "showroom-a" (for example) to the end of the code (http://www.domain.com/location/merseyside/liverpool/showroom-a/), also causes a 404 error. Here is my code.

function add_rewrite_rules()
    // Register custom rewrite rules

    global $wp_rewrite;

    $wp_rewrite->add_rewrite_tag('%showroom%', '([^/]+)', 'showroom=');
    $wp_rewrite->add_rewrite_tag('%post_custom_data%', '([^/]+)', 'post_custom_data=');
    $wp_rewrite->add_permastruct('showroom', 'location/%post_custom_data%', false);


function permalinks($permalink, $post, $leavename)
    $no_data = 'no-data';
    $post_id = $post->ID;

    if($post->post_type != 'showroom' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) {
        return $permalink;

    $state = sanitize_title_with_dashes(get_post_meta($post_id, 'state', true));
    $city =  sanitize_title_with_dashes(get_post_meta($post_id, 'city', true));
    $data = $state . "/" . $city;

    if (!$data) {
        $data = $no_data;

    $permalink = str_replace('%post_custom_data%', $data, $permalink);

    return $permalink;    

add_action('init', 'add_rewrite_rules');
add_filter('post_type_link', 'permalinks', 10, 3);

Any ideas or help would be appreciated :)

  • a couple of things you could try- separate your city and county/state into distinct rewrite tags, and specify the permastruct (with additional tags) as the rewrite argument of your post type registration rather than setting it to false
    – Milo
    Commented Oct 3, 2012 at 17:07
  • Cheers @Milo, I've done a bit of work and managed to fine a small issue. Basically, for some reason, $data = $state . "-" . $city works, but $data = $state . "/" . $city does not. Will keep playing...
    – Rhys Wynne
    Commented Oct 4, 2012 at 8:40

1 Answer 1


I managed to fix this.

Basically I changed the permastruct to this:

$wp_rewrite->add_permastruct('showroom', 'location/%state%/%city%/%showroom%', false);

I then grabbed state & city as two separate variables, replacing it in the permalink structure using these lines:

$permalink = str_replace('%state%', $state, $permalink);
$permalink = str_replace('%city%', $city, $permalink);

With $state & $city grabbed using get_post_meta from the post.

  • 3
    Hi, can you paste the full, completed functions? I can't work out where your two $permalink lines are supposed to go.
    – Lee
    Commented Jan 16, 2018 at 17:14
  • Could also use a hint here. I can't get the whole rewriting of the permalink to work at all. Is it crucial that when registering a new post type that rewrite is set to false, if I rewrite them with a function like this? (Although I tried both... – anyway I could use some examplary code :) If anyone feels like sharing, I'm taking whatever I can get :) Thx in advance.
    – Merc
    Commented Nov 2, 2018 at 10:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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