it-swarm.com.de

Ich kann meta_key in meiner benutzerdefinierten Post-Typ-Abfrage nicht festlegen

Ich habe den benutzerdefinierten Beitrag events erstellt und den Metadaten-event_year für jedes Ereignis gespeichert. Ich versuche ein Eventarchiv für ein Jahr zu bekommen. Wenn ich die folgende URL gehe, werden der meta_key und der meta_value aus irgendeinem Grund nicht festgelegt, und daher wird das Ereignisarchiv ungefiltert.

/?post_type=events&meta_key=event_year&meta_value=2011

Debuggen der Werte:

echo $wp_query->query_vars['post_type']; // 'events'
echo $wp_query->query_vars['meta_key']; // -blank-
echo $wp_query->query_vars['meta_value']; // -blank-

Warum kann ich den meta_key und den meta_value nicht setzen?

Die meta_values ​​werden in den Ereignissen gespeichert. Ich habe sie erfolgreich angezeigt:

get_post_meta($post->ID, 'event_year', true); // '2011'  
2
Matt

Das liegt daran, dass 'meta_key' und 'meta_value' keine öffentlichen Abfragevariablen sind. Mit anderen Worten, Sie können sie nicht direkt in URLs verwenden und sollten es auch nicht.

Registrieren Sie stattdessen eine bestimmte Abfragevariable wie folgt:

function register_my_qv() {
  global $wp;
  $wp->add_query_var( 'my_qv' );
}
add_action( 'init', 'register_my_qv' );

Dann können Sie zu einer URL wie dieser gehen: ?my_qv=foobar

Alles, was Sie jetzt tun müssen, ist, Ihre Abfragevariable der tatsächlichen Abfrage zuzuordnen, die Sie ausführen möchten:

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

Ich kann der hervorragenden Antwort des Scribus aufgrund der schlechten Reputation keinen Kommentar hinzufügen, aber der zweite Teil des Codes (map_my_qv function) während der Arbeit an WP 4.2 gab mir 404s, fehlende Beiträge in admin und PHP Hinweise zu $meta_value Variable nicht gesetzt. Deshalb hier der bearbeitete Code:

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