2 yeni WP_Query ($ değişken) 'i birleştirebilir miyim?


15

Çok siteli bir ağ çalıştırıyorum ve swith_to_blog () kullanan bir sql sorgusu kurulum var; ve gönderileri sorgular.

Sorgu yeni bir WP_Query içinde bildirmek ve aslında başka bir sorgu ile birleştirmek bir yolu var mı?

Temelde ben bunu yaparsanız:

$number1 = new WP_Query($multisitequery);

Şununla birleştirebilir miyim:

$number2 = new WP_Query($normalquery);

$normalquery sayfalama, sayfa başına, alıntı, başlık vb. ayarları portföy kısa kodunda tutar.

Yeni sorgumdan sorgulanan yayınları içermesini istiyorum $multisite.

Bu başarılabilir mi? Sadece yepyeni bir kısa kod kurulum lol oluşturmaktan kurtarmak isteyen

Şimdiden çok teşekkürler. Rory

DÜZENLEME ========

Ne var:

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

Daha sonra benim portföy fonksiyonu "sonuçta $ ayarları ['seçenekleri']" sonra ben var:

$portfolio_query = new WP_Query( $portfolio );

$portfolio_querySayfa şablonunda bir döngü kullanır.

Bunun gibi ekstra bir sorgu eklemek istiyorum:

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

i $globalcontaineriçine birleştirmek için dizi olacağını varsayalım wp_query();.

Yani cevapladığın gemide alarak, teorik olarak ben sadece:

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

Bu doğru olur mu?

İkincisi, array_merge dizi anahtarının üzerine yazma ..... Üzerine yazma işlemini nasıl durdurabilirim?

Yanıtlar:


28

Sadece argümanları birleştirmek için çok iyi bir şey yapmazsınız, sonuçta ortaya çıkan mesajlar dizisini ve post_count sayısını birleştirmeniz gerekir. Bu benim için çalışıyor:

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

Bu iyi görünüyor, ama pre_get_posts kanca ile kullanılabilecek bir çözüm arıyorum - yani, mevcut bir WP_Query nesnesini değiştirmek gerekiyor. '$ Wp_query-> init ();' '$ wp_query = new WP_Query ();' yerine, ama bu işleri karıştırıyor gibi görünüyor. Herhangi bir öneri?
ban-geoengineering

1
Farklı bir yanıt olduğu için farklı bir soru eklemelisiniz, ancak bu aynı kodu kullanabilirsiniz, ancak yalnızca sorgu2 bölümlerini kullanabilirsiniz; bu, $ wp_query nesnesinin -> gönderileri ve -> post_count bölümlerini pre_get_posts olan orijinal sorgunun toplamına sahip olacak şekilde değiştirir. size ve eklemek istediğiniz ikinci sorguyu verir.
guidod

1
Bu birleştirilmiş diziden yinelenenleri nasıl kaldırabilirim?
roshan

Bunun için teşekkürler. OR ilişkisi kullanarak sorunlu bir meta_query vardı. Bu tekniği kullanarak bölün ve 41s ile 0.01s arasında gitti.
Craig Harshbarger

@ ban-geoengineering Bunu hiç anladınız mı? Ben de buna takıldım.
harvey

17

Genellikle kimlik dizilerini birleştirir ve üçüncü bir sorgu yaparım. İlk sorgu kümesini ucuz tutmak için sadece kendi ID alanlarını kullanarak aşağıdaki gibi parametre kullanın:

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

Bu yardımcı olur umarım

---DÜZENLE---

Cevabımdan sonra çoklu soru için orijinal soru düzenlenir. Çok bölgeli yazı birleştirme durumunda bu çalışmaz.


2
Bu cevap iyi çalışıyor ve en iyi çözümden daha az bir hack gibi geliyor. Bir yıl kadar önce kullandım ve şimdi tekrar kullanmak için geri döndüm. Teşekkür ederim.
Davey

Post_ID'ler çok siteli kapsamda benzersiz olmadığında (blog başına benzersiz ancak birkaç yayın ağda aynı kimliğe sahip olabilir) bu nasıl düzgün çalışır?
Adal

1
@Adal Orijinal soru cevabımdan sonra düzenlenir, böylece cevabım tek site kapsamıyla ilgilidir. multisite ile asla sorguları birleştirmeye çalışmadım ve bu durumda bu işe yaramaz, sorguların ayrı ayrı yapılması ve birleştirilmesi gerekir. Birleştirme sonra belki php sıralama işlevleri ile onları sipariş deneyebilirsiniz (yayınlanma tarihi için sıralama vb.).
Bora Yalçın

3
'orderby' => 'post__in'Son sorguda kullanarak sıralamayı koruyabilirsiniz .
fregante

2
özel yazı türleri için, bence, post_type param her durumda, ids tarafından sorulsa bile buna ihtiyaç duyar çünkü post_type = post varsayılan olarak @RobbTe
Bora Yalcin

4

Yani, eğer varsa:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Bunları daha önce bir yerde tanımladığınızı varsayıyorum?

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

... bu durumda, iki sorguyu birleştirmek için, yalnızca array_merge()iki diziyi geçmeden önce new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

array_merge()Çağrıda siparişin önemli olduğunu unutmayın . Her ikisi de aynı dizi anahtarına sahipse, ikinci dizi ilk dizinin üzerine yazılır.


Chip'i cevapladığınız için teşekkür ederiz, çok takdir ediyorum. Orijinal sorumu, neyle çalışmam gerektiğine dair daha iyi bir fikir vermek için düzenledim. Çok teşekkürler ve ben başka bir bilgi dolu cevap lol için sabırsızlanıyoruz Teşekkürler
Rory Rothon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.