Tôi có thể hợp nhất 2 WP_Query ($ biến) mới không?


15

Tôi đang chạy một mạng nhiều trang và tôi đã thiết lập một truy vấn sql sử dụng swith_to_blog (); và truy vấn các bài viết.

Có cách nào để tôi có thể khai báo truy vấn bên trong WP_Query mới và thực sự hợp nhất truy vấn đó với một truy vấn khác không?

Về cơ bản nếu tôi làm điều này:

$number1 = new WP_Query($multisitequery);

Tôi có thể hợp nhất nó với:

$number2 = new WP_Query($normalquery);

$normalquery giữ các cài đặt như phân trang, mỗi trang, đoạn trích, tiêu đề, v.v ... trên một shortcode danh mục đầu tư.

Tôi muốn nó bao gồm các bài viết được truy vấn từ $multisitetruy vấn mới của tôi .

Điều này có thể đạt được? Chỉ muốn cứu tôi khỏi việc tạo một thiết lập shortcode hoàn toàn mới lol

Rất cám ơn trước. Rory

CHỈNH SỬA ========

Những gì tôi có là:

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

Tiếp tục xuống chức năng danh mục đầu tư của tôi "sau tất cả các cài đặt $ ['tùy chọn']" tôi có:

$portfolio_query = new WP_Query( $portfolio );

việc $portfolio_querysử dụng một vòng lặp trên một mẫu trang.

Tôi muốn thêm một truy vấn vào đây như vậy:

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

trong đó tôi giả sử đó $globalcontainersẽ là mảng để hợp nhất vào wp_query();.

Vì vậy, trên tàu những gì bạn đã trả lời, theo lý thuyết tôi có thể chỉ đơn giản là:

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

Điều đó có đúng không?

Thứ hai, liên quan đến việc ghi đè khóa mảng Array_merge ..... Làm thế nào tôi có thể dừng việc ghi đè?

Câu trả lời:


28

Bạn sẽ không làm được gì nhiều khi chỉ hợp nhất các đối số, bạn cần hợp nhất mảng bài viết kết quả và số lượng post_count. Điều này làm việc cho tôi:

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

Điều này có vẻ tốt, nhưng tôi đang tìm kiếm một giải pháp có thể được sử dụng với hook pre_get_posts - tức là tôi cần sửa đổi một đối tượng WP_Query hiện có. Tôi đã thử sử dụng '$ wp_query-> init ();' thay vì '$ wp_query = new WP_Query ();', nhưng điều đó dường như làm mọi thứ rối tung lên. Bất kỳ đề xuất?
ban-geengineering

1
Bạn nên thêm một câu hỏi khác vì đó là một câu trả lời khác nhau, nhưng bạn có thể sử dụng cùng mã này nhưng chỉ có các phần query2, sửa đổi các phần -> bài đăng và -> post_count của đối tượng $ wp_query để có tổng truy vấn ban đầu mà pre_get_posts cung cấp cho bạn và truy vấn thứ hai bạn muốn nối thêm.
hướng dẫn

1
Làm thế nào tôi có thể loại bỏ trùng lặp từ mảng hợp nhất này?
roshan

Cảm ơn vì điều đó. Có một meta_query có vấn đề khi sử dụng mối quan hệ OR. Tách nó bằng cách sử dụng kỹ thuật này và đi từ 41 đến 0,01.
Craig Harshbarger

@ ban-Geoengineering Bạn đã bao giờ tìm ra điều này chưa? Tôi cũng bị mắc kẹt với điều này.
harvey

17

Tôi thường hợp nhất các mảng ID của họ và thực hiện truy vấn thứ ba. Để giữ cho bộ truy vấn đầu tiên rẻ, tôi chỉ trả về ID của họ bằng cách sử dụng tham số trường như thế này:

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

Hi vọng điêu nay co ich

---BIÊN TẬP---

Sau khi câu trả lời của tôi câu hỏi ban đầu được chỉnh sửa cho nhiều chi tiết. Trong trường hợp đa bài đăng sáp nhập, điều này không hoạt động.


2
Câu trả lời này hoạt động tốt và cảm thấy ít bị hack hơn giải pháp hàng đầu. Đã sử dụng nó một năm trước và quay lại sử dụng nó một lần nữa. Cảm ơn bạn.
Davey

Làm thế nào điều này có thể hoạt động chính xác khi post_ID không phải là duy nhất trên phạm vi nhiều trang (chúng là duy nhất trên mỗi blog nhưng một số bài đăng có thể có cùng một ID trên mạng)?
Adal

1
@Adal Câu hỏi ban đầu được chỉnh sửa sau câu trả lời của tôi để câu trả lời của tôi có liên quan đến phạm vi trang web duy nhất. với multisite tôi không bao giờ cố gắng hợp nhất các truy vấn và trong trường hợp đó tất nhiên điều này sẽ không hoạt động, các truy vấn cần phải được thực hiện và hợp nhất riêng biệt. Sau khi hợp nhất, bạn có thể thử đặt hàng chúng với các chức năng sắp xếp php có thể (sắp xếp cho ngày xuất bản, v.v.).
Bora Yalcin

3
Bạn có thể duy trì việc sắp xếp bằng cách sử dụng 'orderby' => 'post__in'trong truy vấn cuối cùng.
fregante

2
đối với các loại bài đăng tùy chỉnh, tôi nghĩ, post_type param cần điều đó trong mọi trường hợp, ngay cả khi hỏi id bởi vì đó là post_type = bài đăng theo mặc định @RobbTe
Bora Yalcin

4

Vì vậy, nếu bạn có điều này:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

Tôi giả sử bạn xác định những nơi này trước đây?

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

... trong trường hợp này, để hợp nhất hai truy vấn, chỉ array_merge()hai mảng trước khi chuyển chúng đến new WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

Lưu ý rằng thứ tự là quan trọng trong array_merge()cuộc gọi. Nếu cả hai có cùng một mảng mảng, mảng thứ hai sẽ ghi đè lên mảng đầu tiên.


Cảm ơn bạn đã trả lời Chip, đánh giá cao. Tôi đã chỉnh sửa câu hỏi ban đầu của mình để cho bạn biết rõ hơn về những gì tôi phải làm việc với. Thực sự cảm ơn rất nhiều và tôi mong chờ một kiến ​​thức khác được đóng gói trả lời lol Cảm ơn
Rory Rothon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.