आप जो चाहते हैं वह संभव है लेकिन आपको एसक्यूएल में तल्लीन करने की आवश्यकता होगी जिसे मैं जब भी संभव हो बचना पसंद करता हूं (क्योंकि मुझे पता नहीं है, मैं एक अग्रिम एसक्यूएल डेवलपर हूं, लेकिन क्योंकि वर्डप्रेस में आप जब भी संभव हो एपीआई का उपयोग करना चाहते हैं भविष्य की संभावित डेटाबेस संरचना परिवर्तनों से संबंधित भविष्य की संगतता समस्याओं को कम करने के लिए।)
UNION
संचालक के साथ SQL एक संभावना है
एसक्यूएल का उपयोग करने के लिए आपको UNION
अपनी क्वेरी में एक ऑपरेटर की आवश्यकता होती है , ऐसा कुछ आपकी श्रेणी के स्लग हैं "category-1"
, "category-1"
और "category-3"
:
SELECT * FROM wp_posts WHERE ID IN (
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-1'
LIMIT 5
UNION
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-2'
LIMIT 5
UNION
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-3'
LIMIT 5
)
आप posts_join
फ़िल्टर के साथ SQL UNION का उपयोग कर सकते हैं
उपरोक्त का उपयोग करके आप या तो सीधे कॉल कर सकते हैंposts_join
या आप निम्नानुसार एक फिल्टर हुक का उपयोग कर सकते हैं ; ध्यान दें कि मैं PHP heredoc का उपयोग कर रहा हूँ, इसलिए सुनिश्चित करें SQL;
कि फ्लश बचे हुए हैं। यह भी ध्यान दें कि मैंने एक सरणी में श्रेणी के स्लग को सूचीबद्ध करके आपको हुक के बाहर की श्रेणियों को परिभाषित करने की अनुमति देने के लिए एक वैश्विक संस्करण का उपयोग किया। आप इस कोड को एक प्लगइन या अपनी थीम की functions.php
फ़ाइल में रख सकते हैं :
<?php
global $top_5_for_each_category_join;
$top_5_for_each_category_join = array('category-1','category-2','category-3');
add_filter('posts_join','top_5_for_each_category_join',10,2);
function top_5_for_each_category_join($join,$query) {
global $top_5_for_each_category_join;
$unioned_selects = array();
foreach($top_5_for_each_category_join as $category) {
$unioned_selects[] =<<<SQL
SELECT object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='{$category}'
LIMIT 5
SQL;
}
$unioned_selects = implode("\n\nUNION\n\n",$unioned_selects);
return $join . " INNER JOIN ($unioned_selects) categories ON wp_posts.ID=categories.object_id " ;
}
लेकिन इसके साइड-इफेक्ट्स हो सकते हैं
निश्चित रूप से क्वेरी संशोधन हुक का उपयोग करना जैसे posts_join
हमेशा साइड-इफेक्ट्स को आमंत्रित करता है, जिसमें वे प्रश्नों पर विश्व स्तर पर कार्य करते हैं और इस प्रकार आपको आमतौर पर अपने संशोधनों को लपेटने की आवश्यकता होती है, if
जिसमें केवल इसका उपयोग किया जाता है जब जरूरत होती है और परीक्षण के लिए कौन से मापदंड मुश्किल हो सकते हैं।
इसके बजाय अनुकूलन पर ध्यान दें?
हालाँकि, मुझे लगता है कि आपका सवाल चिंतित है अनुकूलन के बारे में अधिक से अधिक एक शीर्ष 5 समय 3 क्वेरी करने में सक्षम होने के बारे में है, है ना? अगर ऐसा है तो शायद दूसरे विकल्प हैं जो वर्डप्रेस एपीआई का उपयोग करते हैं?
कैशिंग के लिए ट्रांजिस्टर एपीआई का उपयोग करना बेहतर है?
मुझे लगता है कि आपकी पोस्ट अक्सर, सही नहीं बदलेगी? क्या होगा यदि आप समय-समय पर तीन (3) क्वेरी को स्वीकार करते हैं और फिर ट्रांज़िशन एपीआई का उपयोग करके परिणामों को कैश करते हैं ? आपको बनाए रखने योग्य कोड और शानदार प्रदर्शन मिलेगा; UNION
ऊपर क्वेरी से बेहतर एक अच्छा है क्योंकि वर्डप्रेस wp_options
तालिका के एक रिकॉर्ड में क्रमबद्ध सरणी के रूप में पदों की सूचियों को संग्रहीत करेगा ।
आप निम्न उदाहरण ले सकते हैं और test.php
इसे जांचने के लिए अपनी वेब साइट की जड़ में छोड़ सकते हैं :
<?php
$timeout = 4; // 4 hours
$categories = array('category-1','category-2','category-3');
include "wp-load.php";
$category_posts = get_transient('top5_posts_per_category');
if (!is_array($category_posts) || count($category_posts)==0) {
echo "Hello Every {$timeout} hours!";
$category_posts = array();
foreach($categories as $category) {
$posts = get_posts("post_type=post&numberposts=5&taxonomy=category&term={$category}");
foreach($posts as $post) {
$category_posts[$post->ID] = $post;
}
}
set_transient('top5_posts_per_category',$category_posts,60*60*$timeout);
}
header('Content-Type:text/plain');
print_r($category_posts);
सारांश
हाँ, जबकि आप SQL UNION
क्वेरी और posts_join
फ़िल्टर हुक का उपयोग करने के लिए आपसे पूछ सकते हैं कि आप शायद ट्रांसजेंडर एपीआई के बजाय कैशिंग का उपयोग कर बेहतर पेशकश कर रहे हैं ।
उम्मीद है की यह मदद करेगा?