Як я можу фільтрувати за спеціальним полем і замовляти інше за допомогою meta_query?


10

З наступним кодом (у function.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 фактично модифікує мета_запит, якщо ви вказали orderby та meta_key в якості варіантів запитів. Зазвичай ця модифікація додає новий meta_key в якості першого масиву в масиві meta_query і, отже, orderby застосовується до першого мета-ключа, вказаного в meta_query.

Але коли ви змінюєте orderby, meta_key та meta_value query_vars у фільтрі pre_get_posts, завдяки (здається мені) помилкою в Wordpress він додає новий масив у існуючий мета-запит, але новий масив не вставляється як перший масив, він додається до існуючого мета-запиту. І orderby завжди застосовується до першого 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.