Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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

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

Thanks

** EDIT 1 **

For the life of me I can't get this to work. Based on the answers given (thanks) here is what I have:

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 atm.

share|improve this question
    
The only thing worse than no answers is three good answers. #dilemma –  Jackson Apr 11 '12 at 4:14
    
Accept whichever works and up-vote all good answers :) –  Stephen Harris Apr 11 '12 at 10:47
1  
You're mixing the answers... you use photo_id as your variable in the rewrite rule, but add id instead of photo_id with add_rewrite_tag()! –  EAMann Apr 11 '12 at 15:58
    
The add_rewrite_tag should probably be inside the rewrite_photo_url callback... –  Stephen Harris Apr 11 '12 at 16:00
add comment

4 Answers

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.

share|improve this answer
add comment

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;
}
share|improve this answer
    
You don't want the caret in your rewrite rule up there. WordPress prefixes all rewrite rules with one for you; also, you might want to add a $ at the end so WordPress can still add endpoint permalinks if necessary. Also, I'd change the asterisk to +, since that will only get a match if there really is a photo id present. Other than that, all solid code. :D –  John P Bloch Apr 11 '12 at 13:56
    
soo I think I finally figured out that this needs to be in my theme's functions.php -- well now I think everything is working, but I'm not sure how to retrieve my value on the actual photos.php. Should it just be print(get_query_var('photo_id')); anywhere on the page? –  Jackson Apr 11 '12 at 16:12
    
print( get_query_var( 'photo_id' ) ); should work. Are you sure that your template is the one being used? A quick test of echo-ing some static text near the get_query_var() should do the trick. –  Rachel Carden Apr 12 '12 at 1:49
add comment

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).

share|improve this answer
add comment
up vote 1 down vote accepted

After many days of doing research on this, the answer was this simple:

$wp_query->query_vars['page']

wrap that in an intval and viola.

share|improve this answer
add comment

Your Answer

 
discard

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.