カスタム投稿events
を作成し、各イベントにメタデータevent_year
を保存しました。私は一年分のイベントアーカイブを手に入れようとしています。次のURLにアクセスすると、何らかの理由でmeta_key
とmeta_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'
これは、 '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' );
評判が悪いため、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' );