Kann ich 2 neue WP_Query ($ variable) zusammenführen?
4 Antworten
- Stimmen
-
- 2013-11-13
Sie werdennicht viel Gutestun,wenn Sienur die Argumente zusammenführen. Siemüssen das resultierende Posts-Array und die Anzahlpost_count zusammenführen.Dasfunktioniertbei 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;
You won't do much good just merging the arguments, you need to merge the resulting posts array and the post_count count. This works for me:
//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;
-
Das siehtgut aus,aberich suchenacheiner Lösung,diemit dem Hookpre_get_posts verwendet werden kann - d. H. Ichmussein vorhandenes WP_Query-Objekt ändern.Ich habe versucht,'$ wp_query->init ();'anstelle von '$ wp_query=new WP_Query ();',aber das scheint die Dinge durcheinander zubringen.Irgendwelche Vorschläge?This looks good, but I am looking for a solution that can be used with the pre_get_posts hook - i.e., I need to modify an existing WP_Query object. I have tried using '$wp_query->init();' instead of '$wp_query = new WP_Query();', but that seems to mess things up. Any suggestions?
- 0
- 2013-12-30
- ban-geoengineering
-
Sie sollteneine andere Frage hinzufügen,daes sich umeine andere Antwort handelt. Sie könnenjedoch denselben Code verwenden,jedochnur 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 Abfrageenthalten,diepre_get_postsenthältgibt Ihnen und die zweite Abfrage,die Sie anhängenmöchten.You should add a different question since it's a different answer, but you can use this same code but only the query2 parts, modifying the ->posts and ->post_count parts of the $wp_query object to have the sum of the original query that pre_get_posts gives you and the second query you want to append.
- 1
- 2014-01-03
- guidod
-
Wie kannich Duplikate aus diesem zusammengeführten Arrayentfernen?How can I remove duplicates from this merged array?
- 1
- 2015-11-05
- roshan
-
Danke dafür.Hatteeine problematischemeta_querymit einer ODER-Beziehung.Teilen Sieesmit dieser Technik auf undgehen Sie von 41s auf 0,01s.Thanks for this. Had a problematic meta_query using an OR relation. Split it up using this technique and went from 41s to 0.01s.
- 0
- 2016-05-08
- Craig Harshbarger
-
@ban-geoengineering Hast du dasjemals herausgefunden?Ichbin auch damitfestgefahren.@ban-geoengineering Have you ever figured this out? I am stuck with this as well.
- 0
- 2019-10-28
- harvey
-
@harvey Entschuldigung,ich kann keinen Codefinden,der damit zutun hat.(Es war vorein paar Jahren.) Ambesten stellen Sieeine neue Frage.Viel Glück.:-)@harvey Sorry, can't find any code to do with that. (It was a few years back.) Your best bet might be to post a new question. Good luck. :-)
- 0
- 2019-10-28
- ban-geoengineering
-
Wenn Sie am Endeein neues Arrayerstellen und Duplikatemit "array_unique ()"entfernen,sollten Siein der Lage sein,"$ wp_query->post_count"mit "count ($ wp_query->posts)" zufüllenIf you end up creating a new array and removing duplicates using something like `array_unique()`, you should be able to populate `$wp_query->post_count` with `count($wp_query->posts)`
- 0
- 2020-06-03
- armadadrive
-
- 2015-07-30
Ichfügeim Allgemeinenihre ID-Arrays zusammen undmacheeine dritte Abfrage.Um denersten Satz von Abfragenbillig zu halten,gebe ichihre IDsnurmit denfolgenden 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
---EDIT---
Nachmeiner Antwort wird die ursprüngliche Fragefür Details anmehreren Standortenbearbeitet.Bei Post-Mergesmit mehreren Standortenfunktioniert diesnicht.
I generally merge their ID arrays and make a third query. To keep first set of queries cheap I only return their ID's using fields parameter like this:
//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));
Hope this helps
---EDIT---
After my answer original question is edited for multisite details. In case of multisite post merges this does not work.
-
Diese Antwortfunktioniertgut undfühlt sich weniger wieein Hack an als die Top-Lösung.Ich habees vor ungefähreinem Jahrbenutzt undbin jetzt zurückgekommen,umes wieder zubenutzen.Vielen Dank.This answer works well and feels like less of a hack than the top solution. Used it a year or so ago and came back to use it again now. Thank you.
- 2
- 2017-07-05
- Davey
-
Wie kann dies ordnungsgemäßfunktionieren,wennpost_IDsim Multisite-Bereichnichteindeutig sind (sie sindpro Blogeindeutig,abermehrere Posts könnenim gesamten Netzwerk dieselben IDs haben)?How can this work properly when post_ID's are not unique on the multisite scope (they are unique per blog but several posts can have the same ID's across the network)?
- 0
- 2017-10-05
- Adal
-
@Adal Die ursprüngliche Frage wirdnachmeiner Antwortbearbeitet,sodassmeine Antwortfür den Umfangeinereinzelnen Site relevantist.Mit Multisite habeichnie versucht,Abfragen zusammenzuführen. In diesem Fallfunktioniert diesnatürlichnicht. Abfragenmüssen separaterstellt und zusammengeführt werden.Nach dem Zusammenführen können Sie versuchen,siemit PHP-Sortierfunktionen zubestellen (nach Veröffentlichungsdatum sortieren usw.).@Adal Original question is edited after my answer so my answer is relevant for single site scope. with multisite I never tried to merge queries and in that case of course this won't work, queries need to be separately made and merged. After merge you can try ordering them with php sorting functions maybe (sort for publish date etc).
- 1
- 2017-10-06
- Bora Yalcin
-
Sie können die Sortierungbeibehalten,indem Siein der letzten Abfrage [`'orderby'=> 'post__in'`] (https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters) verwenden.You can preserve the sorting by using [`'orderby' => 'post__in'`](https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters) in the last query.
- 3
- 2018-02-23
- fregante
-
Diesfunktioniertnurbei mir,wenn derpost_typein der $finalQueryfestgelegt wirdThis only works for me when setting the post_type in the $finalQuery
- 0
- 2019-01-15
- RobbTe
-
Ich denke,fürbenutzerdefinierte Beitragstypenbenötigt der Parameterpost_type dies aufjeden Fall,auch wennernach IDsfragt,daes sich standardmäßig umpost_type=post @RobbTe handeltfor custom post types, I think, post_type param need that in any case, even with asking by ids because it is post_type=post by default @RobbTe
- 2
- 2019-01-15
- Bora Yalcin
-
- 2012-06-17
Also,wenn Sie dies haben:
$number1 = new WP_Query($multisitequery); $number2 = new WP_Query($normalquery);
Ichnehme an,Sie definieren dieseirgendwo zuvor?
$multisitequery = array(); $normalquery = array();
...in diesem Fall zum Zusammenführen derbeiden Abfrageneinfach
array_merge()
diebeiden Arrays,bevor sie annew WP_Query()
übergeben werden:$merged_query_args = array_merge( $normalquery, $multisitequery ); $merged_query = new WP_Query( $merged_query_args );
Beachten Sie,dass die Reihenfolgebeim Aufruf von
array_merge()
wichtigist.Wennbeide denselben Array-Schlüssel haben,überschreibt das zweite Array daserste Array.So, if you have this:
$number1 = new WP_Query($multisitequery); $number2 = new WP_Query($normalquery);
I assume you define these somewhere previous?
$multisitequery = array(); $normalquery = array();
...in which case, to merge the two queries, just
array_merge()
the two arrays before passing them tonew WP_Query()
:$merged_query_args = array_merge( $normalquery, $multisitequery ); $merged_query = new WP_Query( $merged_query_args );
Note that order is important in the
array_merge()
call. If both have the same array key, the second array will overwrite the first array.-
Vielen Dankfür die Antwort von Chip,sehrgeschätzt. Ich habemeine ursprüngliche Fragebearbeitet,um Ihneneine bessere Vorstellung davon zugeben,mit wasich arbeitenmuss. Vielen Dankin der Tat undichfreuemich aufeine weitere wissensreiche Antwort lol Vielen DankThank you for replying Chip, much appreciated. I have edited my original question to give you a better idea of what i have to work with. Many thanks indeed and i look forward to another knowledge packed reply lol Thanks
- 0
- 2012-06-17
- Rory Rothon
-
- 2020-07-16
So können Siebeispielsweise zwei WP_Query Abfragenmit unterschiedlichen post_type oder anderen Sortierdaten zusammenkleben und diese dannmit ids einkleben Eine WP_Query -Abfrage,die vollständigfunktioniert. Um die Sortierungbeim Klebenbeizubehalten,müssen Sie orderby=>post__in
Mein Beispielist,wieein neuer WP_Query -Zykluserstellt wird und sich aufjeden anderen Zyklus zum Anzeigen von Posts auswirken kann,indem newglobal_change_of_sorting_posts-- > change_query_posts ()=> query_posts () müssen Sie aufrufen,bevor Sie den Zyklus zum Anzeigen von Posts verarbeiten können!
class global_change_of_sorting_posts { public function get_posts_ids() { $query1 = new WP_Query([ 'fields' => 'ids', 'posts_per_page' => -1, 'post_type' => 'post', ]); $query2 = new WP_Query([ 'posts_per_page' => -1, 'fields' => 'ids', 'post_type' => 'custom-post', ]); $merge_ids_posts = $query1->posts + $query2->posts; wp_reset_query(); return $merge_ids_posts; } public function get_posts_wp_query() { $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $posts_per_page = 40; $wp_query = new WP_Query([ 'posts_per_page' => $posts_per_page, 'paged' => $paged, 'post__in' => $this->get_posts_ids(), 'orderby' => 'post__in', ]); while ($wp_query->have_posts()) { $wp_query->the_post(); var_dump(get_the_ID()); } } public function change_query_posts($query_string) { parse_str($query_string, $args); $args['post__in'] = $this->get_posts_ids(); $args['orderby'] = 'post__in'; query_posts($args); # query conversion } }
Thus, you can glue two WP_Query queries with different post_type or other sorting data, for example, and then glue them by ids into one WP_Query query that will fully work - in order to preserve the sorting when gluing, you need to specify orderby => post__in
my example is how it creates a new WP_Query cycle and can affect any other cycle for displaying posts by calling new global_change_of_sorting_posts->change_query_posts() => query_posts() you need to call before processing the cycle for displaying posts!
class global_change_of_sorting_posts { public function get_posts_ids() { $query1 = new WP_Query([ 'fields' => 'ids', 'posts_per_page' => -1, 'post_type' => 'post', ]); $query2 = new WP_Query([ 'posts_per_page' => -1, 'fields' => 'ids', 'post_type' => 'custom-post', ]); $merge_ids_posts = $query1->posts + $query2->posts; wp_reset_query(); return $merge_ids_posts; } public function get_posts_wp_query() { $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $posts_per_page = 40; $wp_query = new WP_Query([ 'posts_per_page' => $posts_per_page, 'paged' => $paged, 'post__in' => $this->get_posts_ids(), 'orderby' => 'post__in', ]); while ($wp_query->have_posts()) { $wp_query->the_post(); var_dump(get_the_ID()); } } public function change_query_posts($query_string) { parse_str($query_string, $args); $args['post__in'] = $this->get_posts_ids(); $args['orderby'] = 'post__in'; query_posts($args); # query conversion } }
Ich verwendeein Netzwerkmit mehreren Standorten und habeeine SQL-Abfrageeingerichtet,die swith_to_blog () verwendet. undfragt die Beiträge ab.
Gibteseine Möglichkeit,die Abfragein einerneuen WP_Query zu deklarieren und diese Abfragetatsächlichmit einer anderen zusammenzuführen?
Grundsätzlich,wennich dasmache:
Kanniches zusammenführenmit:
$normalquery
enthält Einstellungen wie Paginierung,pro Seite,Auszug,Titel usw.füreinen Portfolio-Shortcode.Ichmöchte,dass abgefragte Beiträge ausmeinerneuen
$multisite
-Abfrage aufgenommen werden.Kann dieserreicht werden? Ichmöchtemichnur davorbewahren,ein ganzneues Shortcode-Setup zuerstellen lol
Vielen Dankim Voraus. Rory
EDIT========
Wasich habeist:
Weiter untenin meiner Portfolio-Funktion "nach allen $ Einstellungen ['Optionen']" habeich:
Die
$portfolio_query
verwendeteine Schleifein einer Seitenvorlage.Ichmöchteeine zusätzliche Abfrage hinzufügen,wiefolgt:
wobeiich davon ausgehe,dass
$globalcontainer
das Arrayist,dasmitwp_query();
zusammengeführt werden soll.Wennich also an Bordnehme,worauf Siegeantwortet haben,könnteichtheoretischeinfach:
Wäre das richtig?
Zweitensbezüglich des Array_merge-Array-Schlüssels überschreiben ..... Wie würdeich vorgehen,umein Überschreiben zu stoppen?