स्टिकी पोस्ट प्रति पृष्ठ सीमा से अधिक पोस्ट हैं


21

मैं pre_get_postsअपने होमपेज पर प्रदर्शित पदों की संख्या को समायोजित करने के लिए उपयोग कर रहा हूं ।

function lifelounge_query_adjust( $query ) {
    if ( is_home() ) {
        set_query_var( 'posts_per_page', 12 );
        return;
    }
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );

लेकिन मैं चिपचिपा पदों के साथ एक समस्या में चल रहा हूँ। मूल रूप से, अगर मेरे पास कोई चिपचिपा पद है, तो क्वेरी मेरे द्वारा निर्दिष्ट 12 पदों से अधिक प्रदर्शित करेगी , क्योंकि यह 12 से अधिक किसी भी चिपचिपा पदों को प्रदर्शित करेगा । मैं निश्चित रूप से, चिपचिपा पदों को अनदेखा कर सकता हूं:

function lifelounge_query_adjust( $query ) {
    if ( is_home() ) {
        set_query_var( 'posts_per_page', 1 );
        set_query_var( 'ignore_sticky_posts', 1 );
        return;
    }
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );

लेकिन मुझे नहीं लगता कि यह आदर्श है। मुझे लगता है कि चिपचिपे पदों को 12 पदों की सीमा में शामिल किया जाना चाहिए , और सीमा में नहीं जोड़ा जाना चाहिए। यही मेरे लिए सबसे ज्यादा मायने रखता है। वहाँ एक तरीका है कि प्राप्त करने के लिए है? क्या मैंने फेस-पाम-योग्य त्रुटि की है?

बहुत ज्यादा एक डुप्लिकेट: स्टिकी पोस्ट्स और पोस्ट प्रति पृष्ठ लेकिन यह स्थानीय रूप से भी अजीब तरह से बंद था। मैं असहमत हूं, जाहिर है क्योंकि मैं एक जवाब की तलाश में हूं, लेकिन यह भी कि यह एक सवाल है कि वर्डप्रेस आपको posts_per_page सीमा का सम्मान नहीं करता है यदि आप चिपचिपा पदों का उपयोग कर रहे हैं। यदि आप प्रति पृष्ठ 12 पोस्ट चाहते हैं, तो आपको 12 नहीं, 13 प्राप्त करना चाहिए, जो कि आपके पास एक चिपचिपा पद होने पर आपको मिलेगा।

जवाबों:


12

यहाँ चिपचिपे पदों की संख्या प्राप्त करने के लिए एक दृष्टिकोण है (यदि कोई हो) और गणना posts_per_pageपैरामीटर में इसे शामिल करें :

add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {

    if ($query->is_main_query() && is_home()) {

        // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {

            // counnt the number of sticky posts
            $sticky_count = count($sticky_posts);

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
                $query->set('posts_per_page', $posts_per_page - $sticky_count);

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set('posts_per_page', 1);
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    }
}

संपादित करें

उस स्थिति में जहां प्रति पृष्ठ पोस्ट की संख्या हम सेट करना चाहते हैं या चिपचिपे पदों की संख्या से कम है, मैंने एक सेट किया posts_per_pageहै और इसके परिणामस्वरूप 13 या अधिक पद होंगे $sticky_count + 1(इस मामले में) केवल पहले पर पृष्ठ (बाद के पृष्ठों में 12 पोस्ट होंगे)। शायद यह ठीक है क्योंकि यह मामला दुर्लभ है और पहले पृष्ठ पर +1 पोस्ट उतना महत्वपूर्ण नहीं हो सकता है।

ऐसा इसलिए है क्योंकि Wordpress सभी चिपचिपे पोस्ट को पहले और एक पृष्ठ (पहले पृष्ठ) पर प्रदर्शित करेगा, भले ही उनकी गिनती posts_per_pageपैरामीटर से अधिक हो , इसलिए हम posts_per_pageइस मामले में न्यूनतम राशि तक निर्धारित करते हैं जो कि है 1, क्योंकि 0और नकारात्मक मान निष्क्रिय हो जाएंगे posts_per_pageपैरामीटर और कहा कि पहले पृष्ठ पर सभी पोस्ट प्रदर्शित करने के लिए Wordpress कर देगा।


महान!! मुझे लगता है कि आप को बदलने की जरूरत $sticky_count + (12 - $sticky_count)के लिए 12- $sticky_count, हालांकि। उदाहरण के लिए यदि मेरे पास 1 चिपचिपा है, तो आपका गणित अभी भी 12 से बाहर काम करता है, और फिर WP 13. चिपचिपा पद जोड़ता है 13. बनाने के लिए ओह, और अगर if ($sticky_count > $posts_per_page)और हम 12 पर सेट करते हैं, तो इसका मतलब यह नहीं है कि हम 24+ दिखाएंगे?
हेलगेटहाइकिंग

@ हेलाथेवीकिंग: आप सही हैं। मैं हमेशा ऐसी मूर्खतापूर्ण गलतियां करता हूं, गणना कभी भी मेरे लिए दिलचस्प नहीं थी। और हां, इसके परिणामस्वरूप 24 पद होंगे। मैंने उस खाते के लिए कोड को अपडेट कर दिया है, और मैंने पृष्ठ संख्या के लिए एक चेक जोड़ा है। यह ठीक काम करता है, लेकिन अब एक ऐसा मामला $posts_per_pageहोगा जहां समान होगा $sticky_count, और यहाँ मैंने 1 होने के लिए posts_per_page पैरामीटर सेट किया है, और मुझे लगता है कि यह ठीक होगा क्योंकि यह मामला शायद दुर्लभ होगा और यह केवल पहले पृष्ठ पर होगा ( $sticky_count + 1)।
अहमद एम

