Чи можу я об'єднати 2 нових WP_Query ($ змінна)?


15

Я запускаю багатосайтову мережу, і у мене встановлений запит sql, який використовує swith_to_blog (); і запитує дописів.

Чи є спосіб, щоб я міг оголосити запит всередині нового WP_Query і насправді об'єднати цей запит з іншим?

В основному, якщо я це роблю:

$number1 = new WP_Query($multisitequery);

Чи можу я об'єднати його з:

$number2 = new WP_Query($normalquery);

$normalquery містить параметри, такі як пагінація, на сторінку, уривок, заголовок тощо ... на короткому коді портфоліо.

Я хотів би, щоб він містив запитувані публікації з мого нового $multisiteзапиту.

Чи можна цього досягти? Просто хочу врятувати мене від створення абсолютно нового налаштування короткого коду, хай

Заздалегідь дякую. Рорі

РЕДАКЦІЯ ========

Що у мене є:

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

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

$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

Ви не принесете великої користі, просто об’єднавши аргументи, вам потрібно об'єднати отриманий масив повідомлень і кількість подій. Це працює для мене:

//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;

Це добре виглядає, але я шукаю рішення, яке можна використовувати з гаком pre_get_posts - тобто мені потрібно змінити існуючий об’єкт WP_Query. Я спробував використовувати '$ wp_query-> init ();' замість '$ wp_query = new WP_Query ();', але це, здається, псує речі. Будь-які пропозиції?
заборона-геоінженерія

1
Вам слід додати інше запитання, оскільки це інша відповідь, але ви можете використовувати цей самий код, але лише частину запиту2, модифікуючи частини -> публікації та -> частини post_count об'єкта $ wp_query, щоб мати суму оригінального запиту, що pre_get_posts дає вам і другий запит, який ви хочете додати.
настанова

1
Як я можу видалити дублікати з цього об'єднаного масиву?
рошан

Дякую за це Був проблемний мета-запит із використанням відношення АБО. Розподіліть його за допомогою цієї методики і пройшов шлях від 41 до 0,01.
Крейг Харшбаргер

@ ban-geoengineering Ви коли-небудь розбиралися в цьому? Я також зациклювався на цьому.
Harvey

17

Я, як правило, зливаю їх масиви ідентифікаторів і роблю третій запит. Щоб зберегти перший набір запитів дешевим, я повертаю лише їх ідентифікатор, використовуючи такий параметр полів:

//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 потрібно, що в будь-якому випадку, навіть із запитаннями ID, тому що це post_type = повідомлення за замовчуванням @RobbTe
Бора Ялчин

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()виклику. Якщо обидва мають однаковий ключ масиву, другий масив замінить перший масив.


Дякую за відповідь Чіп, дуже вдячний. Я відредагував своє первісне запитання, щоб краще зрозуміти, з чим мені працювати.
Щиро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.