Posso unire 2 nuovi WP_Query ($ variabile)?


15

Sto gestendo una rete multisito e ho installato una query sql che utilizza swith_to_blog (); e interroga i post.

C'è un modo in cui posso dichiarare la query all'interno di un nuovo WP_Query e in realtà unire quella query con un'altra?

Fondamentalmente se lo faccio:

$number1 = new WP_Query($multisitequery);

Posso unirlo con:

$number2 = new WP_Query($normalquery);

$normalquery contiene impostazioni come l'impaginazione, per pagina, estratto, titolo ecc ... su uno shortcode del portfolio.

Vorrei che includesse i post interrogati dalla mia nuova $multisitequery.

Questo può essere raggiunto? Volevo solo salvarmi dalla creazione di una nuova configurazione di shortcode lol

Molte grazie in anticipo. Rory

EDIT ========

Quello che ho è:

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

Più in basso la mia funzione di portafoglio "dopo tutte le $ settings ['opzioni']" ho:

$portfolio_query = new WP_Query( $portfolio );

l' $portfolio_queryutilizza un ciclo su un modello di pagina.

Voglio aggiungere una query extra in questo modo in questo modo:

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

dove presumo che $globalcontainersarebbe l'array da unire in wp_query();.

Quindi, prendendo in considerazione ciò con cui hai risposto, in teoria potrei semplicemente:

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

Sarebbe corretto?

In secondo luogo, per quanto riguarda la sovrascrittura della chiave dell'array array_merge ..... Come potrei fare per interrompere una sovrascrittura?

Risposte:


28

Non farai molto bene solo unendo gli argomenti, devi unire l'array dei post risultante e il conteggio post_count. Questo funziona per 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;

Questo sembra buono, ma sto cercando una soluzione che può essere utilizzata con l'hook pre_get_posts - cioè, ho bisogno di modificare un oggetto WP_Query esistente. Ho provato a usare '$ wp_query-> init ();' invece di '$ wp_query = new WP_Query ();', ma questo sembra rovinare tutto. Eventuali suggerimenti?
divieto di geoingegneria il

1
Dovresti aggiungere una domanda diversa poiché è una risposta diversa, ma puoi usare questo stesso codice ma solo le parti query2, modificando le parti -> post e -> post_count dell'oggetto $ wp_query per avere la somma della query originale che pre_get_posts ti dà e la seconda query che vuoi aggiungere.
guidod,

1
Come posso rimuovere i duplicati da questo array unito?
Roshan,

Grazie per questo. Ho avuto una meta_query problematica usando una relazione OR. Dividilo usando questa tecnica e passò da 41 a 0,01 secondi.
Craig Harshbarger,

@ ban-geoengineering L'hai mai capito? Sono bloccato anche con questo.
Harvey,

17

In genere unisco i loro array ID e faccio una terza query. Per mantenere a buon mercato il primo set di query, restituisco solo i loro ID usando il parametro field 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 sia di aiuto

---MODIFICARE---

Dopo la mia risposta, la domanda originale viene modificata per i dettagli di più siti. In caso di unione di post su più siti non funziona.


2
Questa risposta funziona bene e sembra meno un hack della soluzione migliore. L'ho usato circa un anno fa e sono tornato a usarlo di nuovo ora. Grazie.
Davey,

Come può funzionare correttamente quando i post_ID non sono univoci nell'ambito multisito (sono univoci per blog ma diversi post possono avere gli stessi ID sulla rete)?
Adal,

1
@Adal La domanda originale viene modificata dopo la mia risposta, quindi la mia risposta è rilevante per l'ambito di un singolo sito. con il multisito non ho mai provato a unire le query e in tal caso ovviamente non funzionerà, le query devono essere fatte e unite separatamente. Dopo l'unione puoi provare a ordinarli forse con le funzioni di ordinamento php (ordina per data di pubblicazione ecc.).
Bora Yalcin,

3
È possibile conservare l'ordinamento utilizzando 'orderby' => 'post__in'nell'ultima query.
fregante,

2
per i tipi di post personalizzati, penso che post_type param ne abbia bisogno in ogni caso, anche con la richiesta di id perché è post_type = post di default @RobbTe
Bora Yalcin

4

Quindi, se hai questo:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Presumo tu li definisca da qualche parte in precedenza?

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

... nel qual caso, per unire le due query, solo array_merge()le due matrici prima di passarle a new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

Si noti che l'ordine è importante nella array_merge()chiamata. Se entrambi hanno la stessa chiave di array, il secondo array sovrascriverà il primo array.


Grazie per aver risposto Chip, molto apprezzato. Ho modificato la mia domanda originale per darti un'idea migliore di cosa devo lavorare. Molte grazie davvero e attendo con impazienza un'altra risposta piena di risposte lol Grazie
Rory Rothon il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.