Вопрос: Мне нужно query_posts (), чтобы упорядочить результаты сначала по мета-значению, а затем по идентификатору записи

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

У меня есть собственный тип сообщения. Мой тип записи имеет метаданные. Одним из этих полей метаданных является логическое значение (1 или 0), называемое «Featured», которое действует как флаг. Я пытаюсь создать запрос для query_posts () (я согласен на WP_Query, если придется), который сначала возвращает сообщения с установленным флагом (отсортированные по дате или идентификатору сообщения DESC), а затем сообщения, которые делают НЕ установлен флаг (и они также сортируются по дате или идентификатору записи DESC).

Цель этого состоит в том, чтобы размещать сообщения в верхней части списка, отсортированные по дате публикации с самыми последними сначала посты, затем неиспользуемые посты, также отсортированные по дате публикации, в первую очередь самые последние посты.

EG:

a: ID=800, featured=1b: ID=801, featured=0c: ID=802, featured=0d: ID=803, featured=1e: ID=804, featured=0

Этот список постов должен быть возвращен мне в порядке : d, a, e, c, b

Вместо этого я получаю: a, d, b, c, e

Это код запроса, который у меня так далеко:

$query = query_posts( array(    'post_type' => 'my_custom_type',    'post_status' => 'publish',    'posts_per_page' => '9',    'orderby' => array(        'meta_value_num'    => 'DESC',        'post_ID' => 'DESC'    ),    'meta_key' => 'featured') ); 

Я пробовал всевозможные вариации в порядке вещей. Первоначально я пытался отсортировать по дате публикации, но пытался идентифицировать пост, так как он должен возвращать тот же порядок и является простым int. Я переключил DESC в ASC и снова, я добавил фильтры, которые я видел предложенные в других сообщениях ... независимо от того, что я делаю, после первоначальной сортировки по флагу, сообщения всегда в порядке ASC ( это идентификатор сообщения ASC или дата публикации ASC.

Пожалуйста, помогите !!

Ответы и комментарии:

Я продолжил исследовать свою проблему и закончил тем, что нашел решение здесь: мне нужно query_posts (), чтобы упорядочить результаты сначала по мета-значению, а затем по идентификатору записи
В принципе, похоже, что порядок WordPress прикручен. Когда я проверял SQL, он создавал порядок, который выглядел так:
ORDER BY wppc_postmeta.meta_value + 0 DESC

Что в принципе бессмысленно.
Поэтому я создал функцию быстрого фильтра для написания кода orderby, как WordPress должен был сделать в первую очередь:
function pb_override_orderby () {
    $ orderby_statement = "wppc_postmeta.meta_value DESC, wppc_posts.post_date_gmt DESC";
    вернуть $ orderby_statement;
}

Затем, непосредственно перед вызовом query_posts (), я добавляю строку:
add_filter ('posts_orderby', 'pb_override_orderby');

Эти два фрагмента отбрасывают плохой код WordPress и заменяют его правильным кодом, который работает как требуется. Намного лучше. Что-то для WordPress, чтобы рассмотреть в будущем исправление ошибки.
Создан 25-11-2018 08:11 CraigD1