web-dev-qa-db-ja.com

カスタム投稿タイプのクエリでmeta_keyを設定できません

カスタム投稿eventsを作成し、各イベントにメタデータevent_yearを保存しました。私は一年分のイベントアーカイブを手に入れようとしています。次のURLにアクセスすると、何らかの理由でmeta_keymeta_valueが設定されていないため、イベントアーカイブがフィルタリングされていません。

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

値をデバッグする:

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

meta_keyとmeta_valueを設定できないのはなぜですか?

Meta_valuesはイベントに保存されます。それらを正常に表示しました。

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

これは、 'meta_key'と 'meta_value'がパブリッククエリ変数ではないためです。言い換えれば、あなたはそれらをURLの中で直接使うことはできませんし、あなたもそうすべきではありません。

代わりに、次のように特定のクエリvarを登録します。

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

それから、あなたはこのようなURLに行くことができます:?my_qv=foobar

今必要なことは、クエリ変数を実際のクエリにマッピングすることです。

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

評判が悪いため、scribuの優れた答えにコメントを追加することはできませんが、WP 4.2の作業中のコードの後半部分(map_my_qv関数)では、404が表示され、adminに投稿がありませんでした。 PHPは$meta_value変数が設定されていないことを通知します。したがって、これが編集したコードです。

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