ऐसा लगता है कि कोडेक्स में आधे ट्यूटोरियल और ब्लॉगस्फीयर उपयोग 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' => true
WP_Query
'no_found_rows' => true
WP_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_Query
WP_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()
क्योंकि यह अन्य क्वेरी परिणाम को भी प्रभावित करेगा।