J'ai créé une publication personnalisée, events
, et enregistré la méta-donnée event_year
dans chaque événement. J'essaie d'avoir les archives d'événements d'un an. Quand je vais l'URL suivante, les meta_key
et meta_value
ne sont pas définis pour une raison quelconque, et donc l'archive des événements n'est pas filtrée.
/?post_type=events&meta_key=event_year&meta_value=2011
Débogage des valeurs:
echo $wp_query->query_vars['post_type']; // 'events'
echo $wp_query->query_vars['meta_key']; // -blank-
echo $wp_query->query_vars['meta_value']; // -blank-
Pourquoi ne puis-je pas définir les méta_key et meta_value?
Les méta-valeurs sont enregistrées dans les événements. Je les ai affichées avec succès:
get_post_meta($post->ID, 'event_year', true); // '2011'
En effet, 'meta_key' et 'meta_value' ne sont pas des vars de requête publics. En d'autres termes, vous ne pouvez pas les utiliser directement dans les URL, vous ne devriez pas le faire non plus.
Au lieu de cela, enregistrez une requête spécifique var, comme ceci:
function register_my_qv() {
global $wp;
$wp->add_query_var( 'my_qv' );
}
add_action( 'init', 'register_my_qv' );
Ensuite, vous pouvez aller à une URL comme celle-ci: ?my_qv=foobar
Tout ce que vous avez à faire maintenant, c’est d’associer votre requête à la requête que vous souhaitez effectuer:
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' );
Je ne peux pas ajouter de commentaire à l'excellente réponse de scribu en raison de la mauvaise réputation, mais la deuxième partie du code (fonction map_my_qv
) tout en travaillant sur WP 4.2 me donnait 404s, des postes manquants dans admin et PHP avis concernant la variable $meta_value
non définie. Par conséquent, voici le code modifié:
function map_my_qv( $wp_query ) {
if ( is_admin() || ! $wp_query->is_main_query() )
return;
if ( $wp_query->get( 'my_qv1' ) ) {
$wp_query->set( 'meta_key', 'my_meta_key1' );
$wp_query->set( 'meta_value', $wp_query->get( 'my_qv1' ) );
}
if ( $wp_query->get( 'my_qv2' ) ) {
$wp_query->set( 'meta_key', 'my_meta_key2' );
$wp_query->set( 'meta_value', $wp_query->get( 'my_qv2' ) );
}
}
add_action( 'parse_query', 'map_my_qv' );