क्या मैं 2 नए WP_Query ($ चर) विलय कर सकता हूं?


15

मैं एक मल्टीसाइट नेटवर्क चला रहा हूं और मेरे पास एक sql क्वेरी है जो swith_to_blog () का उपयोग करता है; और पदों पर सवाल करता है।

क्या कोई ऐसा तरीका है जिससे मैं एक नए WP_Query के अंदर क्वेरी की घोषणा कर सकता हूं और वास्तव में उस क्वेरी को दूसरे के साथ विलय कर सकता हूं?

मूल रूप से अगर मैं ऐसा करता हूं:

$number1 = new WP_Query($multisitequery);

क्या मैं इसे मर्ज कर सकता हूं:

$number2 = new WP_Query($normalquery);

$normalquery पोर्टफोलियो शॉर्टकोड पर पेजेशन, प्रति पृष्ठ, अंश, शीर्षक आदि ... जैसी सेटिंग्स रखता है।

मैं चाहूंगा कि मेरी नई $multisiteक्वेरी से क्वेरिड पोस्ट शामिल करें ।

क्या इसे हासिल किया जा सकता है? बस मुझे एक नया शॉर्टकोड सेटअप लोल बनाने से बचाना है

अग्रिम में बहुत धन्यवाद। रोरी

संपादित करें ========

मेरे पास क्या है:

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

आगे मेरे पोर्टफोलियो फंक्शन "सभी $ सेटिंग्स के बाद ['विकल्प']" मेरे पास है:

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

जहां मुझे लगता है कि $globalcontainerमें विलय करने के लिए सरणी होगा wp_query();

तो जहाज पर ले कर जो आपने उत्तर दिया है, सिद्धांत रूप में मैं बस:

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

क्या यह सही होगा?

दूसरा, array_merge सरणी कुंजी ओवरराइट के बारे में ..... मैं ओवरराइट को रोकने के बारे में कैसे जाऊंगा?

जवाबों:


28

आप सिर्फ तर्कों को मर्ज करने में बहुत अच्छा नहीं करेंगे, आपको परिणामी पदों सरणी और पोस्ट_काउंट काउंट को मर्ज करने की आवश्यकता है। यह मेरे लिए काम करता है:

//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 भागों में, -> पोस्ट और -> post_count $ wp_query ऑब्जेक्ट के कुछ हिस्सों को संशोधित करने के लिए मूल का योग है जो pre_get_posts है आपको और दूसरी क्वेरी जो आप जोड़ना चाहते हैं, देता है।
गत

1
मैं इस मर्ज किए गए सरणी से डुप्लिकेट कैसे निकाल सकता हूं?
रोशन 8

इसके लिए धन्यवाद। एक या संबंध का उपयोग करते हुए एक समस्यात्मक मेटा_क्वरी थी। इस तकनीक का उपयोग करके इसे विभाजित करें और 41s से 0.01s तक चला गया।
क्रेग हर्षबर्गर

@ प्रतिबंध-जियोइंजीनियरिंग क्या आपने कभी इसका पता लगाया है? मैं इसके साथ ही फंस गया हूं।
हार्वे

17

मैं आम तौर पर उनकी आईडी सरणियों का विलय करता हूं और एक तीसरा प्रश्न बनाता हूं। सस्ते प्रश्नों का पहला सेट रखने के लिए मैं केवल उनकी आईडी का उपयोग इस तरह से फ़ील्ड पैरामीटर वापस करता हूं:

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

उम्मीद है की यह मदद करेगा

--- संपादित करें ---

मेरे उत्तर के बाद मूल प्रश्न को मल्टीसाइट विवरण के लिए संपादित किया जाता है। मल्टीसाइट पोस्ट के मर्ज के मामले में यह काम नहीं करता है।


2
यह उत्तर अच्छी तरह से काम करता है और शीर्ष समाधान की तुलना में हैक की तरह महसूस करता है। एक या एक साल पहले इसका इस्तेमाल किया था और अब इसे फिर से उपयोग करने के लिए वापस आ गया। धन्यवाद।
डेवी

यह कैसे ठीक से काम कर सकता है जब पोस्ट_आईडी मल्टीसिट स्कोप पर अद्वितीय नहीं हैं (वे प्रति ब्लॉग अद्वितीय हैं लेकिन कई पोस्ट में एक ही आईडी के पूरे नेटवर्क में हो सकते हैं)?
अदल

1
@ मूल प्रश्न मेरे उत्तर के बाद संपादित किया जाता है, इसलिए मेरा उत्तर एकल साइट दायरे के लिए प्रासंगिक है। मल्टीसाइट के साथ मैंने कभी भी प्रश्नों को मर्ज करने की कोशिश नहीं की और निश्चित रूप से यह काम नहीं करेगा, प्रश्नों को अलग से बनाया और विलय करने की आवश्यकता है। मर्ज के बाद आप उन्हें php सॉर्टिंग फ़ंक्शन के साथ ऑर्डर करने की कोशिश कर सकते हैं हो सकता है (प्रकाशित तिथि आदि के लिए सॉर्ट करें)।
बोरा यालसिन

3
आप 'orderby' => 'post__in'अंतिम क्वेरी में उपयोग करके सॉर्टिंग को संरक्षित कर सकते हैं ।
fregante

2
कस्टम पोस्ट प्रकारों के लिए, मुझे लगता है, पोस्ट_टाइप परम की जरूरत है कि किसी भी मामले में, आईडी से पूछकर भी क्योंकि यह पोस्ट_टाइप = पोस्ट डिफ़ॉल्ट रूप से है @RobbTe
बोरा

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()कॉल में आदेश महत्वपूर्ण है । यदि दोनों के पास एक ही सरणी कुंजी है, तो दूसरी सरणी पहली सरणी को ओवरराइट कर देगी।


चिप जवाब देने के लिए धन्यवाद, बहुत सराहना की। मैंने आपको जो काम करना है, उसका बेहतर विचार देने के लिए अपने मूल प्रश्न को संपादित किया है। बहुत धन्यवाद वास्तव में और मैं एक और ज्ञान पैक उत्तर योग्य के लिए तत्पर हूं धन्यवाद
रोरी रोथोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.