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.

Need some help with this URL rewrite. I have 2 custom posts set up, 'company' and 'job'. I have a single-company page, and a single-job page, which work fine. A company can have many jobs, and I'm managing the relation between jobs and company using post meta.

Single company URL is http://..../company/abc-intl, and single job url is http://..../job/photoshop-designer.

I want a single job URL to include the slug of the company it belongs to/is related with. So for above example, it should be http://..../company/abc-intl/job/photoshop-designer.

I tried a lot with 'add_rewrite_rule', 'add_rewrite_tag', but didn't seem to work. Please any ideas on how to achieve this URL?

share|improve this question
    
Thanks for viewing! I got it done with a lot of trial and errors! (bump sounds too rude!) –  Rutwick Gangurde Sep 6 '11 at 8:08
    
Cool... Got a down vote for this! Dunno why! –  Rutwick Gangurde May 15 '12 at 10:00
1  
It would be useful if you actually shared your solution in an answer. (I'm not the one who downvoted) –  scribu May 15 '12 at 16:38
    
Ohh! Thought so! Sure, lemme compile the solution in a proper format... –  Rutwick Gangurde May 16 '12 at 5:02

1 Answer 1

up vote 1 down vote accepted

Here's the solution if anyone comes across such a 'weird' requirement ;) Also, when the job CPT (or any CPT you want to associate) is published, you need to save the id of the company CPT (whose slug will be used for forming the other part of the permalink) as a post meta for the job.

<?php
add_filter('init', 'add_page_rewrite_rules');
function add_page_rewrite_rules(){
    global $wp_rewrite, $wp;

    add_rewrite_rule('^company/([^/]+)/job/([^/]+)', 'index.php?company=$matches[1]&job=$matches[2]', 'top');
    $job_structure = '/job/%job%';
    $wp_rewrite->add_rewrite_tag("%job%", '([^/]+)', "job=");
    $wp_rewrite->add_permastruct('job', $job_structure, false);

}

add_filter('post_type_link', 'job_permalink', 10, 3);
function job_permalink($permalink, $post_id, $leavename) {
    $post = get_post($post_id);
    $rewritecode = array(
    '%job%',
    'job'
    );

    if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) {
        job_link = '';
        if ( strpos($permalink, 'job') !== false ) {
            $company_id = get_post_meta($post->ID, 'job_company_id', true);
            $company = basename(get_permalink($company_id));
            $job_link = 'company'.'/'.$company;
        }

        $rewritereplace = array(
                                    $post->post_name,
                                    $job_link.'/job'
                        );
        $permalink = str_replace($rewritecode, $rewritereplace, $permalink);
    } 
    else { 
        // if they're not using the fancy permalink option
    }
    return $permalink;
}
?>

Hope this helps someone! You can contact me if stuck while implementing this.

share|improve this answer

Your Answer

 
discard

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.