आपको WP_Query बनाम क्वेरी_पोस्ट () बनाम get_posts () का उपयोग कब करना चाहिए?


418

ऐसा लगता है कि कोडेक्स में आधे ट्यूटोरियल और ब्लॉगस्फीयर उपयोग query_posts()और आधे उपयोग के आसपास हैं WP_Query। क्या बात है?


जवाबों:


667
  • query_posts()पृष्ठ के मुख्य क्वेरी को क्वेरी के नए उदाहरण के साथ बदलकर संशोधित करने के लिए अत्यधिक सरलीकृत और एक समस्याग्रस्त तरीका है। यह अक्षम है (एसक्यूएल प्रश्नों को फिर से चलाता है) और कुछ परिस्थितियों में सटीक रूप से विफल हो जाएगा (विशेषकर अक्सर जब पदों से निपटने के साथ)। किसी भी आधुनिक WP कोड को अधिक विश्वसनीय तरीकों का उपयोग करना चाहिए, जैसे कि pre_get_postsइस प्रयोजन के लिए हुक का उपयोग करना। TL, DR कभी भी query_posts () का उपयोग नहीं करते हैं

  • get_posts() उपयोग में समान है और एक ही तर्क (कुछ बारीकियों के साथ, विभिन्न चूक की तरह) को स्वीकार करता है, लेकिन पदों की एक सरणी लौटाता है, वैश्विक चर को संशोधित नहीं करता है और कहीं भी उपयोग करने के लिए सुरक्षित है।

  • WP_Queryवह वर्ग है जो पर्दे के पीछे दोनों को अधिकार देता है, लेकिन आप इसे अपने स्वयं के उदाहरण के साथ भी बना सकते हैं और काम कर सकते हैं। थोड़ा अधिक जटिल, कम प्रतिबंध, कहीं भी उपयोग करने के लिए सुरक्षित।


8
@jjeaton के query_posts()लिए छोटा रैपर फंक्शन है WP_Query, यह केवल एक अतिरिक्त चीज है (जैसा कि फ्लोचार्ट के अनुसार) ग्लोबल ओवरराइट कर रहा है$wp_query
Rarst

7
@jjeaton के query_posts()साथ प्रतिस्थापित करने WP_Queryसे प्रदर्शन में कोई फर्क नहीं पड़ेगा, मूल पृष्ठ की क्वेरी अभी भी चलेगी क्योंकि यह कोर लोड का हिस्सा है। यदि आपकी टेम्प्लेट फ़ाइल में कोई लूप नहीं है तो भी वे क्वेरी चलेंगी।
रार्स्ट

116
डब्लूएसईई पर यह महसूस नहीं किया जा सकता है कि यह सबसे लोकप्रिय और उत्कीर्ण पोस्ट है। कोडेक्स में भी होना चाहिए।
कैसर

8
मैं सिर्फ "quot_posts के प्रदर्शन ()" मुद्दे का अपना स्पष्ट विवरण जोड़ूंगा: एक फ़ाइल के भीतर query_posts () या WP_Query का उपयोग करना एक ही प्रदर्शन लागत होगी: आपके द्वारा किए गए क्वेरी। कोडेक्स आलेख में चर्चा की गई समस्या यह है कि यदि आप वास्तव में 'parse_query' फ़िल्टर के साथ मूल क्वेरी_पोस्ट () फ़िल्टर करके क्वेरी को प्रतिस्थापित करना चाहते हैं। इस तरह से आपके पास केवल एक, मूल, वांछनीय क्वेरी है, बजाय इसे बदलने के लिए दूसरी क्वेरी करने के लिए। क्वेरी_पोस्ट () कभी भी नहीं है !! कभी नहीँ!
jerclarke

