I have a custom taxonomy called activities and a custom role called operator. So, if example.com/operators/bird-watching is visited then I want to list all the operators that offers bird-watching. Bird-watching is a term of activities taxonomy. I have made a different template for this. I have also developed a url structure for this which is show below. All I want now is to load my custom template if someone visits example.com/operators/bird-watching

Tried this link but no help.

function resources_cpt_generating_rule($wp_rewrite) {
    global $wp_rewrite;
    $rules = array();
    $terms = get_terms( array(
        'taxonomy' => 'activities',
        'hide_empty' => false,
    ) );

    $post_type = 'operator';
    foreach ($terms as $term) {
        $rules['operators/' . $term->slug . '/([^/]*)$'] = 'index.php?operators/'.$term->slug;            
    // merge with global rules
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
add_action( 'generate_rewrite_rules', 'resources_cpt_generating_rule' );

In the link you attached, you have everything you need. You should:

  • add query variable (e.g operators_actv),
  • add rewrite rule that sets this variable (operators_actv),
  • use the template_include action hook to load custom template if query variable operators_actv is set.


add_filter( 'query_vars', 'se332319_custom_query_vars' );
add_filter( 'template_include', 'se332319_custom_template', 50 );
add_action( 'generate_rewrite_rules', 'se332319_resources_cpt_generating_rule' );

function se332319_resources_cpt_generating_rule( $wp_rewrite ) 
    $rules = [
        'operators/([^/]+)/?$' => 'index.php?operators_actv=$matches[1]&activities=$matches[1]'
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;

    return $wp_rewrite;

function se332319_custom_query_vars( $query_vars )
    array_push( $query_vars, 'operators_actv' );
    return $query_vars;

function se332319_custom_template( $template )
    $qv = get_query_var('operators_actv', null);
    if ( $qv !== null && term_exists($qv, 'activites') !== null ) {

        // use "get_stylesheet_directory()" or "get_template_directory()"
        // if template file is in theme directory 
        $template =  dirname(__FILE__) . '/se332319_custom_template.php';
    return $template;

Don't forget to refresh permalinks. Click Save in Dashboars -> Settings -> Permalinks or do it from code with flush_rewrite_rules() (how to recreate rewrite rules).

  • Thank you so much for your reply as well as help. Now, what will be my new url according to this code? I tried abc.com/operators/cannoying/ but it is returning 404.
    – saurav.rox
    Apr 4 '19 at 6:33
  • @saurav.rox If cannoying is a term taxonomy activites, then abc.com/operators/cannoying/ should work. Did you flush the rewrite rules (Settings -> Permalinks -> Save)?
    – nmr
    Apr 4 '19 at 8:03
  • I changed this 'operators/([^/]+)/?$' => 'index.php?operators_actv=$matches[1]' to 'customslug/([^/]+)/?$' => 'index.php?operators_actv=$matches[1]' and now I can see index.php with blog posts loaded when I visit abc.com/customslug/cannoying/. Moreover, die is not called inside if ( $qv !== null && term_exists($qv, 'activites') !== null ) {. I flushed the permalinks as well.
    – saurav.rox
    Apr 4 '19 at 9:23
  • @saurav.rox Sorry for typo, taxonomy slug should be activities, not activites.
    – nmr
    Apr 4 '19 at 9:32
  • 1
    I have already that template called taxonomy-activities.php. So, I was trying to add a different template. Now, I want to add body_class on such custom template. Is it possible.
    – saurav.rox
    Apr 4 '19 at 9:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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