ฉันสามารถรวม WP_Query ($ ตัวแปร) ใหม่ 2 รายการได้หรือไม่


15

ฉันใช้งานเครือข่ายหลายไซต์และฉันได้ตั้งค่าการสืบค้น sql ที่ใช้ swith_to_blog (); และสอบถามการโพสต์

มีวิธีที่ฉันสามารถประกาศแบบสอบถามภายใน WP_Query ใหม่และรวมแบบสอบถามจริงเข้าด้วยกันหรือไม่

โดยทั่วไปถ้าฉันทำสิ่งนี้:

$number1 = new WP_Query($multisitequery);

ฉันสามารถรวมเข้ากับ:

$number2 = new WP_Query($normalquery);

$normalquery เก็บการตั้งค่าเช่นการแบ่งหน้าต่อส่วนที่ตัดตอนมาชื่อ ฯลฯ ... ในรหัสย่อผลงาน

ฉันต้องการให้รวมโพสต์ที่สอบถามจาก$multisiteแบบสอบถามใหม่ของฉัน

สามารถทำได้หรือไม่ เพียงแค่ต้องการช่วยฉันจากการสร้างการตั้งค่ารหัสย่อใหม่ทั้งหมดฮ่า ๆ

ขอบคุณมากล่วงหน้า Rory

แก้ไข ========

สิ่งที่ฉันมีคือ:

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

เพิ่มเติมฟังก์ชันพอร์ตโฟลิโอของฉัน "หลังจากการตั้งค่า $ ทั้งหมด ['options']" ฉันมี:

$portfolio_query = new WP_Query( $portfolio );

$portfolio_queryใช้ห่วงแม่แบบหน้า

ฉันต้องการเพิ่มแบบสอบถามพิเศษลงในนี้เช่น:

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

ที่ฉันคิดว่าจะเป็นอาเรย์ที่จะผสานเข้าไปใน$globalcontainerwp_query();

ดังนั้นในสิ่งที่คุณได้ตอบกลับด้วยทฤษฎีฉันสามารถทำได้โดยง่าย:

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

จะถูกต้องไหม

ข้อสองเกี่ยวกับ array_merge array key overwrite ..... ฉันจะหยุดเขียนทับได้อย่างไร

คำตอบ:


28

คุณจะทำได้ไม่ดีนักเพียงแค่การรวมอาร์กิวเมนต์เข้าด้วยกันคุณจะต้องรวมอาร์เรย์โพสต์ที่เกิดขึ้นกับจำนวน post_count สิ่งนี้ใช้ได้กับฉัน:

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

สิ่งนี้ดูดี แต่ฉันกำลังมองหาโซลูชันที่สามารถใช้กับตะขอ pre_get_posts ได้ - นั่นคือฉันต้องแก้ไขวัตถุ WP_Query ที่มีอยู่ ฉันได้ลองใช้ '$ wp_query-> init ();' แทนที่จะเป็น '$ wp_query = new WP_Query ();' แต่ดูเหมือนว่าจะเกิดความสับสน ข้อเสนอแนะใด ๆ
บ้านจีโอเอ็นจิเนียริ่ง

1
คุณควรเพิ่มคำถามอื่นเนื่องจากเป็นคำตอบที่แตกต่างกัน แต่คุณสามารถใช้รหัสเดียวกันนี้ได้ แต่เฉพาะส่วนแบบสอบถาม 2 ปรับเปลี่ยนส่วน -> โพสต์และ -> ส่วนหลัง __count ของวัตถุ $ wp_query เพื่อให้ได้ผลรวมของแบบสอบถามต้นฉบับที่ pre_get_posts ช่วยให้คุณและแบบสอบถามที่สองที่คุณต้องการผนวก
guidod

1
ฉันจะลบรายการที่ซ้ำออกจากอาเรย์ที่ผสานนี้ได้อย่างไร
roshan

ขอบคุณสำหรับสิ่งนี้. มี meta_query ที่มีปัญหาโดยใช้ OR ความสัมพันธ์ แยกมันออกโดยใช้เทคนิคนี้และเปลี่ยนจาก 41 เป็น 0.01s
Craig Harshbarger

