Kann ich 2 neue WP_Query ($ variable) zusammenführen?

13

Ich verwende ein Netzwerk mit mehreren Standorten und habe eine SQL-Abfrage eingerichtet, die swith_to_blog () verwendet. und fragt die Beiträge ab.

Gibt es eine Möglichkeit, die Abfrage in einer neuen WP_Query zu deklarieren und diese Abfrage tatsächlich mit einer anderen zusammenzuführen?

Grundsätzlich, wenn ich das mache:

$number1 = new WP_Query($multisitequery);

Kann ich es zusammenführen mit:

$number2 = new WP_Query($normalquery);

$normalquery Enthält Einstellungen wie Paginierung, pro Seite, Auszug, Titel usw. für einen Portfolio-Shortcode.

Ich möchte, dass abgefragte Beiträge aus meiner neuen $multisiteAbfrage aufgenommen werden.

Kann das erreicht werden? Ich möchte mich nur davor bewahren, ein ganz neues Shortcode-Setup zu erstellen. Lol

Vielen Dank im Voraus. Rory

BEARBEITEN ========

Was ich habe ist:

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

Weiter unten in meiner Portfolio-Funktion "nach all den $ Einstellungen ['Optionen']" habe ich:

$portfolio_query = new WP_Query( $portfolio );

Das $portfolio_queryverwendet eine Schleife für eine Seitenvorlage.

Ich möchte eine zusätzliche Abfrage hinzufügen, wie folgt:

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();
}

wo ich annehme, dass $globalcontainerdas das Array wäre, um in das zu verschmelzen wp_query();.

Wenn Sie also berücksichtigen, worauf Sie geantwortet haben, könnte ich theoretisch einfach:

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

Wäre das richtig?

Zweitens in Bezug auf das Überschreiben des Array-Schlüssel-Array-Schlüssels ..... Wie würde ich vorgehen, um ein Überschreiben zu stoppen?

Rory Rothon
quelle

Antworten:

27

Sie werden nicht viel Gutes tun, wenn Sie nur die Argumente zusammenführen. Sie müssen das resultierende Posts-Array und die Anzahl post_count zusammenführen. Das funktioniert bei mir:

//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
quelle
Das sieht gut aus, aber ich suche nach einer Lösung, die mit dem Hook pre_get_posts verwendet werden kann - dh ich muss ein vorhandenes WP_Query-Objekt ändern. Ich habe versucht, '$ wp_query-> init ();' anstelle von '$ wp_query = new WP_Query ();', aber das scheint die Dinge durcheinander zu bringen. Irgendwelche Vorschläge?
Ban-Geoengineering
1
Sie sollten eine andere Frage hinzufügen, da es sich um eine andere Antwort handelt. Sie können jedoch denselben Code verwenden, jedoch nur die Teile von query2, indem Sie die Teile -> posts und -> post_count des $ wp_query-Objekts so ändern, dass sie die Summe der ursprünglichen Abfrage enthalten, die pre_get_posts enthält gibt Ihnen und die zweite Abfrage, die Sie anhängen möchten.
Guidod
1
Wie kann ich Duplikate aus diesem zusammengeführten Array entfernen?
Roshan
Danke dafür. Hatte eine problematische meta_query mit einer ODER-Beziehung. Teilen Sie es mit dieser Technik auf und gehen Sie von 41s auf 0,01s.
Craig Harshbarger
@ ban-geoengineering Hast du das jemals herausgefunden? Ich bin auch damit festgefahren.
Harvey
17

Im Allgemeinen füge ich ihre ID-Arrays zusammen und mache eine dritte Abfrage. Um die ersten Abfragen billig zu halten, gebe ich ihre IDs nur mit den folgenden Feldparametern zurück:

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

Hoffe das hilft

---BEARBEITEN---

Nach meiner Antwort wird die ursprüngliche Frage für Details an mehreren Standorten bearbeitet. Bei Post-Merges mit mehreren Standorten funktioniert dies nicht.

Bora Yalcin
quelle
2
Diese Antwort funktioniert gut und fühlt sich weniger wie ein Hack an als die Top-Lösung. Ich habe es vor ungefähr einem Jahr benutzt und bin jetzt zurückgekommen, um es wieder zu benutzen. Vielen Dank.
Davey
Wie kann dies ordnungsgemäß funktionieren, wenn post_IDs im Multisite-Bereich nicht eindeutig sind (sie sind pro Blog eindeutig, aber mehrere Posts können im gesamten Netzwerk dieselben IDs haben)?
Adal
1
@Adal Die ursprüngliche Frage wird nach meiner Antwort bearbeitet, sodass meine Antwort für den Umfang einer einzelnen Site relevant ist. Mit Multisite habe ich nie versucht, Abfragen zusammenzuführen. In diesem Fall funktioniert dies natürlich nicht. Abfragen müssen separat erstellt und zusammengeführt werden. Nach dem Zusammenführen können Sie versuchen, sie mit PHP-Sortierfunktionen zu bestellen (nach Veröffentlichungsdatum sortieren usw.).
Bora Yalcin
3
Sie können die Sortierung beibehalten, indem Sie sie 'orderby' => 'post__in'in der letzten Abfrage verwenden.
Fregante
2
Ich denke, für benutzerdefinierte Beitragstypen muss der Parameter post_type dies auf jeden Fall tun, auch wenn nach IDs gefragt wird, da es sich standardmäßig um post_type = post handelt. @RobbTe
Bora Yalcin
4

Also, wenn Sie dies haben:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Ich nehme an, Sie definieren diese irgendwo zuvor?

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

... in diesem Fall, um die beiden Abfragen zusammenzuführen, nur array_merge()die beiden Arrays, bevor Sie sie an new WP_Query()folgende Adresse übergeben :

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

$merged_query = new WP_Query( $merged_query_args );

Beachten Sie, dass die Reihenfolge beim array_merge()Anruf wichtig ist . Wenn beide denselben Array-Schlüssel haben, überschreibt das zweite Array das erste Array.

Chip Bennett
quelle
Vielen Dank für die Antwort von Chip, sehr geschätzt. Ich habe meine ursprüngliche Frage bearbeitet, um Ihnen eine bessere Vorstellung davon zu geben, mit was ich arbeiten muss. Vielen Dank in der Tat und ich freue mich auf eine weitere wissensreiche Antwort lol Danke
Rory Rothon