इस कस्टम थीम में मुख्य क्वेरी और कस्टम क्वेरी कैसे काम करती है, इसके बारे में कुछ संदेह?


20

मैं वर्डप्रेस थीम के विकास में बहुत नया हूं और मैं PHP में नहीं हूं (मैं जावा और सी # से आया हूं) और इस थीम विषय में निम्न स्थिति है

जैसा कि आप मुखपृष्ठ में देख सकते हैं कि मैं पहली बार एक पोस्ट दिखाता हूँ (जिसका नाम है आर्टिकोली इन एविडेनज़ा ) जिसमें चित्रित पोस्ट हैं (मैंने इसे एक विशिष्ट टैग का उपयोग करके लागू किया है) और इसके अंतर्गत एक और क्षेत्र है (जिसका नाम अल्टिमी आर्टिकोली है ) जिसमें नवीनतम पोस्ट शामिल है। यह विशेष रुप से पोस्ट नहीं हैं।

यह करने के लिए मैं इस कोड का उपयोग करता हूं:

<section id="blog-posts">

<header class="header-sezione">
        <h2>Articoli in evidenza</h2>
</header>

<!--<?php query_posts('tag=featured');?>-->

<?php
    $featured = new WP_Query('tag=featured');

    if ($featured->have_posts()) : 
            while ($featured->have_posts()) : $featured->the_post();
            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
                 get_template_part('content', get_post_format());

             endwhile;
        wp_reset_postdata();
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>


<header class="header-sezione">
    <h2>Ultimi Articoli</h2>
</header>

<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>

</section>

यह ठीक काम करता है, लेकिन मुझे इस समाधान की गुणवत्ता और यह वास्तव में कैसे काम करता है, इस बारे में कुछ संदेह हैं।

सभी चुनिंदा पोस्टों का चयन करने के लिए , मैं इस लाइन का उपयोग करता हूं जो एक नया WP_Queryऑब्जेक्ट बनाता है जो विशिष्ट टैग वाले क्वेरी को परिभाषित करता है featured:

$featured = new WP_Query('tag=featured');

फिर मैं इस have_posts()विधि के परिणाम का उपयोग करते हुए इस क्वेरी पर पुनरावृति करता हूं ।

इसलिए, जो मैंने समझा है, वह वर्डप्रेस मुख्य क्वेरी नहीं है, लेकिन यह मेरे द्वारा बनाई गई एक नई क्वेरी है। जो मैं समझता हूं, वह बेहतर है कि जब भी मैं इस तरह का ऑपरेशन करूं तो एक नई क्वेरी (जैसा किया गया हो) और मुख्य क्वेरी का उपयोग न करें।

क्या यह सच है, या मैं कुछ याद कर रहा हूं? यदि यह सच है, तो क्या आप मुझे समझा सकते हैं, कि नई कस्टम क्वेरी बनाना बेहतर क्यों है और वर्डप्रेस मुख्य क्वेरी को संशोधित नहीं करना है?

ठीक है, चल रहा है। मैं उन सभी पोस्टों को दिखाता हूं जिनमें 'फ़ीचर्ड' टैग नहीं है। ऐसा करने के लिए, मैं इस कोड स्निपेट का उपयोग करता हूं, जो इसके विपरीत, मुख्य क्वेरी को संशोधित करता है:

    <?php
    // get the term using the slug and the tag taxonomy
    $term = get_term_by( 'slug', 'featured', 'post_tag' );
    // pass the term_id to tag__not_in
    query_posts( array( 'tag__not_in' => array ( $term->term_id )));
    ?>

    <?php
        if (have_posts()) :
            // Start the Loop.
            while (have_posts()) : the_post();
                get_template_part('content', get_post_format());

            endwhile;
        else :
            // If no content, include the "No posts found" template.
            get_template_part('content', 'none');

        endif;
        ?>

इसलिए मुझे लगता है, यह बहुत भयानक है। क्या यह सच है?

अपडेट करें:

उसी ऑपरेशन को करने के लिए मुझे यह फ़ंक्शन (नीचे दिए गए शानदार उत्तर में) मिला है, जिसे मैंने फ़ंक्शन. php में जोड़ा है

function exclude_featured_tag( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
    }
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );

