आवश्यक प्रश्न
तीनों में आइए खुदाई: ::query_posts
, ::get_posts
और class WP_Query
समझने के लिए ::query_posts
बेहतर है।
वर्डप्रेस में डेटा प्राप्त करने के लिए आधारशिला WP_Query
वर्ग है। दोनों तरीके ::query_posts
और ::get_posts
उस वर्ग का उपयोग करते हैं।
ध्यान दें कि कक्षा WP_Query
में समान नाम वाली विधियाँ भी शामिल हैं: WP_Query::query_posts
और WP_Query::get_posts
, लेकिन हम वास्तव में केवल वैश्विक विधियों पर विचार करते हैं, इसलिए भ्रमित न हों।
समझ WP_Query
कक्षा WP_Query
को 2004 में वापस लाया गया। सभी क्षेत्रों में umbrella (छाता) का निशान है, जो 2004 में वापस आ गया था। अतिरिक्त क्षेत्रों को बाद में जोड़ा गया था।
यहाँ WP_Query
संरचना है:
class WP_Query (as in WordPress v4.7)
public $query; ☂
public $query_vars = array(); ☂
public $tax_query;
public $meta_query = false;
public $date_query = false;
public $queried_object; ☂
public $queried_object_id; ☂
public $request;
public $posts; ☂
public $post_count = 0; ☂
public $current_post = -1; ☂
public $in_the_loop = false;
public $post; ☂
public $comments;
public $comment_count = 0;
public $current_comment = -1;
public $comment;
public $found_posts = 0;
public $max_num_pages = 0;
public $max_num_comment_pages = 0;
public $is_single = false; ☂
public $is_preview = false; ☂
public $is_page = false; ☂
public $is_archive = false; ☂
public $is_date = false; ☂
public $is_year = false; ☂
public $is_month = false; ☂
public $is_day = false; ☂
public $is_time = false; ☂
public $is_author = false; ☂
public $is_category = false; ☂
public $is_tag = false;
public $is_tax = false;
public $is_search = false; ☂
public $is_feed = false; ☂
public $is_comment_feed = false;
public $is_trackback = false; ☂
public $is_home = false; ☂
public $is_404 = false; ☂
public $is_embed = false;
public $is_paged = false;
public $is_admin = false; ☂
public $is_attachment = false;
public $is_singular = false;
public $is_robots = false;
public $is_posts_page = false;
public $is_post_type_archive = false;
private $query_vars_hash = false;
private $query_vars_changed = true;
public $thumbnails_cached = false;
private $stopwords;
private $compat_fields = array('query_vars_hash', 'query_vars_changed');
private $compat_methods = array('init_query_flags', 'parse_tax_query');
private function init_query_flags()
WP_Query
स्विस सेना चाकू है।
इसके बारे में कुछ बातें WP_Query
:
- यह कुछ ऐसा है जिसे आप अपने द्वारा पारित तर्कों के माध्यम से नियंत्रित कर सकते हैं
- यह डिफ़ॉल्ट रूप से लालची है
- यह लूपिंग के लिए पदार्थ रखता है
- यह वैश्विक अंतरिक्ष x2 में सहेजा गया है
- यह प्राथमिक या माध्यमिक हो सकता है
- यह सहायक वर्गों का उपयोग करता है
- यह एक आसान
pre_get_posts
हुक है
- यह भी नेस्टेड छोरों के लिए समर्थन है
- यह SQL क्वेरी स्ट्रिंग रखता है
- यह परिणामों की संख्या रखता है
- यह परिणाम रखता है
- यह सभी संभावित क्वेरी तर्कों की सूची रखता है
- यह टेम्पलेट झंडे रखती है
- ...
मैं इन सब की व्याख्या नहीं कर सकता, लेकिन इनमें से कुछ पेचीदा हैं, तो चलिए संक्षिप्त सुझाव प्रदान करते हैं।
WP_Query
कुछ ऐसा है जिसे आप तर्क के माध्यम से नियंत्रित कर सकते हैं
The list of the arguments
---
attachment
attachment_id
author
author__in
author__not_in
author_name
cache_results
cat
category__and
category__in
category__not_in
category_name
comments_per_page
day
embed
error
feed
fields
hour
ignore_sticky_posts
lazy_load_term_meta
m
menu_order
meta_key
meta_value
minute
monthnum
name
no_found_rows
nopaging
order
p
page_id
paged
pagename
post__in
post__not_in
post_name__in
post_parent
post_parent__in
post_parent__not_in
post_type
posts_per_page
preview
s
second
sentence
static
subpost
subpost_id
suppress_filters
tag
tag__and
tag__in
tag__not_in
tag_id
tag_slug__and
tag_slug__in
tb
title
update_post_meta_cache
update_post_term_cache
w
year
वर्डप्रेस संस्करण 4.7 से यह सूची निश्चित रूप से भविष्य में बदल जाएगी।
यह WP_Query
तर्कों से वस्तु का निर्माण करने वाला न्यूनतम उदाहरण होगा :
// WP_Query arguments
$args = array ( /* arguments*/ );
// creating the WP_Query object
$query = new WP_Query( $args );
// print full list of arguments WP_Query can take
print ( $query->query_vars );
WP_Query
लालची है
इस विचार पर बनाया गया कि get all you can
वर्डप्रेस डेवलपर्स ने सभी संभावित डेटा को जल्दी प्राप्त करने का निर्णय लिया क्योंकि यह प्रदर्शन के लिए अच्छा है । यही कारण है कि जब डेटाबेस से क्वेरी 10 पोस्ट लेती है तो इसे अलग-अलग क्वेरी के माध्यम से इन पदों के लिए शर्तें और मेटाडेटा भी मिलेगा। शर्तें और मेटाडेटा को कैश किया जाएगा (प्रीफ़ेट किया गया)।
ध्यान दें कि कैशिंग केवल एकल अनुरोध जीवन भर के लिए है।
यदि आप सेट आप कैशिंग निष्क्रिय कर सकते हैं update_post_meta_cache
और update_post_term_cache
करने के लिए false
है, जबकि स्थापना के WP_Query
तर्क। जब कैशिंग अक्षम हो जाता है, तो डेटा केवल मांग पर डेटाबेस से अनुरोध किया जाएगा।
अधिकांश वर्डप्रेस ब्लॉग्स के लिए कैशिंग अच्छा काम करता है, लेकिन कुछ ऐसे मौके होते हैं जब आप कैशिंग को अक्षम कर सकते हैं।
WP_Query
सहायक वर्गों का उपयोग करता है
यदि आपने WP_Query
खेतों की जाँच की है तो आपके पास ये तीन हैं:
public $tax_query;
public $meta_query;
public $date_query;
आप भविष्य में नया जोड़ने की कल्पना कर सकते हैं।
WP_Query
लूपिंग के लिए पदार्थ रखता है
इस कोड में:
$query = new WP_Query( $args )
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
आप देख सकते हैं कि आपके WP_Query
पास जो पदार्थ हो सकते हैं। सहायक तरीके भी हैं। आप सिर्फ while
लूप सेट करें ।
ध्यान दें। for
और while
लूप्स शब्दार्थ के बराबर हैं।
WP_Query
प्राथमिक और माध्यमिक
वर्डप्रेस में आपके पास एक प्राथमिक और शून्य या अधिक माध्यमिक प्रश्न हैं।
प्राथमिक क्वेरी नहीं होना संभव है, लेकिन यह इस लेख के दायरे से परे है।
प्राथमिक क्वेरी को मुख्य क्वेरी या नियमित क्वेरी के रूप में जाना जाता है । द्वितीयक क्वेरी को एक कस्टम क्वेरी भी कहा जाता है ।
WP_Rewrite
URL के आधार पर क्वेरी तर्क बनाने के लिए वर्डप्रेस क्लास का उपयोग करता है । इन तर्कों के आधार पर यह वैश्विक अंतरिक्ष में दो समान वस्तुओं को संग्रहीत करता है। ये दोनों मुख्य क्वेरी का आयोजन करेंगे।
global $wp_query @since WordPress 1.5
global $wp_the_query @since WordPress 2.1
जब हम मुख्य प्रश्न कहते हैं तो हम इन चरों के बारे में सोचते हैं। अन्य प्रश्नों को माध्यमिक या कस्टम कहा जा सकता है।
यह global $wp_query
या तो उपयोग करने के लिए पूरी तरह से कानूनी है $GLOBALS['wp_query']
, लेकिन दूसरी संकेतन का उपयोग करना अधिक उल्लेखनीय है, और फ़ंक्शन के दायरे के भीतर एक अतिरिक्त रेखा टाइप करने से बचाता है।
$GLOBALS['wp_query']
और $GLOBALS['wp_the_query']
अलग-अलग वस्तुएं हैं। $GLOBALS['wp_the_query']
जमे रहना चाहिए।
WP_Query
आसान pre_get_posts
हुक है।
यह एक्शन हुक है। यह किसी भी WP_Query
उदाहरण पर लागू होगा । आप इसे कहते हैं:
add_action( 'pre_get_posts', function($query){
if ( is_category() && $query->is_main_query() ) {
// set your improved arguments
$query->set( ... );
...
}
return $query;
});
यह हुक बहुत अच्छा है और यह किसी भी क्वेरी तर्क को बदल सकता है।
यहाँ आप पढ़ सकते हैं :
क्वेरी चर ऑब्जेक्ट के बनने के बाद आग, लेकिन वास्तविक क्वेरी चलने से पहले।
तो यह हुक तर्क प्रबंधक है, लेकिन नई WP_Query
वस्तुएं नहीं बना सकता । यदि आपके पास एक प्राथमिक और एक द्वितीयक क्वेरी है, pre_get_posts
तो तीसरा नहीं बना सकते। या यदि आपके पास सिर्फ एक प्राथमिक था तो वह माध्यमिक नहीं बना सकता है।
ध्यान दें कि आपको मुख्य क्वेरी को बदलने की आवश्यकता है केवल आप request
हुक का भी उपयोग कर सकते हैं ।
WP_Query
नेस्टेड छोरों का समर्थन करता है
यह परिदृश्य तब हो सकता है यदि आप प्लगइन्स का उपयोग करते हैं, और आप टेम्पलेट से प्लगइन फ़ंक्शन कहते हैं।
यहाँ शोकेस उदाहरण है कि WordPress के पास नेस्टेड छोरों के लिए सहायक कार्य भी हैं:
global $id;
while ( have_posts() ) : the_post();
// the custom $query
$query = new WP_Query( array( 'posts_per_page' => 5 ) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) : $query->the_post();
echo '<li>Custom ' . $id . '. ' . get_the_title() . '</li>';
endwhile;
}
wp_reset_postdata();
echo '<li>Main Query ' . $id . '. ' . get_the_title() . '</li>';
endwhile;
आउटपुट इस तरह से होगा क्योंकि मैंने थीम यूनिट टेस्ट डेटा स्थापित किया है :
Custom 100. Template: Sticky
Custom 1. Hello world!
Custom 10. Markup: HTML Tags and Formatting
Custom 11. Markup: Image Alignment
Custom 12. Markup: Text Alignment
Custom 13. Markup: Title With Special Characters
Main Query 1. Hello world!
भले ही मैंने कस्टम $ क्वेरी में 5 पोस्ट का अनुरोध किया हो, यह मुझे छह वापस कर देगा, क्योंकि स्टिकी पोस्ट साथ जाएगी। यदि wp_reset_postdata
पिछले उदाहरण में कोई भी आउटपुट ऐसा नहीं होगा, तो $GLOBALS['post']
वसीयत अमान्य होने के कारण ।
Custom 1001. Template: Sticky
Custom 1. Hello world!
Custom 10. Markup: HTML Tags and Formatting
Custom 11. Markup: Image Alignment
Custom 12. Markup: Text Alignment
Custom 13. Markup: Title With Special Characters
Main Query 13. Markup: Title With Special Characters
WP_Query
wp_reset_query
कार्य किया है
यह एक रीसेट बटन की तरह है। $GLOBALS['wp_the_query']
हर समय जमे रहना चाहिए, और प्लगइन्स या थीम को कभी भी बदलना नहीं चाहिए।
यहाँ क्या wp_reset_query
है:
function wp_reset_query() {
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
wp_reset_postdata();
}
पर टिप्पणी करता है get_posts
get_posts
की तरह लगता है
File: /wp-includes/post.php
1661: function get_posts( $args = null ) {
1662: $defaults = array(
1663: 'numberposts' => 5,
1664: 'category' => 0, 'orderby' => 'date',
1665: 'order' => 'DESC', 'include' => array(),
1666: 'exclude' => array(), 'meta_key' => '',
1667: 'meta_value' =>'', 'post_type' => 'post',
1668: 'suppress_filters' => true
1669: );
... // do some argument parsing
1685: $r['ignore_sticky_posts'] = true;
1686: $r['no_found_rows'] = true;
1687:
1688: $get_posts = new WP_Query;
1689: return $get_posts->query($r);
भविष्य में लाइन नंबर बदल सकते हैं।
यह सिर्फ एक है आवरण के आसपास WP_Query
है कि रिटर्न क्वेरी वस्तु पदों।
ignore_sticky_posts
सही साधनों पर सेट चिपचिपा पोस्ट केवल एक प्राकृतिक स्थिति में दिखाई दे सकते। सामने कोई चिपचिपा पद नहीं होगा। no_found_rows
सही मायने में दूसरा सेट वर्डप्रेस डेटाबेस एपीआई SQL_CALC_FOUND_ROWS
पेजेशन को लागू करने के लिए उपयोग नहीं करेगा , पाया पंक्तियों की संख्या को निष्पादित करने के लिए डेटाबेस पर लोड को कम करता है ।
यह तब आसान होता है जब आपको पेजिंग की आवश्यकता नहीं होती है। हम समझते हैं कि अब हम इस क्वेरी के साथ इस फ़ंक्शन की नकल कर सकते हैं:
$args = array ( 'ignore_sticky_posts' => true, 'no_found_rows' => true);
$query = new WP_Query( $args );
print( $query->request );
यहाँ संगत SQL अनुरोध है:
SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
तुलना करें कि हमारे पास अब पिछले SQL अनुरोध के साथ क्या SQL_CALC_FOUND_ROWS
मौजूद है।
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
बिना रिक्वेस्ट SQL_CALC_FOUND_ROWS
तेज होगी।
पर टिप्पणी करता है query_posts
टिप: 2004 में पहली बार केवल वहाँ था global $wp_query
। वर्डप्रेस 2.1 संस्करण के रूप में $wp_the_query
आया था। टिप: $GLOBALS['wp_query']
और $GLOBALS['wp_the_query']
अलग-अलग ऑब्जेक्ट हैं।
query_posts()
है WP_Query
आवरण। यह मुख्य WP_Query
ऑब्जेक्ट का संदर्भ देता है , और उसी समय यह सेट हो जाएगा global $wp_query
।
File: /wp-includes/query.php
function query_posts($args) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($args);
}
PHP4 में, वस्तुओं सहित सब कुछ, मूल्य द्वारा पारित किया गया था। query_posts
इस तरह था:
File: /wp-includes/query.php (WordPress 3.1)
function &query_posts($args) {
unset($GLOBALS['wp_query']);
$GLOBALS['wp_query'] =& new WP_Query();
return $GLOBALS['wp_query']->query($args);
}
कृपया विशिष्ट परिदृश्य में ध्यान दें कि एक प्राथमिक और एक द्वितीयक क्वेरी के साथ हमारे पास ये तीन चर हैं:
$GLOBALS['wp_the_query']
$GLOBALS['wp_query'] // should be the copy of first one
$custom_query // secondary
मान लीजिए कि इन तीनों में से प्रत्येक में 1M मेमोरी है। कुल 3M मेमोरी होगी। यदि हम उपयोग करते हैं query_posts
, $GLOBALS['wp_query']
तो परेशान हो जाएंगे और फिर से बनाए जाएंगे।
PHP5 + $GLOBALS['wp_query']
ऑब्जेक्ट को खाली करने वाला स्मार्ट होना चाहिए , जैसे PHP4 में हमने इसके साथ किया थाunset($GLOBALS['wp_query']);
function query_posts($args) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($args);
}
परिणामस्वरूप query_posts
कुल 2M मेमोरी की get_posts
खपत होती है , जबकि 3M मेमोरी की खपत होती है।
ध्यान दें कि query_posts
हम वास्तविक वस्तु नहीं लौटा रहे हैं, लेकिन वस्तु का संदर्भ है।
से php.net : एक PHP संदर्भ एक उपनाम है, जो एक ही मूल्य के लिए लिखने के लिए दो अलग-अलग चर अनुमति देता है। PHP 5 के रूप में, एक ऑब्जेक्ट वैरिएबल में ऑब्जेक्ट को अब मान के रूप में शामिल नहीं किया गया है। इसमें केवल एक ऑब्जेक्ट पहचानकर्ता होता है जो ऑब्जेक्ट एक्सेसर्स को वास्तविक ऑब्जेक्ट खोजने की अनुमति देता है। जब कोई ऑब्जेक्ट तर्क द्वारा भेजा जाता है, तो किसी अन्य चर को लौटाया या असाइन किया जाता है, विभिन्न चर एलियास नहीं होते हैं: वे पहचानकर्ता की एक प्रति पकड़ते हैं, जो उसी ऑब्जेक्ट को इंगित करता है।
इसके अलावा PHP5 में असाइन (=) ऑपरेटर स्मार्ट है। यह उथली प्रतिलिपि का उपयोग करेगा और हार्ड ऑब्जेक्ट की प्रतिलिपि नहीं। जब हम इस तरह से लिखते हैं तो $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
केवल डेटा की प्रतिलिपि बनाई जाएगी, न कि पूरी वस्तु के बाद से ये समान ऑब्जेक्ट प्रकार साझा करते हैं।
यहाँ एक उदाहरण है
print( md5(serialize($GLOBALS['wp_the_query']) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
query_posts( '' );
print( md5(serialize($GLOBALS['wp_the_query']) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
परिणाम होगा:
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
d6db1c6bfddac328442e91b6059210b5
क्वेरी रीसेट करने का प्रयास करें:
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
query_posts( '' );
wp_reset_query();
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
परिणाम होगा:
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
आप उपयोग करने पर भी समस्याएँ पैदा कर सकते हैं WP_Query
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
global $wp_query;
$wp_query = new WP_Query( array( 'post_type' => 'post' ) );
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
बेशक, समाधान wp_reset_query
फिर से फ़ंक्शन का उपयोग करना होगा ।
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
global $wp_query;
$wp_query = new WP_Query( array( 'post_type' => 'post' ) );
wp_reset_query();
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
यही कारण है कि मुझे लगता है कि query_posts
स्मृति दृष्टिकोण से बेहतर हो सकता है। लेकिन आपको हमेशा wp_reset_query
ट्रिक करनी चाहिए ।