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

so i'm back with rewrites... i am looking for a more automated solution.

i stumbled across this on the interwebs:

 * Generates all the rewrite rules for a given post type.
 * The rewrite rules allow a post type to be filtered by all possible combinations & permutations
 * of taxonomies that apply to the specified post type and additional query_vars specified with
 * the $query_vars parameter.
 * Must be called from a function hooked to the 'generate_rewrite_rules' action so that the global
 * $wp_rewrite->preg_index function returns the correct value.
 * @param string|object $post_type The post type for which you wish to create the rewrite rules
 * @param array $query_vars optional Non-taxonomy query vars you wish to create rewrite rules for. Rules will be created to capture any single string for the query_var, that is, a rule of the form '/query_var/(.+)/'
 * @author Brent Shepherd <me@brentshepherd.com>
 * @since 1.0

function eg_generate_rewrite_rules( $post_type, $query_vars = array() ) {
    global $wp_rewrite;

    if( ! is_object( $post_type ) )
        $post_type = get_post_type_object( $post_type );

    $new_rewrite_rules = array();

    $taxonomies = get_object_taxonomies( $post_type->name, 'objects' );   

    // Add taxonomy filters to the query vars array
    foreach( $taxonomies as $taxonomy ){
        //$query_vars[$taxonomy->rewrite['slug']] = $taxonomy->query_var;
        $query_vars[] = $taxonomy->rewrite['slug'] ;

    // Loop over all the possible combinations of the query vars
    for( $i = 1; $i <= count( $query_vars );  $i++ ) {

        $new_rewrite_rule =  $post_type->rewrite['slug'] . '/';
        $new_query_string = 'index.php?post_type=' . $post_type->name;

        // Prepend the rewrites & queries
        for( $n = 1; $n <= $i; $n++ ) {
            $new_rewrite_rule .= '(' . implode( '|', $query_vars ) . ')/(.+?)/';
            $new_query_string .= '&' . $wp_rewrite->preg_index( $n * 2 - 1 ) . '=' . $wp_rewrite->preg_index( $n * 2 );

        // Allow paging of filtered post type - WordPress expects 'page' in the URL but uses 'paged' in the query string so paging doesn't fit into our regex
        $new_paged_rewrite_rule = $new_rewrite_rule . 'page/([0-9]{1,})/';
        $new_paged_query_string = $new_query_string . '&paged=' . $wp_rewrite->preg_index( $i * 2 + 1 );

        // Make the trailing backslash optional
        $new_paged_rewrite_rule = $new_paged_rewrite_rule . '?$';
        $new_rewrite_rule = $new_rewrite_rule . '?$';

        // Add the new rewrites
        $new_rewrite_rules = array( $new_paged_rewrite_rule => $new_paged_query_string,
                                    $new_rewrite_rule       => $new_query_string )
                             + $new_rewrite_rules;

    return $new_rewrite_rules;

// add the rules
function mv_add_rewrite_rule($wp_rewrite){
    $new_rules = eg_generate_rewrite_rules('product');
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;


but while this works great if you don't have rewrite slugs set for each custom taxonomy, it fails if your rewrite slug is something different from your query var. (since it is auto-adding the query_var grabbed in the $match as the query string.

how can i amend this function so that it will match the rewrite['slug'] but add the associated query_var to the query string.

phew... i hope that made sense. OR, does this sound possible at all? would it be advisable to hard-code the re-write rules instead?



( product-category OR product-tag ) / ( color OR style OR material trim-style)

share|improve this question
up vote 1 down vote accepted

As I find myself googling about rewrites again, a full year later I will post the solution that was provided to me by the tutorial's author. The solution was to set the desired query_var when registering the taxonomy.

register_taxonomy( 'product_cat', 'product', array( 'query_var' => 'product-category' ) );
share|improve this answer
Brilliant! That's actually what I was looking for. Thank you for sharing the knowledge. – Ihor Vorotnov Oct 17 '14 at 16:32

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.