WordPress 'orderby' => 'post__in' не работает - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь создать пользовательский запрос, объединив два отдельных запроса: один - все сообщения с категорией 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, чтобы убедиться, что это не что-то с теми, но это Решение ничего не изменило для меня.

1 Ответ

0 голосов
/ 11 февраля 2020

Взгляните на ваш код. Вы сделали пользовательскую таксономию? Если это таксономия по умолчанию => «blog_post_lo c», то должна быть таксономия => «категория»,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...