স্টিকি পোস্টগুলি প্রতি পৃষ্ঠার সীমা ছাড়িয়ে যায়


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 টি পোস্ট চান তবে আপনার 13 টি নয়, 12 টি পাওয়া উচিত যা আপনার যদি একটি একক স্টিকি পোস্ট থাকে তবে আপনি কী পাবেন।

উত্তর:


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এবং এর ফলে $sticky_count + 1কেবলমাত্র প্রথমটিতে 13 বা আরও বেশি পোস্ট (এই ক্ষেত্রে) আসবে পৃষ্ঠা (পরবর্তী পৃষ্ঠাগুলিতে 12 টি পোস্ট থাকবে)। সম্ভবত এটি ঠিক আছে যেহেতু এই ক্ষেত্রেটি বিরল এবং প্রথম পৃষ্ঠায় +1 পোস্টটি তাত্পর্যপূর্ণ নাও হতে পারে।

এর কারণ হ'ল ওয়ার্ডপ্রেস সমস্ত স্টিকি পোস্টগুলি প্রথম এবং এক পৃষ্ঠায় (প্রথম পৃষ্ঠায়) প্রদর্শন করবে যদিও posts_per_pageপ্যারামিটারের চেয়ে তাদের সংখ্যা বেশি , তাই আমরা posts_per_pageএই ক্ষেত্রে সম্ভাব্য ন্যূনতম পরিমাণে সেট করলাম 1, কারণ 0এবং নেতিবাচক মানগুলি অক্ষম করবে posts_per_pageপরামিতি এবং যে প্রথম পৃষ্ঠায় সকল পোস্ট প্রদর্শন করে ওয়ার্ডপ্রেস করতে হবে।


গ্রেট !! আমার মনে হয় আপনার যদিও বদলে $sticky_count + (12 - $sticky_count)যাওয়া দরকার 12- $sticky_count। উদাহরণস্বরূপ, যদি আমি 1 চটচটে আছে, তারপর আপনার গণিত এখনও 12 কাজ করে, এবং তারপর ডাব্লু 13. ওহ করতে স্টিকি পোষ্ট যোগ, এবং যদি if ($sticky_count > $posts_per_page)এবং আমরা 12 সেট করতে চান, না মানে আমরা 24+ দেখাব হবে?
হেলগাটিভিকিং

@ হেলগাথেভিং: আপনি ঠিক বলেছেন। আমি সবসময় এইরকম মূর্খ ভুল করি, গণনাগুলি আমার কাছে কখনই আকর্ষণীয় ছিল না। এবং হ্যাঁ, এর ফলে 24 টি পোস্ট আসবে। আমি অ্যাকাউন্টটির জন্য কোডটি আপডেট করেছি এবং আমি একটি পৃষ্ঠা নম্বরের জন্য একটি চেক যুক্ত করেছি। এটি সূক্ষ্মভাবে কাজ করে তবে এখন এখানে একটি কেস $posts_per_pageহবে যেখানে সমান হবে $sticky_countএবং এখানে আমি পোস্ট_প্রেম_পৃষ্ঠা প্যারামিটারটি 1 হিসাবে সেট করেছি এবং আমি মনে করি যে এই মামলাটি বিরল হতে পারে এবং এটি কেবল প্রথম পৃষ্ঠায় হবে ( $sticky_count + 1)।
আহমদ এম

সম্পাদনার জন্য ধন্যবাদ! আমি মনে করি এটি স্টিকি পোস্টগুলি ব্যবহার করে আমরা পেতে পারি এটি সেরা সমাধান। আমি মনে করি যে কোনও পোস্ট বৈশিষ্ট্যযুক্ত কিনা তা আমি শেষ পর্যন্ত একটি সাধারণ মেটা কী দ্বারা বাছাই করতে পারি। এটি আমার বোঝার জন্য আরও সাধারণভাবে আচরণ করে।
হেলগাটিভিকিং

এটি সমাধান হিসাবে ব্যর্থ হয় যদি স্টিকি পোস্টগুলি মূলত পোষ্ট_পার_পৃষ্ঠা চেয়েছিল wanted মোট পোস্টের সংখ্যা হ্রাস পাবে তবে স্টিকি পোস্টগুলি সেই সংখ্যাটিকে পিছনে ঠেলে দেবে না কারণ তারা আদেশের আদেশের স্বাভাবিক তারিখের অংশ are
অ্যান্ড্রু কিলেন

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
আপনি কি নিশ্চিত যে এর সহজ এবং দ্রুত সমাধান নেই? ইঙ্গিত: আপনি প্রতি পৃষ্ঠায় স্টিকি পোস্ট এবং পোস্টের পরিমাণ জানেন ...
কায়সার

আমি এখন পর্যন্ত এর চেয়ে ভাল খুঁজে পাইনি .. এটি আমার মতে ডাব্লুপি কোরে থাকা উচিত এমন কোনও কিছুর জন্য এটি আরও ঠিক
সিএসএজি

এটি যদি মূল হয় তবে অন্যান্য পরিস্থিতিতে কাজ করবে না।
কায়সার

এটি একটি পরিচিত ত্রুটি এবং কোর
.

@ কায়সার আহমদ এম এর সমাধান স্টিকি পোস্টের জন্য দায়বদ্ধ নয় যা তাদের চটচটে অবস্থা নির্বিশেষে প্রথম পৃষ্ঠায় প্রদর্শিত হবে। এটির প্রথম পৃষ্ঠায় খুব কম পোস্ট প্রদর্শিত হতে পারে (ওয়ার্ডপ্রেস v4.9.7)। এই উত্তরটি আরও ভাল কারণ এটি তার জন্য অ্যাকাউন্ট করে।
জ্যাকব বুডিন

0

আমি উপরের দুটি উত্তর একটিতে পরিষ্কার করে দিয়েছি যাতে এটি অপ্রয়োজনীয় ডাব্লুপিউকিউয়ারি লোড না করে, প্রথম পৃষ্ঠায় স্টিকি থাকলে ক্লিনার দ্রুত কোড সহ তথ্য প্রসেস করার সময় কমিয়ে দেয় es

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' );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.