Czy mogę scalić 2 nowe WP_Query ($ zmienne)?

15

Korzystam z sieci wielu witryn i mam skonfigurowane zapytanie SQL, które używa swith_to_blog (); i odpytuje posty.

Czy istnieje sposób, w jaki mogę zadeklarować zapytanie w nowym WP_Query i faktycznie połączyć to zapytanie z innym?

Zasadniczo, jeśli to zrobię:

$number1 = new WP_Query($multisitequery);

Czy mogę to połączyć z:

$number2 = new WP_Query($normalquery);

$normalquery przechowuje ustawienia takie jak paginacja, na stronę, fragment, tytuł itp. na shortcode portfolio.

Chciałbym, aby zawierało zapytania z mojego nowego $multisitezapytania.

Czy można to osiągnąć? Chcę tylko uratować mnie przed stworzeniem całkiem nowego lol konfiguracji krótkiego kodu

Z góry bardzo dziękuję. Rory

EDYCJA ========

Mam:

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

W dalszej części mojej funkcji portfela „po wszystkich ustawieniach $ [„ opcje ”]” mam:

$portfolio_query = new WP_Query( $portfolio );

$portfolio_querywykorzystuje pętlę na szablonie strony.

Chcę dodać do tego dodatkowe zapytanie:

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

gdzie zakładam, że $globalcontainerbyłaby to tablica do scalenia z wp_query();.

Biorąc więc pod uwagę to, na co odpowiedziałeś, teoretycznie mógłbym po prostu:

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

Czy to byłoby poprawne?

Po drugie, jeśli chodzi o nadpisywanie klucza tablicy array_merge ..... Jak miałbym przerwać nadpisywanie?

Rory Rothon
źródło

Odpowiedzi:

28

Nie zrobisz nic dobrego, łącząc argumenty, musisz scalić wynikową tablicę postów i liczbę post_count. To działa dla mnie:

//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
źródło
Wygląda to dobrze, ale szukam rozwiązania, które można by zastosować z hakiem pre_get_posts - tzn. Muszę zmodyfikować istniejący obiekt WP_Query. Próbowałem użyć „$ wp_query-> init ();” zamiast „$ wp_query = new WP_Query ();”, ale wydaje się, że to wszystko psuje. Jakieś sugestie?
zakaz geoinżynierii
1
Powinieneś dodać inne pytanie, ponieważ jest to inna odpowiedź, ale możesz użyć tego samego kodu, ale tylko części query2, modyfikując -> posty i -> części post_count obiektu $ wp_query, aby uzyskać sumę oryginalnego zapytania, które pre_get_posts daje ci drugie zapytanie, które chcesz dołączyć.
guidod
1
Jak mogę usunąć duplikaty z tej scalonej tablicy?
roshan
Dzięki za to. Wystąpił problematyczny meta_query przy użyciu relacji OR. Podziel go za pomocą tej techniki i przeszedł z 41s do 0,01s.
Craig Harshbarger
@ ban-geoengineering Czy kiedykolwiek to rozgryzłeś? Utknąłem również z tym.
harvey
17

Generalnie łączę ich tablice identyfikacyjne i wykonuję trzecie zapytanie. Aby utrzymać pierwszy zestaw zapytań tanio, zwracam tylko ich identyfikatory, używając parametru pola takiego jak to:

//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));

Mam nadzieję że to pomoże

---EDYTOWAĆ---

Po mojej odpowiedzi edytowane jest oryginalne pytanie dotyczące szczegółów na wielu stronach. W przypadku łączenia postów na wielu stronach nie działa.

Bora Yalcin
źródło
2
Ta odpowiedź działa dobrze i wydaje się mniej hack niż najlepsze rozwiązanie. Użyłem go rok temu i wróciłem, aby użyć go ponownie teraz. Dziękuję Ci.
Davey,
Jak to może działać poprawnie, gdy identyfikatory post_ID nie są unikalne w zakresie obejmującym wiele witryn (są unikalne dla każdego bloga, ale kilka postów może mieć takie same identyfikatory w sieci)?
Adal
1
@Adal Oryginalne pytanie jest edytowane po mojej odpowiedzi, więc moja odpowiedź dotyczy konkretnego zakresu witryny. w przypadku wielu witryn nigdy nie próbowałem łączyć zapytań, w takim przypadku oczywiście to nie zadziała, zapytania muszą być oddzielnie tworzone i łączone. Po scaleniu możesz spróbować zamówić je z funkcjami sortowania php (sortuj według daty publikacji itp.).
Bora Yalcin
3
Możesz zachować sortowanie, używając 'orderby' => 'post__in'w ostatnim zapytaniu.
fregante
2
myślę, że w przypadku niestandardowych typów postów parametr post_type wymaga tego w każdym przypadku, nawet przy pytaniu przez ids, ponieważ domyślnie jest to post_type = post @RobbTe
Bora Yalcin
4

Więc jeśli masz to:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Zakładam, że zdefiniowałeś je gdzieś wcześniej?

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

... w takim przypadku, aby połączyć dwa zapytania, tylko array_merge()dwie tablice przed przekazaniem ich do new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

Pamiętaj, że w array_merge()rozmowie ważna jest kolejność . Jeśli oba mają ten sam klucz tablicy, druga tablica zastąpi pierwszą tablicę.

Chip Bennett
źródło
Bardzo dziękuję za odpowiedź Chipowi. Zredagowałem swoje oryginalne pytanie, aby lepiej zrozumieć, z czym muszę pracować. Wielkie dzięki naprawdę i czekam na kolejną wiedzę wypełnioną odpowiedzią lol Dzięki
Rory Rothon