सबसे उत्कीर्ण जवाब के रूप में देर से जवाब आपकी क्वेरी को तोड़ देगा और बस कुछ प्रमुख बिंदुओं में सच नहीं है।
मुख्य WP_Query और यह फिल्टर
सबसे पहले, वर्डप्रेस आंतरिक रूप से उपयोग करता है query_posts()(एक पतली आवरण जो WP_Queryकि थीम या प्लगइन्स में उपयोग नहीं किया जाना चाहिए ) ए WP_Query। यह WP_Queryमुख्य लूप / क्वेरी के रूप में कार्य कर रहा है। जब तक वास्तविक SQL क्वेरी स्ट्रिंग का निर्माण नहीं किया जाता है तब तक यह क्वेरी बहुत सारे फ़िल्टर और क्रियाओं के माध्यम से चलेगी। उनमें से एक है pre_get_posts। अन्य हैं posts_clauses, posts_whereआदि, कि आपको क्वेरी स्ट्रिंग निर्माण प्रक्रिया को बाधित करने की भी अनुमति देते हैं।
गहराई से देखें कि कोर के अंदर क्या होता है
वर्डप्रेस wp()फ़ंक्शन (इन wp-includes/functions.php) चलाता है , जो कॉल करता है $wp->main()( $wpवर्ग WP की एक वस्तु है, जिसे में परिभाषित किया गया हैwp-includes/class-wp.php )। यह वर्डप्रेस को बताता है:
- उपयोग करके क्वेरी विनिर्देश में URL को पार्स करें
WP->parse_request() - उस पर और नीचे।
- सभी is_ वैरिएबल सेट करें जिनका उपयोग सशर्त टैग द्वारा किया जाता है
$wp_query->parse_query()( $wp_queryयह एक वस्तु है class WP_Query, जिसे परिभाषित किया गया है wp-includes/query.php)। ध्यान दें कि इस फ़ंक्शन के नाम के बावजूद, इस मामले मेंWP_Query->parse_query वास्तव में हमारे लिए कोई पार्सिंग नहीं करता है, क्योंकि इससे पहले हाथ से किया जाता है WP->parse_request()।
- फ़ंक्शन स्पेसिफिकेशन को MySQL डेटाबेस क्वेरी में कनवर्ट करें, और WP_Query-> get_posts () में पदों की सूची प्राप्त करने के लिए डेटाबेस क्वेरी चलाएँ। वर्डप्रेस लूप में उपयोग किए जाने वाले $ wp_query ऑब्जेक्ट में पोस्ट सहेजें।
स्रोत कोडेक्स
निष्कर्ष
यदि आप वास्तव में मुख्य क्वेरी को संशोधित करना चाहते हैं, तो आप विभिन्न प्रकार के फ़िल्टर का उपयोग कर सकते हैं। बस वहां डेटा बदलने के$query->set( 'some_key', 'some_value' ); लिए उपयोग करें या सशर्त जांच करने के लिए डेटा पुनर्प्राप्त करने के लिए उपयोग करें । यह आपको दूसरी क्वेरी करने से बचाएगा, क्योंकि आप SQL क्वेरी को केवल बदल रहे हैं ।$query->get( 'some_key' );
यदि आपको कोई अतिरिक्त क्वेरी करनी है , तो किसी WP_Queryऑब्जेक्ट के साथ जाएं । इससे DB में एक और क्वेरी जुड़ जाएगी।
उदाहरण
जैसा कि उत्तर हमेशा एक उदाहरण के साथ बेहतर काम करते हैं, आपको यहां एक बहुत अच्छा मिला (प्रॉप टू ब्रैड टूसेनार्ड), जो बस कोर ऑब्जेक्ट को बढ़ाता है और इसलिए बहुत पुन: प्रयोज्य है (इसमें से एक प्लगइन बनाएं):
class My_Book_Query extends WP_Query
{
function __construct( $args = array() )
{
// Forced/default args
$args = array_merge( $args, array(
'posts_per_page' => -1
) );
add_filter( 'posts_fields', array( $this, 'posts_fields' ) );
parent::__construct( $args );
}
public function posts_fields( $sql )
{
return "{$sql}, {$GLOBALS['wpdb']->terms}.name AS 'book_category'";
}
}
फिर आप अपनी दूसरी / अतिरिक्त क्वेरी चला सकते हैं जैसे आप निम्नलिखित उदाहरण में देख सकते हैं। अपनी क्वेरी को बाद में रीसेट करना न भूलें।
$book_query = new My_Book_Query();
if ( $book_query->have_posts() )
{
while ( $book_query->have_posts() )
{
$book_query->the_post();
# ...do stuff...
} // endwhile;
wp_reset_postdata();
} // endif;