Bisakah saya menggabungkan 2 WP_Query ($ variabel) baru?

15

Saya menjalankan jaringan multisite dan saya telah menyiapkan kueri sql yang menggunakan swith_to_blog (); dan menanyakan posting.

Apakah ada cara saya dapat mendeklarasikan kueri di dalam WP_Query baru dan benar-benar menggabungkan kueri itu dengan yang lain?

Pada dasarnya jika saya melakukan ini:

$number1 = new WP_Query($multisitequery);

Bisakah saya menggabungkannya dengan:

$number2 = new WP_Query($normalquery);

$normalquery menyimpan pengaturan seperti pagination, per halaman, kutipan, judul dll ... pada kode pendek portofolio.

Saya ingin menyertakan posting $multisitepertanyaan dari permintaan baru saya .

Bisakah ini tercapai? Hanya ingin menyelamatkan saya dari membuat lol setup kode pendek yang sama sekali baru

Banyak terima kasih sebelumnya. Rory

Sunting ========

Apa yang saya miliki adalah:

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

Lebih jauh ke bawah fungsi portofolio saya "setelah semua $ pengaturan ['opsi']" saya punya:

$portfolio_query = new WP_Query( $portfolio );

yang $portfolio_querymenggunakan loop pada halaman template.

Saya ingin menambahkan kueri tambahan ke dalam seperti ini:

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

di mana saya menganggap itu $globalcontainerakan menjadi array untuk bergabung ke dalam wp_query();.

Jadi, dengan mengikuti jawaban Anda, secara teori saya bisa dengan mudah:

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

Apakah itu benar?

Kedua, mengenai kunci array array_merge menimpa ..... Bagaimana saya tentang menghentikan overwrite?

Rory Rothon
sumber

Jawaban:

28

Anda tidak akan melakukan banyak hal baik hanya dengan menggabungkan argumen, Anda perlu menggabungkan array posting yang dihasilkan dan jumlah post_count. Ini bekerja untuk saya:

//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
sumber
Ini terlihat bagus, tetapi saya mencari solusi yang dapat digunakan dengan kait pre_get_posts - yaitu, saya perlu memodifikasi objek WP_Query yang ada. Saya telah mencoba menggunakan '$ wp_query-> init ();' bukannya '$ wp_query = new WP_Query ();', tapi itu sepertinya mengacaukan segalanya. Ada saran?
larangan geoengineering
1
Anda harus menambahkan pertanyaan yang berbeda karena ini adalah jawaban yang berbeda, tetapi Anda dapat menggunakan kode yang sama tetapi hanya bagian query2, memodifikasi -> posting dan -> post_count bagian dari objek $ wp_query untuk memiliki jumlah dari kueri asli yang pre_get_posts memberi Anda dan permintaan kedua yang ingin Anda tambahkan.
guidod
1
Bagaimana saya bisa menghapus duplikat dari array yang digabungkan ini?
roshan
Terima kasih untuk ini. Memiliki meta_query yang bermasalah menggunakan relasi OR. Membaginya menggunakan teknik ini dan beralih dari 41 ke 0,01.
Craig Harshbarger
@ larangan-geoengineering Apakah Anda pernah menemukan ini? Saya terjebak dengan ini juga.
Harvey
17

Saya biasanya menggabungkan array ID mereka dan membuat kueri ketiga. Untuk menjaga agar set pertama kueri tetap murah, saya hanya mengembalikan ID mereka menggunakan parameter bidang seperti ini:

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

Semoga ini membantu

--- EDIT ---

Setelah jawaban saya pertanyaan asli diedit untuk detail multisite. Dalam kasus penggabungan pos multisite, ini tidak berfungsi.

Bora Yalcin
sumber
2
Jawaban ini bekerja dengan baik dan terasa seperti sedikit hack daripada solusi teratas. Menggunakannya sekitar setahun yang lalu dan kembali menggunakannya lagi sekarang. Terima kasih.
Davey
Bagaimana ini bisa berfungsi dengan baik ketika post_ID tidak unik pada lingkup multisite (mereka unik per blog tetapi beberapa posting dapat memiliki ID yang sama di seluruh jaringan)?
Adal
1
@Adal Pertanyaan asli diedit setelah jawaban saya sehingga jawaban saya relevan untuk cakupan situs tunggal. dengan multisite, saya tidak pernah mencoba untuk menggabungkan permintaan dan dalam kasus itu tentu saja ini tidak akan berhasil, permintaan harus dibuat dan digabung secara terpisah. Setelah penggabungan, Anda dapat mencoba memesannya dengan fungsi penyortiran php mungkin (mengurutkan untuk tanggal publikasi, dll).
Bora Yalcin
3
Anda bisa mempertahankan penyortiran dengan menggunakan 'orderby' => 'post__in'di kueri terakhir.
fregante
2
untuk jenis posting kustom, saya pikir, post_type param memerlukan hal itu, bahkan dengan meminta id karena post_type = posting secara default @RobbTe
Bora Yalcin
4

Jadi, jika Anda memiliki ini:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Saya menganggap Anda mendefinisikan ini di suatu tempat sebelumnya?

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

... dalam hal ini, untuk menggabungkan dua permintaan, hanya array_merge()dua array sebelum meneruskannya ke new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

Perhatikan bahwa urutan penting dalam array_merge()panggilan. Jika keduanya memiliki kunci array yang sama, array kedua akan menimpa array pertama.

Chip Bennett
sumber
Terima kasih telah membalas Chip, sangat dihargai. Saya telah mengedit pertanyaan awal saya untuk memberi Anda ide yang lebih baik tentang apa yang harus saya kerjakan. Terima kasih banyak dan saya menantikan balasan lain yang penuh pengetahuan. Terima kasih
Rory Rothon,