Puis-je fusionner 2 nouvelles WP_Query ($ variable)?
4 réponses
- votes
-
- 2013-11-13
Vousne ferezpasgrand-chose debien simplementen fusionnant les arguments,vous devezfusionner letableau demessages résultantet lenombre depost_count.Celafonctionnepourmoi:
//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;
-
Cela semblebon,maisje recherche une solution quipeut être utilisée avec le hookpre_get_posts - c'est-à-dire queje doismodifier un objet WP_Queryexistant.J'aiessayé d'utiliser '$ wp_query->init ();'au lieu de '$ wp_query=new WP_Query ();',mais cela semblegâcher les choses.Aucune suggestion?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
-
Vous devriez ajouter une question différente car c'est une réponse différente,mais vouspouvez utiliser cemême codemais uniquement lesparties query2,en modifiant lesparties ->postset ->post_count de l'objet $ wp_querypour avoir la somme de la requête d'origine quipre_get_postsvous donneet la deuxième requête que vous souhaitez ajouter.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
-
Commentpuis-je supprimer les doublons de cetableaufusionné?How can I remove duplicates from this merged array?
- 1
- 2015-11-05
- roshan
-
Mercipour cela.Avait uneméta_queryproblématique utilisant une relation OR.Divisez-leen utilisant cettetechniqueet estpassé de 41s à 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 Avez-vous déjà compris cela?Je suis également coincé avec cela.@ban-geoengineering Have you ever figured this out? I am stuck with this as well.
- 0
- 2019-10-28
- harvey
-
@harvey Désolé,je netrouve aucun code à voir avec ça.(C'étaitil y a quelques années.) Votremeilleurparipourrait être depublier unenouvelle question.Bonne chance.:-)@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
-
Si vousfinissezpar créer unnouveautableauet supprimer les doublonsen utilisant quelque chose comme `array_unique ()`,vous devriezpouvoir remplir `$ wp_query->post_count` avec` 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
Jefusionnegénéralement leurstableaux d'identifiantset fais unetroisième requête.Pourgarder lepremierensemble de requêtesbonmarché,je ne renvoie que leursidentifiantsen utilisant leparamètre de champs comme celui-ci:
//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));
J'espère que cela vous aidera
<₹---EDIT---
Aprèsma réponse,la question originaleestmodifiéepour les détailsmultisites.En cas defusion depublicationsmultisites,celane fonctionnepas.
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.
-
Cette réponsefonctionnebien et ressemblemoins à un hack que lameilleure solution.Je l'ai utiliséil y aenviron un anet je suis revenupour l'utiliser ànouveaumaintenant.Je vous remercie.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
-
Comment celapeut-ilfonctionner correctement lorsque lespost_IDne sontpas uniques sur l'étenduemultisite (ils sont uniquesparblogmaisplusieurs articlespeuvent avoir lemême ID sur le réseau)?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 La question originaleestmodifiée aprèsma réponse,doncma réponseestpertinentepour laportée d'un site unique.avec lemultisite,je n'aijamaisessayé defusionner les requêteset dans ce cas,bien sûr,celane fonctionnerapas,les requêtes doivent êtrefaiteset fusionnées séparément.Après lafusion,vouspouvezessayer de les ordonner avec lesfonctions detriphppeut-être (trierpar date depublication,etc.).@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
-
Vouspouvez conserver letrien utilisant [`` 'orderby'=> 'post__in'`] (https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters) dans la dernière requête.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
-
Celane fonctionne quepourmoi lors de la définition dupost_type dans $finalQueryThis only works for me when setting the post_type in the $finalQuery
- 0
- 2019-01-15
- RobbTe
-
pour lestypes depublicationpersonnalisés,je pense que leparamètrepost_typeen abesoin danstous les cas,mêmeen demandantparids car c'estpost_type=postpar défaut @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
Donc,si vous avez ceci:
$number1 = new WP_Query($multisitequery); $number2 = new WP_Query($normalquery);
Je suppose que vous les définissez quelquepart auparavant?
$multisitequery = array(); $normalquery = array();
... auquel cas,pourfusionner les deux requêtes,il suffit de
array_merge()
les deuxtableaux avant de lestransmettre ànew WP_Query()
:$merged_query_args = array_merge( $normalquery, $multisitequery ); $merged_query = new WP_Query( $merged_query_args );
Notez que l'ordreestimportant dans l'appel
array_merge()
.Si les deux ont lamême clé detableau,le deuxièmetableau écrasera lepremiertableau.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.-
Merci d'avoir répondu Chip,très apprécié. J'ai éditéma question originalepour vous donner unemeilleureidée de ce avec quoije doistravailler. Mercibeaucoupet j'attends avecimpatience une autre réponse richeen connaissances lol MerciThank 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
Ainsi,vouspouvez coller deux requêtes WP_Query avec différents post_type ou d'autres données detri,parexemple,puis les collerpar identifiants dans une requête WP_Query quifonctionnerapleinement - afin depréserver letri lors du collage,vous devez spécifier orderby=>post__in
monexempleest de savoir commentil crée unnouveau cycle WP_Query et peut affectertout autre cycle d'affichage des articlesen appelant newglobal_change_of_sorting_posts- > change_query_posts ()=> query_posts () vous devez appeler avant detraiter le cycle d'affichage des articles!
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 } }
J'utilise un réseaumultisiteet j'ai configuré une requête SQL qui utilise swith_to_blog ();et interroge lesmessages.
Existe-t-il unmoyen de déclarer la requête dans unenouvelle WP_Queryet defusionner cette requête avec une autre?
Engros,sije fais ceci:
Puis-je lefusionner avec:
$normalquery
contient desparamètrestels que lapagination,parpage,extrait,titre,etc. sur un shortcode deportfolio.Je souhaiterais qu'ilinclue lesmessagesinterrogés demanouvelle requête
$multisite
.Est-ce que celapeut être réalisé? Je veuxjusteme sauver de la création d'unetoutenouvelle configuration de shortcode lol
Merci d'avance. Rory
Ce quej'ai,c'est:
Plusbas,mafonctionportfolio "aprèstous les $ settings ['options']" quej'ai:
$portfolio_query
utilise uneboucle sur unmodèle depage.Je veux ajouter une requête supplémentaire dans ceci comme ceci:
oùje suppose que
$globalcontainer
serait letableau àfusionner danswp_query();
.Donc,en tenant compte de ce que vous avez répondu,en théorie,je pourrais simplement:
Est-ce que ce serait correct?
Deuxièmement,concernant l'écrasement de la clé dutableau array_merge ..... Comment arrêter un écrasement?