Permalinks, Rewrites, Get Variables, Oh My!

Ok, so I know it’s a silly title, but it’s exactly how I feel right now..

I’ve created some custom rewrites for WordPress and they work great, the only problem is that now I need to add pagination. My rules are messing with the pagination and vice versa. The page url will update when I click on a pagination link, but the query stays the same..

Here’s what I have in my functions.php

// ADD REWRITE FOR VIDEOS -> GROUP
add_rewrite_tag('%group%','([^&]+)');

// ADD REWRITE FOR VIDEOS -> VALUE
add_rewrite_tag('%value%','([^&]+)');

// ADD REWRITE FOR VIDEOS TO ACCEPT GROUP & VALUE
add_rewrite_rule('^car-videos/group/([^/]*)/value/([^/]*)/?','index.php?page_id=40&group=$matches[1]&value=$matches[2]','top');

Here’s my pagination code

<div class="pagination">
                            <?php $total_pages = $loop->max_num_pages;  

                                    if ($total_pages > 1){  
                                    $current_page = max(1, get_query_var('paged'));  

                                    echo paginate_links(array(  
                                            'base' => get_pagenum_link(1) . '%_%',  
                                            'format' => 'page/%#%',  
                                            'current' => $current_page,  
                                            'total' => $total_pages, 
                                            'prev_text'    => __('Previous'),
                                            'next_text'    => __('Next')
                                        ));  
                                    }   
                            ?>
                        </div>

Here’s how I’m getting the group and value variables

$urlGroup = $wp_query->query_vars['group'];
$urlValue = $wp_query->query_vars['value'];

I use this in my WP_Query

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

How would I rewrite the rule to allow for pagination? Is there something I’m doing wrong?

1 Answer
1

I’m not sure but I think that you just need to add two query vars, “group” and “value”, not two rewrite tags. Can you try this:

add_filter('query_vars', 'cyb_add_query_vars');
function cyb_add_query_vars( $vars) {
    $vars[] = "group"; // name of the var as seen in the query string and URL
    $vars[] = "value";
    return $vars;
}
add_action('init','cyb_add_rewrite_rules');
function cyb_add_rewrite_rules() {
    add_rewrite_rule( '^car-videos/group/([^/]*)/value/([^/]*)/?$','index.php?page_id=40&group=$matches[1]&value=$matches[2]','top');
    //Rule for pagination
    add_rewrite_rule( '^car-videos/group/([^/]*)/value/([^/]*)/page/([0-9]{1,})/?$', 'index.php?page_id=40&group=$matches[1]&value=$matches[2]&paged=$matches[3]', 'top' );
}

Then this should work for pagination:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

And you can get the values of “group” and “value” with this:

$group = get_query_var('group');
$value = get_query_var('value');
//OR
global $wp_query;
$group = $wp_query->get( 'group' );
$value = $wp_query->get('value');

Leave a Comment