WP_Query orderby post__in не работает в цикле

1 авг. 2013 г., 12:23:09
Просмотры: 30.3K
Голосов: 11

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

Прежде всего, я использую хук pre_get_posts для изменения основного запроса на главной странице, который выглядит примерно так:

if ( is_home() && $query->is_main_query() ) {
    $query->set( 'post_type', array( 'post', 'page', 'product' ) );
    $query->set( 'post__in', array( 103, 14, 127, 115 ) );
    $query->set( 'orderby', 'post__in' );
}

Порядок на главной странице полностью перемешан! Он не следует ни указанному массиву, ни датам публикации (которые установлены по умолчанию). Вместо этого получается 127, 103, 14, 115.

Я сделал var_dump global $wp_query на главной странице, чтобы проверить, что произошло, и SQL-запрос действительно был таким:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID
FROM wp_posts
WHERE
    1=1 AND wp_posts.ID IN (103,14,127,115)
    AND wp_posts.post_type IN ('post', 'page', 'product')
    AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private')
ORDER BY FIELD( wp_posts.ID, 103,14,127,115 )
LIMIT 0, 10

Так что здесь нет проблем! Это именно то, что должно происходить. Однако массив записей в $wp_query->posts имеет неправильный порядок.

Вы можете заметить, что в запрос включен пользовательский тип записи 'product'. Может быть, это и есть причина? Есть идеи, где искать проблему?

4
Комментарии

Я не думаю, что post__in является допустимым параметром для orderby.

helgatheviking helgatheviking
1 авг. 2013 г. 12:56:07

Да, начиная с WP 3.5 это действительно так. У меня установлена версия 3.5.2. Проверьте http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

Max Max
1 авг. 2013 г. 13:16:01

Вы правы. Это для меня новость.

helgatheviking helgatheviking
1 авг. 2013 г. 16:14:22

Возможно, не по теме, но Google приводит сюда, и я раньше не знал про 'orderby' => 'post__in', так что +1.

DomQ DomQ
11 апр. 2018 г. 15:40:41
Все ответы на вопрос 2
1
43

Установите параметр orderby в значение post__in. Это сохраняет порядок ID записей, указанный в массиве post__in (доступно начиная с версии 3.5).

$args = array (
    'posts_per_page' => -1,
    'post__in' => $ids,
    'orderby' => 'post__in' 
);
28 дек. 2013 г. 18:52:20
Комментарии

Вы даже не представляете, какое облегчение принёс мне этот ответ.

Mark Mark
24 апр. 2019 г. 06:33:58
0

Всё моя вина, у меня был старый хук для the_posts, который выполнял свою собственную сортировку. Забыл удалить старый код. Теперь всё работает как надо.

2 авг. 2013 г. 16:22:20