Могу ли я объединить 2 новых WP_Query ($ variable)?

15

Я использую многосайтовую сеть и настроил SQL-запрос, который использует swith_to_blog (); и запрашивает сообщения.

Есть ли способ, которым я могу объявить запрос внутри нового WP_Query и фактически объединить этот запрос с другим?

В основном, если я делаю это:

$number1 = new WP_Query($multisitequery);

Могу ли я объединить это с:

$number2 = new WP_Query($normalquery);

$normalquery содержит настройки, такие как разбиение на страницы, на страницу, отрывок, заголовок и т. д. в коротком коде портфолио.

Я хотел бы включить запрошенные сообщения из моего нового $multisiteзапроса.

Можно ли этого достичь? Просто хочу спасти меня от создания совершенно новой настройки шорткода LOL

Спасибо заранее. Рори

EDIT ========

Что у меня есть:

$portfolio = array();
$portfolio = $settings;

Далее вниз по моей функции портфолио "после всех настроек $ ['options']" у меня есть:

$portfolio_query = new WP_Query( $portfolio );

$portfolio_queryиспользует цикл на шаблоне страницы.

Я хочу добавить дополнительный запрос в это так:

global $wpdb, $blog_id, $post;

$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM wp_blogs ORDER BY blog_id" ) );

$globalcontainer = array();

foreach ($blogs as $blog){

   switch_to_blog($blog->blog_id);

   $globalquery = query_posts($args);

   $globalcontainer = array_merge( $globalcontainer, $globalquery );

   restore_current_blog();
}

где я предполагаю, что $globalcontainerэто будет массив для объединения в wp_query();.

Таким образом, принимая во внимание то, что вы ответили, теоретически я мог бы просто:

$mergedqueryargs = array_merge($portfolio , $globalcontainer);
$portfolio_query = new WP_query($mergedqueryargs);

Это было бы правильно?

Во-вторых, что касается перезаписи ключа массива array_merge ..... Как бы я остановил перезапись?

Рори Ротон
источник

Ответы:

28

Вы не будете делать ничего хорошего, просто объединяя аргументы, вам нужно объединить полученный массив записей и счетчик post_count. Это работает для меня:

//setup your queries as you already do
$query1 = new WP_Query($args_for_query1);
$query2 = new WP_Query($args_for_query2);

//create new empty query and populate it with the other two
$wp_query = new WP_Query();
$wp_query->posts = array_merge( $query1->posts, $query2->posts );

//populate post_count count for the loop to work correctly
$wp_query->post_count = $query1->post_count + $query2->post_count;
guidod
источник
Это выглядит хорошо, но я ищу решение, которое можно использовать с хуком pre_get_posts - т.е. мне нужно изменить существующий объект WP_Query. Я пытался использовать '$ wp_query-> init ();' вместо '$ wp_query = new WP_Query ();', но это, похоже, все портит. Какие-либо предложения?
запрет геоинженерии
1
Вы должны добавить другой вопрос, так как это другой ответ, но вы можете использовать этот же код, но только части query2, изменив части -> posts и -> post_count объекта $ wp_query, чтобы получить сумму исходного запроса pre_get_posts дает вам и второй запрос, который вы хотите добавить.
Гуидод
1
Как я могу удалить дубликаты из этого объединенного массива?
Рошан
Спасибо за это. Был проблемный meta_query с использованием отношения OR. Разделите это, используя эту технику, и пошли от 41 до 0,01.
Крейг Харшбаргер
@ ban-geoengineering Вы когда-нибудь понимали это? Я застрял с этим также.
Харви
17

Я обычно объединяю их массивы идентификаторов и делаю третий запрос. Чтобы первый набор запросов был дешевым, я возвращаю их идентификаторы только с помощью параметра fields, например:

//setup your queries with extra parameter fields => ids
$query1 = new WP_Query(array('fields' => 'ids','other_parameters' => 'etc'));
$query2 = new WP_Query(array('fields' => 'ids','other_parameters'=>'etc'));

//now you got post IDs in $query->posts
$allTheIDs = array_merge($query1->posts,$query2->posts);

//new query, using post__in parameter
$finalQuery = new WP_Query(array('post__in' => $allTheIDs));

Надеюсь это поможет

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

После моего ответа оригинальный вопрос отредактирован для получения информации о нескольких участках. В случае слияния мультисайтовых постов это не работает.

Бора Ялчин
источник
2
Этот ответ работает хорошо, и кажется, что взломать меньше, чем лучшее решение. Использовал это год или около того назад и вернулся, чтобы использовать его снова сейчас. Спасибо.
Дэйви,
Как это может работать должным образом, когда post_ID не являются уникальными в многосайтовой области (они уникальны для каждого блога, но несколько сообщений могут иметь одинаковые идентификаторы в сети)?
Адал
1
@Adal Исходный вопрос редактируется после моего ответа, поэтому мой ответ имеет отношение к одной области сайта. с мультисайтом я никогда не пытался объединять запросы, и в этом случае, конечно, это не будет работать, запросы должны быть сделаны отдельно и объединены. После объединения вы можете попробовать упорядочить их с помощью функций сортировки php (сортировка по дате публикации и т. Д.).
Бора Ялчин
3
Вы можете сохранить сортировку, используя 'orderby' => 'post__in'последний запрос.
fregante
2
для пользовательских типов записей, я думаю, что параметр post_type нужен в любом случае, даже с запросом по идентификаторам, потому что по умолчанию это post_type = post @RobbTe
Bora
4

Итак, если у вас есть это:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Я полагаю, вы определяете это где-то ранее?

$multisitequery = array();
$normalquery = array();

... в этом случае, чтобы объединить два запроса, просто array_merge()два массива перед передачей их new WP_Query():

$merged_query_args = array_merge( $normalquery, $multisitequery );

$merged_query = new WP_Query( $merged_query_args );

Обратите внимание, что порядок важен при array_merge()звонке. Если оба имеют одинаковый ключ массива, второй массив перезапишет первый массив.

Чип Беннетт
источник
Спасибо за ответ Чип, высоко ценится. Я отредактировал свой оригинальный вопрос, чтобы дать вам лучшее представление о том, с чем мне нужно работать. Большое спасибо действительно, и я с нетерпением жду другого упакованного знания ответ lol Спасибо
Рори Ротон