meta_query를 사용하여 어떻게 사용자 정의 필드로 필터링하고 다른 필드로 주문할 수 있습니까? 게시물을 _start_date

다음 코드 (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;
}


답변