If you’ve been grappling with setting up Custom Post Types (CPTs) and Custom Taxonomies in WordPress, particularly when dealing with shared taxonomies across multiple CPTs, you’re not alone. Many users face challenges in getting the rewrite rules to work seamlessly. In this guide, we’ll walk you through the process of configuring shared taxonomies for different CPTs and resolving common issues related to rewrites.

Understanding the Issue

Let’s consider a scenario where you have CPTs for ‘Events’ and ‘Courses,’ each having individual taxonomies and one shared taxonomy named ‘Accessibility Criteria.’ While the individual taxonomies work fine with specific URLs, the trouble arises when you attempt to filter each CPT by the shared taxonomy. The issue is that the URL structure doesn’t behave as expected, leading to rewrites that might not align with your intentions.

The Code Setup

Firstly, ensure that you’ve set up your custom taxonomy appropriately in your theme’s functions.php or a custom plugin. Take note of the taxonomy registration code, especially the ‘rewrite’ argument, as it plays a crucial role in defining the URL structure.

register_taxonomy("accessibility_criteria", array("event", "course"), $args);

Common Issues and Solutions

1. Rewrite Rules for Shared Taxonomies

The common problem users face is that the shared taxonomy rewrite doesn’t work as intended. To address this, you can manually add rewrite rules to your WordPress setup. Below is an example of how you can do this:

add_rewrite_rule('(events|courses)/accessibility/([^/]+)(/page/?([0-9]{1,}))?/?$', 'index.php?post_type=$matches[1]&taxonomy=accessibility_criteria&term=$matches[2]&paged=$matches[4]', 'top');

This rule specifies that URLs like /events/accessibility/{term}/ should be interpreted as filtering the ‘Events’ CPT by the ‘Accessibility Criteria’ taxonomy.

2. Loading a Custom Template for Taxonomy

If you also need to load a custom template when accessing these URLs, you can use the following code:

function load_custom_template_for_taxonomy($template) {
// Check if the current page has the necessary query variables
if (get_query_var('post_type') && get_query_var('accessibility_criteria')) {
// Locate and load your custom template
$template = locate_template(array('taxonomy.php'));
return $template;

add_filter('template_include', 'load_custom_template_for_taxonomy');

This code ensures that when the shared taxonomy is queried, WordPress loads a custom template (taxonomy.php in this case) to display the content.

3. Handling Rewrites Activation and Deactivation

To make sure your rewrite rules are applied, use the activation and deactivation hooks. Include the following code in your theme’s functions.php or a custom plugin:

register_activation_hook(__FILE__, 'flush_rewrite_rules');
register_deactivation_hook(__FILE__, 'flush_rewrite_rules');

These hooks ensure that your rewrite rules are flushed and reloaded when your theme or plugin is activated or deactivated.


By following the steps outlined in this guide, you should be able to set up shared taxonomies for different Custom Post Types in WordPress and resolve common issues related to rewrites and template loading. Remember to test your setup thoroughly and adjust the code according to your specific requirements. Happy coding!

Leave a Reply

Your email address will not be published. Required fields are marked *