web-dev-qa-db-fra.com

Je ne peux pas définir meta_key dans ma requête de type de message personnalisé

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'  
2
Matt

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' );
4
scribu

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' );
0
certainlyakey