rewrite rules and querystring

When I go to the url mysite.com/photos/120 I’m wanting to get the 120 out.

In the PHP I want to be able to grab these “parameters” like the url was mysite.com?page=photos&id=120 or even just mysite.com/photos?id=120

Read More

Can I leverage rewrite rules? Or do I need to do regex in php to get what I want?

**** EDIT 1 ****

For the life of me I can’t get this to work. Based on the answers given here is what I have so far:

add_action( 'init', 'rewrite_photo_url' );
function rewrite_photo_url() {
    add_rewrite_rule( '^photos/([^/]*)/?','index.php?page=photos&photo_id=$matches[1]', 'top' );
}

add_rewrite_tag('%id%','([0-9]+)');

print(get_query_var('photo_id'));

I suspect I’m missing a concept somewhere?

**** EDIT 2 ****

I’m starting to see that perhaps this needs to be in functions.php so I now have:

function rewrite_photo_url() {
    add_rewrite_rule( '^photos/([^/]*)/?','index.php?page=photos&photo_id=$matches[1]', 'top' );
}
function register_custom_query_vars( $vars ) {
    array_push( $vars, 'photo_id' );
    return $vars;
}

add_action( 'init', 'rewrite_photo_url');
add_filter( 'query_vars', 'register_custom_query_vars', 1 );

Now I just need to know how to get my desired var in my page template. I’ve tried

print(get_query_var('photo_id'));

But that’s not doing the trick.

Related posts

Leave a Reply

5 comments

  1. You can add your own rewrite rule which will let you tweak the query via URL parameters:

    add_action( 'init', 'rewrite_photo_url' );
    function rewrite_photo_url() {
        add_rewrite_rule( 'photos/([^/]+)/?$','index.php?page=photos&photo_id=$matches[1]', 'top' );
    }
    

    If you need to use a custom variable, i.e. ‘photo_id’, you have to register the variable so it will be recognized by the query:

    add_filter( 'query_vars', 'register_custom_query_vars', 1 );
    function register_custom_query_vars( $vars ) {
        array_push( $vars, 'photo_id' );
        return $vars;
    }
    
  2. You can use add_rewrite_tag to register your custom query variable (‘id’ in question):

    add_rewrite_tag('%id%','([0-9]+)');
    

    (The regex tells it only to accepts digits). Then to create your rewrite rule you can use add_rewrite_rule

    (both of these should be hooked onto init).

    add_rewrite_rule('^photos/([0-9]+)/?','index.php?p=1234&id=$matches[1]','top');
    

    where 1234 is the ID of your ‘photos’ page. You will need to flush rewrite rules once after adding these (go to the Permalink settings page). Then as @DanielBachhuber says, you can use out get_query_var( 'id' ) to get the ID.

    Note, while the regex in the add_rewrite_tag means this will only accept digits – you should probably still sanitize with intval (in any case it may be a string representation of a digit).

  3. Depending on how the rules are being generated, you can use the get_query_var() function to get the value of the ‘photo’ query var. If it’s done properly, ‘photo’ should be an available query var. You’ll need to sanitize the value with intval() or similar of course.

  4. Hi Guys this is what worked for me:

        $pagination_args = array(
        'base'            => user_trailingslashit( trailingslashit( remove_query_arg( 's', strtok(get_pagenum_link( 1 ), '?') ) ) . 'page/%#%/'.rtrim(str_replace('%2F','',substr(get_pagenum_link( 1 ),strlen(strtok(get_pagenum_link( 1 ), '?')))),'/'), 'paged' ),
        'format'          => 'page/%#%',
        'total'           => $numpages,
        'current'         => $paged,
        'show_all'        => False,
        'end_size'        => 1,
        'mid_size'        => $pagerange,
        'prev_next'       => True,
        'prev_text'       => __('«'),
        'next_text'       => __('»'),
        'type'            => 'plain',
        'add_args'        => false,
        'add_fragment'    => ''
    );
    

    The base value is what really works the magic. No need to make any changes to the base value. I was pointed in the right direction by reading this post: https://wordpress.org/support/topic/plugin-simple-pagination-page2-and-_get-parameters