Puis-je fusionner 2 nouveaux WP_Query ($ variable)?

15

J'exécute un réseau multisite et j'ai configuré une requête SQL qui utilise swith_to_blog (); et interroge les messages.

Existe-t-il un moyen de déclarer la requête dans un nouveau WP_Query et de fusionner cette requête avec une autre?

Fondamentalement, si je fais cela:

$number1 = new WP_Query($multisitequery);

Puis-je le fusionner avec:

$number2 = new WP_Query($normalquery);

$normalquery contient des paramètres tels que la pagination, par page, extrait, titre, etc. sur un shortcode de portefeuille.

Je voudrais qu'il inclue les messages interrogés à partir de ma nouvelle $multisiterequête.

Peut-on y parvenir? Je voulais juste me sauver de la création d'une toute nouvelle configuration de shortcode lol

Merci d'avance. Rory

EDIT ========

Ce que j'ai c'est:

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

Plus bas dans ma fonction de portfolio "après tous les $ settings ['options']" j'ai:

$portfolio_query = new WP_Query( $portfolio );

l' $portfolio_queryutilise une boucle sur un modèle de page.

Je veux ajouter une requête supplémentaire à ceci comme ceci:

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

où je suppose que ce $globalcontainerserait le tableau à fusionner dans le wp_query();.

Donc, en tenant compte de ce que vous avez répondu, en théorie, je pourrais simplement:

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

Serait-ce exact?

Deuxièmement, concernant l'écrasement de la clé du tableau array_merge ..... Comment pourrais-je arrêter un écrasement?

Rory Rothon
la source

Réponses:

28

Vous ne ferez pas grand-chose juste en fusionnant les arguments, vous devez fusionner le tableau de messages résultant et le nombre de post_count. Cela fonctionne pour moi:

//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
la source
Cela semble bon, mais je suis à la recherche d'une solution qui peut être utilisée avec le crochet pre_get_posts - c'est-à-dire, j'ai besoin de modifier un objet WP_Query existant. J'ai essayé d'utiliser '$ wp_query-> init ();' au lieu de '$ wp_query = new WP_Query ();', mais cela semble gâcher les choses. Aucune suggestion?
ban-geoengineering
1
Vous devez ajouter une question différente car c'est une réponse différente, mais vous pouvez utiliser ce même code mais uniquement les parties query2, en modifiant les parties -> posts et -> post_count de l'objet $ wp_query pour avoir la somme de la requête d'origine qui pre_get_posts vous donne et la deuxième requête que vous souhaitez ajouter.
guidod
1
Comment supprimer les doublons de ce tableau fusionné?
roshan
Merci pour cela. Avait une méta-requête problématique utilisant une relation OU. Divisez-le en utilisant cette technique et passez de 41s à 0,01s.
Craig Harshbarger
@ ban-geoengineering Avez-vous déjà compris cela? Je suis coincé avec ça aussi.
harvey
17

Je fusionne généralement leurs tableaux d'identification et fais une troisième requête. Pour garder le premier ensemble de requêtes bon marché, je ne renvoie que leurs identifiants en utilisant le paramètre champs comme ceci:

//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 t'aides

---ÉDITER---

Après ma réponse, la question d'origine est modifiée pour des détails multisites. En cas de fusion de postes multisites, cela ne fonctionne pas.

Bora Yalcin
la source
2
Cette réponse fonctionne bien et ressemble moins à un hack que la meilleure solution. Je l'ai utilisé il y a environ un an et je suis revenu à l'utiliser maintenant. Je vous remercie.
Davey
Comment cela peut-il fonctionner correctement lorsque les post_ID ne sont pas uniques sur la portée multisite (ils sont uniques par blog mais plusieurs articles peuvent avoir les mêmes ID sur le réseau)?
Adal
1
@Adal La question d'origine est modifiée après ma réponse, donc ma réponse est pertinente pour la portée d'un seul site. avec multisite, je n'ai jamais essayé de fusionner les requêtes et dans ce cas, bien sûr, cela ne fonctionnera pas, les requêtes doivent être créées et fusionnées séparément. Après la fusion, vous pouvez essayer de les commander avec des fonctions de tri php peut-être (trier pour la date de publication, etc.).
Bora Yalcin
3
Vous pouvez conserver le tri en utilisant 'orderby' => 'post__in'dans la dernière requête.
fregante
2
pour les types de publication personnalisés, je pense que les paramètres post_type en ont besoin dans tous les cas, même avec la demande par identifiants, car il s'agit de post_type = post par défaut @RobbTe
Bora Yalcin
4

Donc, si vous avez ceci:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Je suppose que vous les définissez quelque part précédemment?

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

... auquel cas, pour fusionner les deux requêtes, juste array_merge()les deux tableaux avant de les passer à new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

Notez que l'ordre est important dans l' array_merge()appel. Si les deux ont la même clé de tableau, le second tableau remplacera le premier tableau.

Chip Bennett
la source
Merci d'avoir répondu Chip, très apprécié. J'ai modifié ma question d'origine pour vous donner une meilleure idée de ce avec quoi je dois travailler. Merci beaucoup et j'attends avec impatience une autre réponse pleine de connaissances lol Merci
Rory Rothon