WP Запрос и порядок по определенным указанным идентификаторам

Мой запрос WP_Query выглядит так:

 $query_args = array('posts_per_page' => $products, 'no_found_rows' => 1, 'post_status' => 'publish', 'post_type' => 'product' ); $query_args['meta_query'] = $woocommerce->query->get_meta_query(); $query_args['meta_query'][] = array( 'key' => '_featured', 'value' => 'yes' ); $r = new WP_Query($query_args); 

Какой аргумент мне нужно добавить, чтобы вернуть запрос, упорядоченный по идентификаторам в определенной строке (например, мне нужно вернуть идентификаторы продуктов 161,165,131,202 в этом порядке).

Изменить: я добавил аргументы post__in и post__in которые вытягивают только те конкретные продукты по идентификаторам, но не в порядке, указанном в массиве, но это похоже на то, когда продукт был добавлен в конец.

 $query_args = array('posts_per_page' => $products, 'no_found_rows' => 1, 'post_status' => 'publish', 'post_type' => 'product', 'post__in' => array(161,165,131,202), 'orderby' => 'post__in', 'order' => 'ASC' ); 

WP Query для этого выглядит так:

 SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) WHERE 1=1 AND wp_posts.ID IN (161,165,131,202) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish')) AND ( ( wp_postmeta.meta_key = '_visibility' AND CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','catalog') ) AND (mt1.meta_key = '_featured' AND CAST(mt1.meta_value AS CHAR) = 'yes' )) GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order, FIELD( wp_posts.ID, 161,165,131,202 ) LIMIT 0, 5 

нет подсказки, почему ORDER BY установлен как menu_order не post__in

Solutions Collecting From Web of "WP Запрос и порядок по определенным указанным идентификаторам"

Чтобы сохранить тот же post__in , который был передан параметру post__in , вам необходимо передать post__in как значение для аргумента post__in и ASC в аргумент order

 $query_args = [ 'posts_per_page' => $products, 'no_found_rows' => true, 'post_type' => 'product', 'post__in' => [161,165,131,202], 'orderby' => 'post__in', 'order' => 'ASC' ]; 

РЕДАКТИРОВАТЬ

Глядя на ваше редактирование, у вас есть плохой фильтр где-то, скорее всего, это плохое действие pre_get_posts или фильтр posts_orderby . Сделайте два следующих теста

  • Добавьте 'suppress_filters' => true, к вашим аргументам запроса, если это помогает, у вас плохой фильтр

  • Добавить remove_all_actions( 'pre_get_posts' ); прежде чем выполнять свой запрос, если это поможет, у вас есть плохой фильтр pre_get_posts

  • Третьей, но наиболее вероятной бесполезной проверкой было бы добавить wp_reset_query() перед пользовательским запросом, если это помогает, у вас есть плохие запросы где-то, скорее всего, с помощью query_posts

Чтобы включить другие сообщения не в массив, вы можете попробовать следующее, которое создает массив с ключами, которые объединяют идентификатор сообщения с индикатором, чтобы вы могли сделать сортировку ключей (ksort) и сначала возвращать все сообщения с массивом

 $query_args = array('posts_per_page' => $products, 'no_found_rows' => 1, 'post_status' => 'publish', 'post_type' => 'product' ); $r = new WP_Query($query_args); $my_posts = array(); $id_order = array(161, 165, 131, 202); foreach($r->posts as $key => $the_post){ if (in_array($the_post->ID, $id_order)) { $index = array_search($the_post->ID, $id_order); $my_posts["a" . $index . '_' . $the_post->ID] = $the_post; // store the order of the returned posts by post ID } else { $my_posts["b0_" . $the_post->ID] = $the_post; // store the order of the returned posts by post ID } } ksort($my_posts); foreach($my_posts as $post){ // go through custom list of post IDs setup_postdata($post); // do your content here ?><article><h2><?php the_title();?></h2><?php the_content(); ?></article><?php } 

Вы можете заказать в порядке возрастания или убывания, но вы не можете указать индивидуальный заказ – по крайней мере, в параметрах запроса.

Самый простой способ сделать то, что вы хотите сделать – отображать избранные продукты в определенном порядке, – это переупорядочить результаты после возникновения запроса. То есть, если это возможно для вас вернуться и изменить этот код, когда вы хотите изменить заказ (или добавить новые продукты). Если вы хотите получить более надежное решение, я бы посмотрел на добавление настраиваемого поля к продуктам, например «featured_order», а затем заказываю ваш запрос этим полем. Я могу пропустить это, если вы пожелаете.

Тем не менее, предполагая, что вы после самого легкого решения здесь, вы захотите добавить что-то вроде этого в конец фрагмента кода, который вы опубликовали:

 $my_posts = array(); $id_order = array(161, 165, 131, 202); foreach($r->posts as $key => $the_post){ $my_posts[$the_post->ID] = $key; // store the order of the returned posts by post ID } foreach($id_order as $id){ // go through custom list of post IDs $post = $r->posts[$my_posts[$id]]; // grab the query result for the post ID we want setup_postdata($post); // the_title(); the_content(); ........ } 

Важно отметить, что если идентификатор сообщения отсутствует в массиве $id_order , он не будет показан этим кодом, даже если он был возвращен запросом.

EDIT : Если вы хотите, чтобы другие сообщения NOT в массиве все еще возвращались, см. Ответ, отправленный juz.