Используя meta_query, как я могу фильтровать по пользовательскому полю и заказывать по другому?


10

С помощью следующего кода (в functions.php) мои сообщения (события CPT) упорядочиваются по _end_date вместо _start_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;
}

Ответы:


15

Это похоже на ошибку в Wordpress. Wordpress на самом деле изменяет meta_query, если вы задаете orderby и meta_key в качестве переменных запроса. Обычно эта модификация добавляет новый meta_key в качестве первого массива в массиве meta_query и, следовательно, orderby применяется к первому мета-ключу, указанному в meta_query.

Но когда вы изменяете orderby, meta_key и meta_value query_vars в фильтре pre_get_posts, из-за (как мне кажется) ошибки в Wordpress, он добавляет новый массив в существующий мета-запрос, но новый массив не вставляется в качестве первого массива, он добавляется в существующий meta_query. И orderby всегда применяется к первому meta_key в meta_query.

Таким образом, в качестве обходного пути, пока ошибка не будет исправлена, вы можете снова указать meta_key в meta_query в качестве первого массива, как в следующем примере:

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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.