Я пытаюсь создать пользовательский запрос, объединив два отдельных запроса: один - все сообщения с категорией blog-hub-page
, а второй - все остальные сообщения. Цель объединения этих двух запросов состоит в том, чтобы сначала показывались сообщения blog-hub-page
, чтобы мы всегда могли заранее выбрать сообщения.
В прошлом я делал нечто очень похожее с пользовательским типом поста и кодом, который у меня работал отлично. По какой-то причине, когда я пытаюсь сделать это с сообщениями по умолчанию, он ломается. Поскольку это кажется такой простой задачей, я чувствую, что, должно быть, здесь упускаю что-то простое. Любая помощь очень ценится!
Вот мой код:
$blogHomeLoop = get_posts(
array(
'post_type' => 'post',
'fields' => 'ids',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'blog_post_loc',
'field' => 'slug',
'terms' => 'blog-hub-page'
)
),
)
);
$remainingPostLoop = get_posts(
array(
'post_type' => 'post',
'fields' => 'ids',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'blog_post_loc',
'field' => 'slug',
'terms' => 'blog-hub-page',
'operator' => 'NOT IN'
)
),
)
);
$mergedLoops = array_merge($blogHomeLoop, $remainingPostLoop);
remove_all_actions( 'pre_get_posts' );
wp_reset_query();
$blogLoop = new WP_Query(
array(
'post_type' => 'post',
'post__in' => $mergedLoops,
'orderby' => 'post__in',
'posts_per_page' => 9,
'paged' => $paged,
'has_archive' => true,
'suppress_filters' => true
)
);
Также здесь SQL из объекта запроса без набора по порядку
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND wp_posts.ID IN (A LOT OF POST IDS HERE)
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'private')
ORDER BY wp_posts.post_date DESC
LIMIT 0, 9
Здесь то же самое, но с orderby, установленным на post__in
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts WHERE 1=1
AND wp_posts.ID IN (A LOT OF POST IDS HERE)
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'private')
ORDER BY FIELD(wp_posts.ID,A LOT OF POST IDS HERE AGAIN)
LIMIT 0, 9
Самое странное, если я удаляю 'orderby' => 'post__in'
, тогда он работает как запрос по умолчанию. Я даже подтвердил, что это действительно два объединенных запроса, потому что я создал другую категорию и ограничил второй запрос только этой категорией.
Так что в настоящее время он захватывает все сообщения из двух объединенных запросов, и я могу сказать, что это порядок, основанный на ASC
или DESC
, что неплохо, но как только я скажу, чтобы он заказывал по 'post__in'
тогда он действует так, как будто сообщений нет вообще.
Если я print_r($blogLoop->posts);
без orderby
добавлен, то он показывает сообщения, как и ожидалось. Если я добавлю обратно в orderby
, то там будет написано, что сообщений нет. Хотя я могу print_r($mergedLoops);
, и он показывает все идентификаторы, как и ожидалось.
У другого вопроса была похожая проблема Я видел, и они предложили добавить remove_all_actions('pre_get_posts');
, wp_reset_query();
и / или 'suppress_filters' => true
, чтобы убедиться, что это не что-то с теми, но это Решение ничего не изменило для меня.