Posso unire 2 nuovi WP_Query ($ variable)?
4 risposta
- voti
-
- 2013-11-13
Nonfaraimoltobene semplicemente unendogli argomenti,devi unire l'array dipost risultantee il conteggiopost_count.Questofunzionaperme:
//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;
-
Sembrabuono,ma sto cercando una soluzione chepossaessere utilizzata con l'hookpre_get_posts,ovvero devomodificare un oggetto WP_Queryesistente.Hoprovato a usare '$ wp_query->init ();'invece di '$ wp_query=new WP_Query ();',ma questo sembra rovinare le cose.Eventuali suggerimenti?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
-
Dovresti aggiungere una domanda diversapoiché è una risposta diversa,mapuoi usare lo stesso codicema solo leparti query2,modificando leparti ->postse ->post_count dell'oggetto $ wp_queryper avere la somma della query originale chepre_get_poststi dàe la seconda query che desideri aggiungere.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
-
Comeposso rimuoverei duplicati da questo array unito?How can I remove duplicates from this merged array?
- 1
- 2015-11-05
- roshan
-
Grazieper questo.Aveva unameta_queryproblematica utilizzando una relazione OR.Dividilo usando questatecnicae seipassato da 41 a 0,01.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 L'haimai capito?Sonobloccato anche con questo.@ban-geoengineering Have you ever figured this out? I am stuck with this as well.
- 0
- 2019-10-28
- harvey
-
@harvey Spiacenti,non riesco atrovare alcun codice che abbia a chefare con questo.(Era qualche annofa.) La soluzionemigliorepotrebbeessere quella dipubblicare unanuova domanda.Inbocca al lupo.:-)@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
-
Sefinisciper creare unnuovo arraye rimuoverei duplicati usando qualcosa come `array_unique ()`,dovrestiesserein grado dipopolare `$ wp_query->post_count` con` count ($ wp_query->posts) `If 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
Ingenere uniscoi loro array di IDe faccio unaterza query.Permantenereilprimo set di query abuonmercato,restituisco soloil loro ID utilizzandoilparametrofields come questo:
//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));
Spero che questo aiuti
<"---EDIT---"
Dopo che lamia risposta alla domanda originale è statamodificataperi dettaglimultisito.In caso di unione dipostmultisito,questononfunziona.
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.
-
Questa rispostafunzionabene e sembrameno un hack rispetto alla soluzionemigliore.L'ho usato circa un annofaed ètornatoper usarlo dinuovo ora.Grazie.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
-
Comepuòfunzionare correttamente quandoi post_IDnon sono univocinell'ambitomultisito (sono uniciperblogma diversipostpossono averegli stessi IDin tutta la rete)?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
-
La domanda originale di @Adal vienemodificata dopo lamia risposta,quindi lamia risposta èpertinenteper l'ambito di un singolo sito.conmultisitonon homaiprovato a unire le querye in quel caso ovviamentenonfunzionerà,le query devonoesserefattee unite separatamente.Dopo l'unionepuoiprovare a ordinarli con lefunzioni di ordinamentophp (ordinaper data dipubblicazioneecc.).@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
-
Puoipreservare l'ordinamento utilizzando [`` 'orderby'=> 'post__in'`] (https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters)nell'ultima query.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
-
Questofunziona soloperme quandoimpostopost_typein $finalQueryThis only works for me when setting the post_type in the $finalQuery
- 0
- 2019-01-15
- RobbTe
-
peri tipi dipostpersonalizzati,penso,ilparametropost_typene habisognoin ogni caso,anche con la richiesta daparte degli IDperché èpost_type=post di default @RobbTefor 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
Quindi,se hai questo:
$number1 = new WP_Query($multisitequery); $number2 = new WP_Query($normalquery);
Presumo chetu li definisca da qualchepartein precedenza?
$multisitequery = array(); $normalquery = array();
...in tal caso,per unire le due query,basta
array_merge()
i due arrayprima dipassarli anew WP_Query()
:$merged_query_args = array_merge( $normalquery, $multisitequery ); $merged_query = new WP_Query( $merged_query_args );
Nota che l'ordine èimportantenella chiamata a
array_merge()
.Seentrambi hanno la stessa chiave di array,il secondo array sovrascriveràilprimo 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.-
Grazieper aver risposto Chip,molto apprezzato. Homodificato lamia domanda originaleper darti un'ideamigliore di ciò con cui devo lavorare. Moltegrazie davveroe non vedo l'ora di un'altra risposta ricca di conoscenze lol GrazieThank 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
Pertanto,puoi associare due query WP_Query con diversi post_type o altri dati di ordinamento,adesempio,e poiincollarleper ids una query WP_Query chefunzionerà completamente:perpreservare l'ordinamento durante l'incollaggio,ènecessario specificare orderby=>post__in
ilmioesempio è come crea unnuovo ciclo WP_Query e puòinfluire su qualsiasi altro ciclo di visualizzazione deipost chiamando newglobal_change_of_sorting_posts- > change_query_posts ()=> query_posts () devi chiamareprima dielaborareil ciclo di visualizzazione deipost!
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 } }
Stoeseguendo una retemultisitoe hoimpostato una query sql che utilizza swith_to_blog ();e interrogai post.
Esiste unmodoper dichiarare la query all'interno di unnuovo WP_Querye unireeffettivamente quella query con un'altra?
Fondamentalmente sefaccio questo:
Posso unirlo con:
$normalquery
contieneimpostazioni comeimpaginazione,perpagina,estratto,titoloecc ... su uno shortcode diportfolio.Vorrei cheincludessei postinterrogati dallamianuova query
$multisite
.Puòessere raggiunto? Volevo solo salvarmi dalla creazione di unanuova configurazione di shortcode lol
Moltegraziein anticipo. Rory
<"EDIT========"
Quello che ho è:
Piùin bassonellafunzione delmioportafoglio "dopotutte le $impostazioni ['opzioni']" ho:
$portfolio_query
utilizza un ciclo su unmodello dipagina.Voglio aggiungere una queryextrain questomodo:
dovepresumo che
$globalcontainer
sarebbe l'array dafondereinwp_query();
.Quindi,tenendo conto di ciò che hai risposto,in teoriapotrei semplicemente:
Sarebbe corretto?
Secondo,per quanto riguarda la sovrascrittura della chiave dell'array array_merge ..... Comepossointerrompere una sovrascrittura?