22
Developer.wordpress.com ब्लॉग पर John James Jacoby द्वारा लिखित query_posts की एक भयानक भयानक व्याख्या है जो इन सभी उत्तरों को पानी से बाहर निकालती है। मुख्य बिंदु: मुख्य लूप को बिल्कुल भी संशोधितquery_posts नहीं करता है , यह पहले से ही चलने के बाद इसे बदल देता है । मुख्य लूप को संशोधित करने का सबसे अच्छा तरीका एक फिल्टर के माध्यम से है । developer.wordpress.com/2012/05/14/…pre_get_posts
Dan Gayle

65

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_Queryincludeमें बदल जाता है 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आप पर निर्भर है और आपको वास्तव में क्वेरी से क्या चाहिए। उपरोक्त आपको अपनी पसंद में मार्गदर्शन करना चाहिए


1
काश मैं पसंदीदा उत्तर दे पाता। यह बहुत समझाता है।
पैट्रिक एलियनस

1
महान व्याख्या! "get_posts () का उपयोग केवल गैर पृष्ठांकित प्रश्नों के लिए किया जाना चाहिए। पेजिंग get_posts एक बड़ी गड़बड़ी है। WP_Query का उपयोग सभी पृष्ठांकित प्रश्नों के लिए किया जाना चाहिए" क्या मूल रूप से सभी को imo जानने की आवश्यकता है।
बुल्लेयन

32

मूल अंतर यह है कि query_posts()वास्तव में केवल वर्तमान लूप को संशोधित करने के लिए है। एक बार जब आप ऐसा कर लेते हैं, तो लूप को रीसेट करना और उसे अपने तरीके से भेजना आवश्यक होता है। इस विधि को समझना भी थोड़ा आसान है, बस इसलिए कि आपकी "क्वेरी" मूल रूप से एक URL स्ट्रिंग है जिसे आप फ़ंक्शन में पास करते हैं, जैसे:

query_posts('meta_key=color&meta_value=blue'); 

दूसरी ओर, WP_Queryएक सामान्य उद्देश्य उपकरण के अधिक है, और अधिक से अधिक सीधे MySQL क्वेरी लिखने की तरह query_posts()है। आप इसे कहीं भी (केवल लूप में नहीं) उपयोग कर सकते हैं और यह किसी भी वर्तमान में चल रहे पोस्ट प्रश्नों के साथ हस्तक्षेप नहीं करता है।

मैं WP_Queryअधिक बार उपयोग करना पसंद करता हूं , जैसा कि ऐसा होता है। वास्तव में, यह आपके विशिष्ट मामले में आने वाला है।


15

बस उपयोग करने की कोई आवश्यकता नहीं है 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कक्षा में जाने और मना करने की सलाह देता हूं ।


14

सुनिश्चित करें कि आप उपयोग करने के wp_reset_query()बाद उपयोग करते हैं query_posts()क्योंकि यह अन्य क्वेरी परिणाम को भी प्रभावित करेगा।


10

अगर मुझे सही पढ़ना याद है, तो मूल रूप से "लूप" WP_Queryकोर फाइलों में कर रहा है, लेकिन आसानी से समझ में आता है।


6
  • यदि आपको मुख्य क्वेरी को संशोधित करने की आवश्यकता है, तो query_posts () : का उपयोग केवल एक और एकमात्र मामले में किया जा सकता है। यह बहुत सारे वैश्विक चर निर्धारित करता है;
  • get_posts () : यह यांत्रिकी में बहुत समान है और समान तर्कों को स्वीकार करता है, लेकिन पदों की सरणी देता है
  • WP_Query : आप अपनी खुद की वस्तु के साथ बना सकते हैं और काम कर सकते हैं। थोड़ा अधिक जटिल, कम प्रतिबंध, यह कहीं भी उपयोग करने के लिए सुरक्षित है।

-6

मैं कहूँगा कि get_posts()एक प्लगइन में उपयोग नहीं करते । यह (सेट के कुछ मामलों में बहुत ही सीमित फिल्टर लगाता है suppress_filters, ignore_sticky_postsआदि) और शायद केवल एक विषय में इस्तेमाल किया जाना चाहिए जब आप कुछ त्वरित किया चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.