@ ban-geoengineering คุณเคยคิดเรื่องนี้ไหม? ฉันติดอยู่กับเรื่องนี้เช่นกัน
ฮาร์วีย์

17

ฉันมักจะรวมอาร์เรย์ ID ของพวกเขาและสร้างแบบสอบถามที่สาม หากต้องการให้ชุดข้อความค้นหาชุดแรกราคาถูกฉันจะส่งคืน ID ของพวกเขาโดยใช้พารามิเตอร์ฟิลด์เช่นนี้

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

หวังว่านี่จะช่วยได้

--- แก้ไข ---

หลังจากตอบคำถามดั้งเดิมของฉันจะแก้ไขรายละเอียด multisite ในกรณีที่โพสต์หลายไซต์รวมกันสิ่งนี้จะไม่ทำงาน


2
คำตอบนี้ใช้ได้ดีและรู้สึกว่าแฮ็คน้อยกว่าโซลูชันอันดับต้น ๆ ใช้มันประมาณหนึ่งปีก่อนแล้วจึงกลับมาใช้อีกครั้งในตอนนี้ ขอบคุณ.
ดาวี่

วิธีนี้สามารถทำงานได้อย่างถูกต้องเมื่อโพสต์ของ id ไม่ซ้ำกันในขอบเขตหลายไซต์ (ไม่ซ้ำกันสำหรับแต่ละบล็อก แต่โพสต์หลายรายการสามารถมี ID เดียวกันทั่วทั้งเครือข่าย)
Adal

1
@ คำถามดั้งเดิมถูกแก้ไขหลังจากคำตอบของฉันดังนั้นคำตอบของฉันเกี่ยวข้องกับขอบเขตของไซต์เดียว ด้วย multisite ฉันไม่เคยพยายามรวมข้อความค้นหาและในกรณีนี้แน่นอนว่าวิธีนี้ใช้ไม่ได้ผลต้องมีการรวมและทำแบบสอบถามแยกต่างหาก หลังจากผสานคุณสามารถลองสั่งด้วยฟังก์ชันการเรียงลำดับ php (เรียงลำดับสำหรับวันที่เผยแพร่เป็นต้น)
Bora Yalcin

3
คุณสามารถรักษาการเรียงลำดับโดยใช้'orderby' => 'post__in'ในแบบสอบถามล่าสุด
fregante

2
สำหรับประเภทโพสต์ที่กำหนดเองฉันคิดว่า post_type param จำเป็นต้องใช้ในกรณีใด ๆ แม้จะมีการถามโดย ids เพราะมันเป็น post_type = โพสต์โดยค่าเริ่มต้น @RobbTe
Bora Yalcin

4

ดังนั้นถ้าคุณมีสิ่งนี้:

$number1 = new WP_Query($multisitequery);

$number2 = new WP_Query($normalquery);

ฉันคิดว่าคุณนิยามสิ่งเหล่านี้ก่อนหน้านี้ไหม?

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

... ซึ่งในกรณีนี้หากต้องการรวมสองเคียวรี่เพียงarray_merge()สองอาร์เรย์ก่อนที่จะส่งต่อไปยังnew WP_Query():

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

$merged_query = new WP_Query( $merged_query_args );

โปรดทราบว่าคำสั่งซื้อมีความสำคัญในการarray_merge()โทร หากทั้งคู่มีคีย์อาร์เรย์เหมือนกันอาร์เรย์ที่สองจะเขียนทับอาร์เรย์แรก


ขอบคุณสำหรับการตอบกลับชิปชื่นชมมาก ฉันได้แก้ไขคำถามเดิมของฉันเพื่อให้คุณมีความคิดที่ดีขึ้นเกี่ยวกับสิ่งที่ฉันต้องทำงานด้วย ขอบคุณมากและฉันหวังว่าจะได้ความรู้อื่นตอบกลับมาแล้วขอบคุณ
Rory Rothon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.