Как получить заказанные результаты с WPQuery - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть events пользовательский тип записи, и я пытаюсь заказать их, но ничего, что я делаю, кажется, не меняет их порядок.Я использую расширенные настраиваемые поля, поэтому я устанавливаю meta_key для атрибута, который мне нужен.

Что-то не так в этом запросе?


function events_archive( $query ) {
  if( is_admin() ) {
    return $query;
  }

  if( $query->is_post_type_archive('events')  && $query->is_main_query()) {
    $query->set('meta_key', 'start_date');
    $query->set('orderby',  'meta_value');
    $query->set('order', 'ASC');
    $query->set('meta_query', array(
                                  array(
                                    'key' => 'start_date',
                                    'value' => date('Ymd'),
                                    'type' => 'DATE',
                                    'compare' => '>=',
                                    ) 
                                 )
    );
    return $query;
  }
}

Яполучаю результаты, но я заметил, что я могу поменять $query->set('order', 'ASC') на $query->set('order', 'DESC');, и это не изменит порядок.

Я видел несколько похожих сообщений SO, которые рекомендуют использовать $query->set('orderby', 'meta_value_num'); вместо$query->set('orderby', 'meta_value'); но, похоже, это никак не влияет на порядок.

Какие-либо предложения о том, как заставить порядок работать так, как ожидалось?

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Вы можете попытаться использовать мета-значение в качестве даты, а также установить мета-тип.Когда вы выполняете фактический мета-запрос, вы указываете дату, для которой следует запрашивать сообщения, но вы не говорите запросу, чтобы упорядочивать их по дате обязательно.

function events_archive( $query ) {
  if( is_admin() ) {
    return $query;
  }

  if( $query->is_post_type_archive('events')  && $query->is_main_query()) {
    $query->set('meta_key', 'start_date');
    $query->set('meta_type', 'DATE');
    $query->set('orderby',  'meta_value_date');
    $query->set('order', 'ASC');
    $query->set('meta_query', array(
                                  array(
                                    'key' => 'start_date',
                                    'value' => date('Ymd'),
                                    'type' => 'DATE',
                                    'compare' => '>=',
                                    ) 
                                 )
    );
    return $query;
  }
}
0 голосов
/ 20 сентября 2019

Поскольку это пользовательский тип записи, вы должны использовать meta_key вместо key в вашем массиве, например

'meta_key' => 'start_date',

и

'orderby' => 'meta_value_num',
'order' => 'DESC',

для упорядочения (илиASC, в зависимости от того, что вам нужно)

0 голосов
/ 20 сентября 2019

По умолчанию порядок происходит в алфавитном порядке, но вы передаете ему число (отформатированная дата как 'Ymd').Попробуйте добавить meta_value_num вместо meta_value в предложении orderby. Подробнее об этом .

...