ऐसा लगता है कि कोडेक्स में आधे ट्यूटोरियल और ब्लॉगस्फीयर उपयोग query_posts()और आधे उपयोग के आसपास हैं WP_Query। क्या बात है?
ऐसा लगता है कि कोडेक्स में आधे ट्यूटोरियल और ब्लॉगस्फीयर उपयोग query_posts()और आधे उपयोग के आसपास हैं WP_Query। क्या बात है?
जवाबों:
query_posts()पृष्ठ के मुख्य क्वेरी को क्वेरी के नए उदाहरण के साथ बदलकर संशोधित करने के लिए अत्यधिक सरलीकृत और एक समस्याग्रस्त तरीका है। यह अक्षम है (एसक्यूएल प्रश्नों को फिर से चलाता है) और कुछ परिस्थितियों में सटीक रूप से विफल हो जाएगा (विशेषकर अक्सर जब पदों से निपटने के साथ)। किसी भी आधुनिक WP कोड को अधिक विश्वसनीय तरीकों का उपयोग करना चाहिए, जैसे कि pre_get_postsइस प्रयोजन के लिए हुक का उपयोग करना। TL, DR कभी भी query_posts () का उपयोग नहीं करते हैं ।
get_posts() उपयोग में समान है और एक ही तर्क (कुछ बारीकियों के साथ, विभिन्न चूक की तरह) को स्वीकार करता है, लेकिन पदों की एक सरणी लौटाता है, वैश्विक चर को संशोधित नहीं करता है और कहीं भी उपयोग करने के लिए सुरक्षित है।
WP_Queryवह वर्ग है जो पर्दे के पीछे दोनों को अधिकार देता है, लेकिन आप इसे अपने स्वयं के उदाहरण के साथ भी बना सकते हैं और काम कर सकते हैं। थोड़ा अधिक जटिल, कम प्रतिबंध, कहीं भी उपयोग करने के लिए सुरक्षित।
query_posts()लिए छोटा रैपर फंक्शन है WP_Query, यह केवल एक अतिरिक्त चीज है (जैसा कि फ्लोचार्ट के अनुसार) ग्लोबल ओवरराइट कर रहा है$wp_query
query_posts()साथ प्रतिस्थापित करने WP_Queryसे प्रदर्शन में कोई फर्क नहीं पड़ेगा, मूल पृष्ठ की क्वेरी अभी भी चलेगी क्योंकि यह कोर लोड का हिस्सा है। यदि आपकी टेम्प्लेट फ़ाइल में कोई लूप नहीं है तो भी वे क्वेरी चलेंगी।
query_posts नहीं करता है , यह पहले से ही चलने के बाद इसे बदल देता है । मुख्य लूप को संशोधित करने का सबसे अच्छा तरीका एक फिल्टर के माध्यम से है । developer.wordpress.com/2012/05/14/…pre_get_posts
query_posts- आपको कभी भी उपयोग नहीं करना चाहिए query_posts। @Rarst ने जो कहा है, इसके अलावा, वास्तव में बड़ा मुद्दा query_postsयह है, यह मुख्य क्वेरी ऑब्जेक्ट (संग्रहीत $wp_query) को तोड़ता है । बहुत सारे प्लगइन्स और कस्टम कोड मुख्य क्वेरी ऑब्जेक्ट पर निर्भर करते हैं, इसलिए मुख्य क्वेरी ऑब्जेक्ट को तोड़ने का मतलब है कि आप प्लगइन्स और कस्टम कोड की कार्यक्षमता को तोड़ रहे हैं। ऐसा ही एक फ़ंक्शन सभी महत्वपूर्ण पेजेशन फ़ंक्शन है, इसलिए यदि आप मुख्य क्वेरी को तोड़ते हैं, तो आप पेजिनेशन को तोड़ते हैं।
query_postsकिसी भी टेम्पलेट पर कितना बुरा है, यह साबित करने के लिए , निम्नलिखित करें और परिणामों की तुलना करें
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_postsऔर माध्यमिक प्रश्नों के WP_Queryनिर्माण का सही तरीका है ( जैसे संबंधित पोस्ट, स्लाइडर्स, चुनिंदा सामग्री और स्थिर फ्रंट पेज पर सामग्री )। यह ध्यान दिया जाना चाहिए, आपको होम पेज, सिंगल पेज या किसी भी प्रकार के आर्काइव पेज पर मुख्य क्वेरी के पक्ष में दोनों में से किसी का उपयोग नहीं करना चाहिए क्योंकि यह पेज की कार्यक्षमता को तोड़ देगा। यदि आपको मुख्य क्वेरी को संशोधित करने की आवश्यकता है, तो ऐसा करने के लिए उपयोग करें, और कस्टम क्वेरी नहीं। ( अद्यतन: स्थिर फ्रंट पेज और सच्चे पृष्ठों के लिए, वास्तविक पृष्ठों और पूर्ववर्ती फ्रंट पेज पर pre_get_posts का उपयोग करना देखें )pre_get_posts
संक्षेप में, WP_Queryमुख्य क्वेरी द्वारा उपयोग किया जाता है और इसका उपयोग भी किया जाता है get_posts, लेकिन हालांकि get_posts()उपयोग करता है WP_Query, कुछ अंतर हैं
get_postsसे तेज हैं WP_Query। मार्जिन साइट के कुल पदों की मात्रा पर निर्भर करता है। इसका कारण यह है कि डिफ़ॉल्ट रूप से get_postsगुजरता है, जो कि स्काइप / कानूनी रूप से पृष्ठांकन को तोड़ देता है। के साथ , पदों की राशि को फिर से प्राप्त किया जाता है, फिर बाहर निकल जाता है, जहां डिफ़ॉल्ट रूप से, यह आगे की खोज करता है कि पेजेशन की गणना करने के लिए क्वेरी से मेल खाते सभी पदों के लिए।'no_found_rows' => trueWP_Query'no_found_rows' => trueWP_Query
इस कारण से, get_posts()केवल गैर-प्रशीतित प्रश्नों के लिए उपयोग किया जाना चाहिए। पेजिंग get_postsवास्तव में एक बड़ी गड़बड़ है। WP_Queryसभी पृष्ठांकित प्रश्नों के लिए उपयोग किया जाना चाहिए
get_posts()इन फ़िल्टर से प्रभावित होने वाले posts_*फ़िल्टर से प्रभावित नहीं होते हैं WP_Query। कारण यह है कि get_posts, डिफ़ॉल्ट रूप से, पास 'suppress_filters' => trueहो जाता हैWP_Query
get_postsजैसे अतिरिक्त पैरामीटर की एक जोड़ी है include, exclude, numberpostsऔर category। ये पैरामीटर पास WP_Queryहोने से पहले वैध मापदंडों में बदल जाते हैं WP_Query। includeमें बदल जाता है post__in, excludeमें post__not_in, categoryमें catऔर numberpostsमें posts_per_page। बस एक नोट, उन सभी मापदंडों के साथ जिन्हें WP_Queryकाम करने के लिए पारित किया जा सकता है get_posts, आप अनदेखा कर सकते हैं और डिफ़ॉल्ट मापदंडों का उपयोग नहीं कर सकते हैंget_posts
get_postsपूरी वस्तु लौटाते समय सिर्फ $postsसंपत्ति लौटाता है। यह ऑब्जेक्ट काफी उपयोगी है जब यह सशर्त, पृष्ठांकन और अन्य उपयोगी जानकारी के लिए आता है जिसे लूप के अंदर इस्तेमाल किया जा सकता है।WP_QueryWP_Query
get_postsलूप का उपयोग नहीं करता है, लेकिन foreachपोस्ट प्रदर्शित करने के लिए एक लूप है। साथ ही, कोई भी टेम्प्लेट डिफ़ॉल्ट रूप से उपलब्ध नहीं हैं। setup_postdata( $post )टेम्प्लेट टैग उपलब्ध कराने के लिए उपयोग किया जाना चाहिए। WP_Queryलूप और टेम्प्लेट टैग का उपयोग डिफ़ॉल्ट रूप से उपलब्ध है
get_postsइस तरह 'ignore_sticky_posts' => 1से WP_Query, get_postsडिफ़ॉल्ट रूप से चिपचिपा पदों की अनदेखी करता है
उपरोक्त के आधार पर, उपयोग करना है get_postsया WP_Queryआप पर निर्भर है और आपको वास्तव में क्वेरी से क्या चाहिए। उपरोक्त आपको अपनी पसंद में मार्गदर्शन करना चाहिए
मूल अंतर यह है कि query_posts()वास्तव में केवल वर्तमान लूप को संशोधित करने के लिए है। एक बार जब आप ऐसा कर लेते हैं, तो लूप को रीसेट करना और उसे अपने तरीके से भेजना आवश्यक होता है। इस विधि को समझना भी थोड़ा आसान है, बस इसलिए कि आपकी "क्वेरी" मूल रूप से एक URL स्ट्रिंग है जिसे आप फ़ंक्शन में पास करते हैं, जैसे:
query_posts('meta_key=color&meta_value=blue');
दूसरी ओर, WP_Queryएक सामान्य उद्देश्य उपकरण के अधिक है, और अधिक से अधिक सीधे MySQL क्वेरी लिखने की तरह query_posts()है। आप इसे कहीं भी (केवल लूप में नहीं) उपयोग कर सकते हैं और यह किसी भी वर्तमान में चल रहे पोस्ट प्रश्नों के साथ हस्तक्षेप नहीं करता है।
मैं WP_Queryअधिक बार उपयोग करना पसंद करता हूं , जैसा कि ऐसा होता है। वास्तव में, यह आपके विशिष्ट मामले में आने वाला है।
बस उपयोग करने की कोई आवश्यकता नहीं है query_posts()। यह सब कुछ एक नया WP_Query वस्तु है और उस नई वस्तु को पुन: असाइन करता है global wp_query।
संदर्भ के लिए, निम्नलिखित वह वास्तविक query_posts()कार्य है।
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
यदि आप गहराई से कस्टम क्वेरी स्क्रिप्ट बनाना चाहते हैं, तो अपनी खुद की WP_Query वस्तु को इंस्टेंट करें। या उपयोग करें get_posts()यदि आप सभी की जरूरत है कुछ प्रकाश हेरफेर यहाँ और वहाँ है।
किसी भी मामले में, मैं अपने आप को एक एहसान करने wp_includes/query.phpऔर WP_Queryकक्षा में जाने और मना करने की सलाह देता हूं ।
सुनिश्चित करें कि आप उपयोग करने के wp_reset_query()बाद उपयोग करते हैं query_posts()क्योंकि यह अन्य क्वेरी परिणाम को भी प्रभावित करेगा।