다음 코드 (functions.php에 있음)를 사용하여 CPT 이벤트의 게시물을 _start_date 대신 _end_date로 정렬합니다. WP 3.1.3부터 이에 대한 올바른 해결책은 무엇입니까? 물론 deprecated 사용을 피하고 싶습니다 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를 query vars로 지정하면 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;
}