I’ve created a custom post, events
, and saved the meta data event_year
to each event. I’m trying to get a year’s event archive. When I go the the following URL, the meta_key
and meta_value
are not set for some reason, and thus the event archive is unfiltered.
/?post_type=events&meta_key=event_year&meta_value=2011
Debugging the values:
echo $wp_query->query_vars['post_type']; // 'events'
echo $wp_query->query_vars['meta_key']; // -blank-
echo $wp_query->query_vars['meta_value']; // -blank-
Why can’t I set the meta_key and meta_value?
The meta_values are saved to the events. I’ve successfully displayed them:
get_post_meta($post->ID, 'event_year', true); // '2011'
2 Answers
That’s because ‘meta_key’ and ‘meta_value’ are not public query vars. In other words, you can’t use them in URLs directly, nor should you.
Instead, register a specific query var, like so:
function register_my_qv() {
global $wp;
$wp->add_query_var( 'my_qv' );
}
add_action( 'init', 'register_my_qv' );
Then, you can go to a URL like this: ?my_qv=foobar
All you need to do now is map your query var to the actual query you want to do:
function map_my_qv( $wp_query ) {
if ( $meta_value = $wp_query->get( 'my_qv' ) ) {
$wp_query->set( 'meta_key', 'some_meta_key' );
$wp_query->set( 'meta_value', $meta_value );
}
}
add_action( 'parse_query', 'map_my_qv' );