संपादन के लिए धन्यवाद! मुझे लगता है कि यह सबसे अच्छा समाधान है जो हम चिपचिपा पदों का उपयोग करके प्राप्त कर सकते हैं। मुझे लगता है कि मैं अंत में एक साधारण मेटा कुंजी के आधार पर छाँट सकता हूं कि क्या कोई पोस्ट चित्रित किया गया है या नहीं। यह मेरी समझ के लिए अधिक सामान्य व्यवहार करता है।
हेलगेटहाइकिंग

यह एक समाधान के रूप में विफल रहता है यदि चिपचिपा पोस्ट मूल रूप से वांछित पोस्ट_पर_पेज का हिस्सा हैं। कुल पदों की संख्या कम हो जाएगी लेकिन चिपचिपे पद उस संख्या को वापस नहीं लाएंगे, क्योंकि वे निर्धारित तिथि के अनुसार सामान्य तिथि का हिस्सा होते हैं।
एंड्रयू किलेन

3

वहाँ एक मुद्दा अगर चिपचिपा पदों पहले पृष्ठ में हैं।

समाधान चिपचिपा पदों के लिए चिपचिपा पद गणना में वृद्धि करना है जो पहले पृष्ठ का हिस्सा है।

function fix_posts_per_page_with_sticky_posts( $query ) {

    if ( $query->is_main_query() ) {

        // set the number of posts per page
        $posts_per_page = 12;

        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // get queried post ids array
        $ids = array();
        $args = array(
            'post_type' => 'post',
            'post_per_page' => $posts_per_page,
            'paged' => 1
        );

        $posts = get_posts( $args );

        foreach ( $posts as $post ) {
            $ids[] = $post->ID;
        }

        // if we have any sticky posts and we are at the first page
        if ( is_array( $sticky_posts ) && ! $query->is_paged() ) {

            // count the number of sticky posts
            $sticky_count = count( $sticky_posts );

            foreach ( $sticky_posts as $sticky_post ) {
                if ( in_array( $sticky_post, $ids ) ) {
                    // decrement sticky posts count if the sticky post in on the page
                    $sticky_count--;
                }
            }

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ( $sticky_count < $posts_per_page ) {
                $query->set( 'posts_per_page', $posts_per_page - $sticky_count );

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set( 'posts_per_page', 1 );
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set( 'posts_per_page', $posts_per_page );
        }
    }
}
add_action( 'pre_get_posts', 'fix_posts_per_page_with_sticky_posts'  );

मुझे उम्मीद है इससे मदद मिलेगी


1
क्या आप सुनिश्चित हैं कि वहाँ एक आसान और तेज समाधान नहीं है? संकेत: आप चिपचिपे पदों की मात्रा और प्रति पृष्ठ पदों को जानते हैं ...
kaiser

मुझे अब तक बेहतर नहीं मिला .. यह मेरी राय में WP कोर में होने वाली किसी चीज़ के लिए अधिक फिक्स है
19

यदि यह कोर में होगा, तो अन्य परिदृश्य काम नहीं करेंगे।
कैसर

यह एक ज्ञात बग है और core.trac.wordpress.org/ticket/27282
Will

@kaiser अहमद एम का समाधान चिपचिपे पदों के लिए जिम्मेदार नहीं है जो कि उनके चिपचिपे राज्य की परवाह किए बिना पहले पृष्ठ पर दिखाई देते थे। यह पहले पृष्ठ (WordPress v4.9.7) पर प्रदर्शित होने वाले कुछ पोस्टों में परिणाम कर सकता है। यह उत्तर बेहतर है क्योंकि यह उसके लिए जिम्मेदार है।
जैकब बुडिन

0

मैंने उपरोक्त दोनों उत्तरों को एक में साफ कर दिया है ताकि यह अनावश्यक WP_Query को लोड न करे, पहले पेज पर चिपचिपा होने पर इसे ठीक करता है, क्लीनर को तेज कोड के साथ सूचना को संसाधित करने का समय कम करता है।

function modify_main_query( $query ) {
   if ( ( $query->is_home() || is_front_page() ) && $query->is_main_query() ) {
         // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );
        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {
            // make a second query to make sure the sticky posts will still work 
            // correctly when on the first page
            // Only reply with the ID's as that is all that is needed
            $args = [
                'post_type' => 'post',
                'post_per_page' => $posts_per_page,
                'paged' => 1,
                'fields' => 'ids'
            ];
            // Array flip to reduce the time taken by 
            // using isset and not in_array
            $posts = array_flip( get_posts( $args ) );

            // count the number of sticky posts
            $sticky_count = count($sticky_posts);

            // loop the posts from the 2nd query to see if the ID's of the sticky posts
            // sit inside it.
            foreach ( $sticky_posts as $sticky_post ) {
                if(isset($posts[$sticky_post])){
                    $sticky_count--;
                }
            }
            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
               $query->set('posts_per_page', $posts_per_page - $sticky_count);
            } else {
                // if the number of sticky posts is greater than or equal
                // the number of pages we want to set:
                $query->set('posts_per_page', 1);
            }
        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    } 
}

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