इस फ़ंक्शन में एक हुक होता है जिसे क्वेरी चर ऑब्जेक्ट बनाने के बाद कहा जाता है, लेकिन वास्तविक क्वेरी चलने से पहले।

इसलिए, जो मैंने समझा है, वह इनपुट पैरामीटर के रूप में एक क्वेरी ऑब्जेक्ट लेता है और एक विशिष्ट टैग (मेरे मामले में featuredटैग पोस्ट) को छोड़कर सभी पदों का चयन करके इसे संशोधित करता है (वास्तव में फ़िल्टर करता है )

तो, मैं इस फ़ंक्शन के साथ पिछली क्वेरी (जो विशेष रुप से प्रदर्शित पदों को दिखाने के लिए उपयोग किया जाता है) का उपयोग कैसे कर सकता हूं ताकि मेरी थीम में केवल विशेष रुप से प्रदर्शित पोस्ट न दिखाई दें? या मुझे एक नई क्वेरी बनानी होगी?

जवाबों:


33

आपका वास्तविक प्रश्न मूल रूप से कस्टम क्वेरी चलाने के लिए और मुख्य क्वेरी का उपयोग करने के लिए कब है। इसे तीन भागों में विभाजित करते हैं

भाग एक

कस्टम क्वेरी कब चलाएं (यह एक निश्चित सूची नहीं है)

  • कस्टम सामग्री स्लाइडर्स बनाने के लिए

  • किसी पृष्ठ में एक विशेष रुप से प्रदर्शित सामग्री क्षेत्र बनाने के लिए

  • यदि आपको पोस्ट प्रदर्शित करने की आवश्यकता है, तो page.php टेम्प्लेट पर

  • यदि आपको किसी स्थिर फ्रंट पेज पर कस्टम सामग्री की आवश्यकता होती है

  • संबंधित, लोकप्रिय या सूचनात्मक पोस्ट प्रदर्शित करें

  • मुख्य क्वेरी के दायरे के बाहर कोई अन्य माध्यमिक या पूरक सामग्री

मुख्य क्वेरी का उपयोग कब करना है।

पर प्राथमिक सामग्री प्रदर्शित करने के लिए

  • आपके होमपेज पर और पृष्ठ बैकएंड में एक ब्लॉगपेज के रूप में सेट है

  • सभी पुरालेख पृष्ठ जिनमें आर्काइव.फपी, श्रेणी. एफपी, ऑथर, एफ.पी., टैक्सोनॉमी। एफपी, टैग.फ पी और डेट. एफपी जैसे टेम्पलेट शामिल हैं

  • अद्यतन: सच्चे पेजों और एक स्थिर फ्रंट पेज पर कस्टम कंटेंट प्रदर्शित करें ( सत्य पृष्ठों और स्थिर फ्रंट पेजों पर pre_get_posts का उपयोग करते हुए देखें )

भाग दो

उन सभी चुनिंदा पोस्टों का चयन करने के लिए, जो इस लाइन का उपयोग करते हैं, जो एक नया WP_Query ऑब्जेक्ट बनाते हैं, जो एक विशेष प्रकार के टैग वाले क्वेरी को परिभाषित करते हैं:

इसलिए, जो मुझे समझ में आया है, यह वर्डप्रेस मुख्य क्वेरी नहीं है, बल्कि यह मेरे द्वारा बनाई गई एक नई क्वेरी है। जब मैंने यह समझ लिया है कि बेहतर है एक नई क्वेरी (जैसा किया गया है) और मुख्य क्वेरी का उपयोग न करें जब मैं इस तरह के ऑपरेशन करना चाहता हूं

सही बात। यह मुख्य क्वेरी के लिए दायरे से बाहर हो जाता है। यह द्वितीयक या पूरक सामग्री है जिसे मुख्य क्वेरी के साथ नहीं बनाया जा सकता है। आप हमेशा यह करे भी उपयोग WP_Queryया get_postsअपने कस्टम प्रश्नों बनाने के लिए।

query_postsकस्टम क्वेरी या किसी अन्य क्वेरी को बनाने के लिए कभी भी उपयोग न करें । मेरा जोर।

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

