次のコード(functions.php)では、私の投稿(CPTイベント)は_start_dateではなく_end_dateで並べられています。 WP 3.1.3現在のこれに対する適切な解決策は何ですか?もちろん、廃止予定のmeta_key
の使用は避けたいと思います。
add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
$query->set( 'post_type', 'event' );
$query->set( 'meta_key', '_start_date' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
$query->set( 'meta_query', array(
array(
'key' => '_end_date',
'value' => time(),
'compare' => '>=',
'type' => 'numeric'
)
)
);
}
return $query;
}
これはWordpressのバグのようです。クエリ変数としてorderbyとmeta_keyを指定した場合、Wordpressは実際にmeta_queryを変更します。通常、この変更は新しいmeta_keyをmeta_query配列の最初の配列として追加するため、orderbyはmeta_queryで指定された最初のメタキーに適用されます。
しかし、pre_get_postsフィルタのorderby、meta_key、meta_value query_varsを変更すると、Wordpressの(私には思われる)バグのため、既存のメタクエリに新しい配列が追加されますが、新しい配列は最初の配列として挿入されず既存のmeta_queryへ。そしてorderbyは常にmeta_queryの最初のmeta_keyに適用されます。
そのため、バグが修正されるまでの回避策として、次の例のように、最初の配列としてmeta_queryにもう一度meta_keyを指定できます。
add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
$query->set( 'post_type', 'event' );
$query->set( 'meta_key', '_start_date' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
$query->set( 'meta_query', array(
array(
'key' => '_start_date'
),
array(
'key' => '_end_date',
'value' => time(),
'compare' => '>=',
'type' => 'numeric'
)
));
}
return $query;
}