आगे बढ़ते रहना

ठीक है, मैं उन सभी पोस्टों को दिखा रहा हूं जिनमें फ़ीचर्ड टैग नहीं है, ऐसा करने के लिए मैं इस कोड स्निपेट का उपयोग करता हूं जो इसके विपरीत मुख्य क्वेरी को संशोधित करता है:

query_posts( array( 'tag__not_in' => array ( $term->term_id )));

इसलिए मुझे लगता है कि यह बहुत भयानक है। क्या यह सच है?

यह सब गलत है और आपका कथन दुर्भाग्यपूर्ण है। जैसा कि पहले कहा गया है, कभी भी उपयोग न करें query_posts। यह एक पूरी नई क्वेरी चलाता है, जो प्रदर्शन के लिए खराब है, और यह अधिकांश मामलों में पेजिनेशन को तोड़ता है जो सही ढंग से काम करने के लिए पेजिनेशन के लिए मुख्य क्वेरी का एक अभिन्न अंग है।

यह आपकी प्राथमिक सामग्री है, इसलिए आपको डिफ़ॉल्ट लूप के साथ मुख्य क्वेरी का उपयोग करना चाहिए, जो इस तरह दिखना चाहिए, और यह आप सभी की आवश्यकता है

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
?>

आप इस हिस्से से पूरी तरह से छुटकारा पा सकते हैं, इसे हटा सकते हैं, इसे जला सकते हैं और इसके बारे में भूल सकते हैं

<?
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

ठीक है, एक बार जब आप ऐसा कर लेते हैं, तो आप देखेंगे कि मुख्य टैग और डिफ़ॉल्ट लूप का उपयोग करके आपके होम पेज में फीचर टैग से पोस्ट दिखाई देंगे।

होमपेज से इस टैग को हटाने का सही तरीका है pre_get_posts। यह मुख्य क्वेरी और हुक को बदलने का उचित तरीका है जिसे आपको हमेशा अपने प्राथमिक सामग्री लूप में परिवर्तन करने के लिए उपयोग करना चाहिए ।

तो, के साथ कोड pre_get_postsसही है और यह वह फ़ंक्शन है जिसका आपको उपयोग करना चाहिए। बस एक बात, हमेशा ऐसा चेक करें कि आप किसी एडमिन पेज पर नहीं हैं क्योंकि pre_get_postsबैक एंड को भी बदल देता है। तो यह होमपेज से चित्रितfunctions.php पदों को हटाने के लिए उपयोग करने के लिए उचित कोड है

add_action( 'pre_get_posts', 'exclude_featured_tag' );
function exclude_featured_tag( $query ) 
{
    if (    !is_admin() 
         && $query->is_home() 
         && $query->is_main_query() 
    ) {
        $query->set( 'tag__not_in', [ID OF THE FEATURED TAG] );
    }
}

भाग तीन

अतिरिक्त पठन सामग्री जो भविष्य में सहायक होगी


मेरा सौभाग्य। खुशी हुई कि यह आपको उपयोगी लगा। एनजौ :-)
पीटर

वाह, काफी जवाब! मुझे जानकारी का एक महत्वपूर्ण टुकड़ा याद आ रहा है: मैं WP को कैसे बताता हूं "यह एक पोस्ट पेज है" मुख्य पोस्ट पेज के अलावा ? मान लीजिए कि मुझे श्रेणियों की एक सूची 10,11,12 और दूसरी सूची 13,14,15 श्रेणियों के साथ चाहिए। मैं देखता हूं कि मैं श्रेणियों को मुख्य क्वेरी में इंजेक्ट करने के लिए pre_get_posts का उपयोग कैसे कर सकता हूं, लेकिन मैं WP को रेंडर करने के लिए पदों की सूची के रूप में रेंडर करने के लिए कैसे कह सकता हूं? क्या मुझे वास्तव में यहाँ आपके विस्तृत उत्तर का पालन करना होगा wordpress.stackexchange.com/a/215027/74134 क्योंकि यह एक पृष्ठ है? निश्चित रूप से WordPress मूल रूप से एक साइट में कई ब्लॉग सूचियों के लिए अनुमति देता है?
मार्क बेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.