আমি কি Pre_get_posts ফাংশনটি ব্যবহার করে মেটা কী দ্বারা কোনও পোস্ট বাদ দিতে পারি?


24

আমি দেখতে পাচ্ছি যে অনেকে এর pre_get_postsপরিবর্তে হুক ব্যবহার করতে পছন্দ করেন query_posts। নীচের কোডটি মেটা কী "বৈশিষ্ট্যযুক্ত" রয়েছে এমন সমস্ত পোস্টে কাজ করে এবং দেখায়

function show_featured_posts ( $query ) {
    if ( $query->is_main_query() ) {
       $query->set( 'meta_key', 'featured' );
       $query->set( 'meta_value', 'yes' );
    }
}

add_action( 'pre_get_posts', 'show_featured_posts' );

তবে আমি চাই যে featured'মেটা_কি ' পোস্টগুলি মূল ক্যোয়ারী থেকে বাদ দেওয়া হোক । এই জন্য কোন সহজ উপায় আছে?

উত্তর:


33

আমি দেখতে পেয়েছি যে অনেকেই ক্যোয়ারী_পোস্টের পরিবর্তে প্রিজেট_পোস্ট হুক ব্যবহার করতে পছন্দ করে

হ্যাঁ!

সুতরাং pre_get_postsএকটি ফিল্টার WP_Queryবস্তুর যার মানে কিছু মাধ্যমে আপনাকে কাজ করতে পারে query_posts()আপনি মাধ্যমে কি করতে পারেন $query->set()এবং $query->get()। বিশেষত আমরা meta_queryবৈশিষ্ট্যটি ব্যবহার করতে পারি ( কোডেক্স দেখুন ):

$meta_query = array(
                 array(
                    'key'=>'featured',
                    'value'=>'yes',
                    'compare'=>'!=',
                 ),
);
$query->set('meta_query',$meta_query);

তবে .. এটি মূল 'মেটা ক্যোয়ারী' (যদি এটির একটি থাকে) প্রতিস্থাপন করে। সুতরাং আপনি যদি না পুরোপুরি আসল মেটা ক্যোয়ারীটি পুরোপুরি প্রতিস্থাপন করতে চান তবে আমার পরামর্শ:

//Get original meta query
$meta_query = $query->get('meta_query');

//Add our meta query to the original meta queries
$meta_query[] = array(
                    'key'=>'featured',
                    'value'=>'yes',
                    'compare'=>'!=',
                );
$query->set('meta_query',$meta_query);

এইভাবে আমরা বিদ্যমান মেটা প্রশ্নের পাশাপাশি আমাদের মেটা ক্যোয়ারী যুক্ত করি।

আপনি / সেট করতে চান পারে relationসম্পত্তির $meta_queryকরার ANDবা OR(রিটার্ন পোস্টগুলি যা সব সন্তুষ্ট, অথবা অন্তত এক, মেটা প্রশ্নের)।

* দ্রষ্টব্য: এই ধরণের ক্যোয়ারী 'বৈশিষ্ট্যযুক্ত' মেটা কী সহ পোস্টগুলি ফিরিয়ে দেবে, তবে যার মান নয় yes। এটি এমন পোস্টগুলিকে অন্তর্ভুক্ত করবে না যেখানে 'বৈশিষ্ট্যযুক্ত' মেটা কী উপস্থিত নেই। আপনি 3.5 এ এটি করতে সক্ষম হবেন


সুতরাং কোনও পোস্টের জন্য একটি মেটা_কি বিদ্যমান আছে কিনা / খালি আছে কিনা তা যাচাই করার কোনও উপায় নেই? আমি 3.5 অপেক্ষা করতে হবে। তারপর। আপনার উত্তর দেওয়ার জন্য ধন্যবাদ.
কার্লিসল

আমি কেবল সঙ্গে একটি মেটা বক্স তৈরি করবে Yesএবং Noবিকল্প এবং 'না' ডিফল্টরূপে নির্বাচিত করা হবে না। আমি যখন কোনও পোস্ট বৈশিষ্ট্যযুক্ত করতে চাই তখন আমি নির্বাচন করব Yes। যাইহোক, আমি চাই শেষ 5 টি পোস্ট করা বৈশিষ্ট্যযুক্ত থাকুক এবং অন্যরা মূল ক্যোয়ারিতে প্রদর্শিত হবে। আমি ফিরে যেতে এবং প্রতিবার নির্বাচনটি পরিবর্তন করতে চাই না তাই আমাকে কেবল সাম্প্রতিক 5 টি পোস্ট বাদ দেওয়ার উপায় খুঁজে পেতে হবে। আমি স্ট্যাকএক্সচেঞ্জে অনুরূপ অনেকগুলি প্রশ্ন দেখছি এবং সেই বৈশিষ্ট্যযুক্ত পোস্টগুলি পরিচালনা করার একটি সহজ উপায় থাকা উচিত। (এমন একটি উপায়ে যা সাধারণ পারফরম্যান্সকে প্রভাবিত করে না, প্রচুর অনুসন্ধান তৈরি করে না বা মিক্সড এসকিএল কোয়েরিগুলির প্রয়োজন হয় না)
কার্লিসল

BTW আমি নিশ্চিত কিনা এটা একটা ভালো ধারণা সঙ্গে একটি অতিরিক্ত meta_key তৈরি করতে নই Yesবা Noসকল পদের জন্য মান। যে পোস্টগুলির কেবল featuredকীটির অভাব রয়েছে সেগুলি বাদ দেওয়া দুর্দান্ত হবে ।
কার্লিসল

এই ফাংশনটি কেবলমাত্র আমার সাইটে পিএইচপি 7 এ আপগ্রেড করার পরে ভেঙে গেছে Uncaught Error: [] operator not supported for stringsকারণ আসলটি meta_queryনাল হিসাবে ফিরে আসার সাথে সাথে একটি ত্রুটি ছুঁড়েছে । যদি কোনওর $meta_query = $query->get('meta_query');জন্য স্যুইচআউট না থাকে তবে আপনি খালি অ্যারেতে ফিরে এসে এটিকে ঘিরে ফেলতে পারেন $meta_query = ( is_array( $query->get('meta_query') ) ) ? $query->get('meta_query') : [];
কেভিন নজেন্ট

2

কিছু লোক যদি এটির ব্যবহার করতে পারে তবে আমি বৈশিষ্ট্যযুক্ত পোস্টগুলির জন্য আমার অস্থায়ী সমাধান পোস্ট করতে চাই। আমি pre_get_postsএখানে হুক ব্যবহার করি না তবে query_postsহয় না । সমস্যাটি হ'ল আমাকে মূল ক্যোয়ারির সাথে খেলতে হবে এবং এসকিএল কোয়েরিটির একটি অংশ চালাতে হবে। আমি যদি খুশি হব যে কোনও বিশেষজ্ঞ কোডটি চেক করতে পারে এবং আমাকে তা ঠিক আছে কিনা এবং কোনও পারফরম্যান্সের সমস্যা সৃষ্টি করবে না তা আমাকে জানান। কারওর কাছে আরও ভাল দৃষ্টিভঙ্গি থাকলে এবং আমাদের সাথে ভাগ করে নিলে এটি দুর্দান্ত হবে।

বৈশিষ্ট্যযুক্ত পোস্ট কোয়েরি তৈরি করুন

<?php 

$featured_query = new WP_query( array(
    'meta_key'       =>'featured', 
    'meta_value'     =>'yes', 
    'posts_per_page' => 5, 
    'no_found_rows'  => true
    )
);

while ($featured_query->have_posts()) : 

    $featured_query->the_post(); 
    //Stuff...

endwhile; 
wp_reset_postdata(); 

?>

মূল ক্যোয়ারী তৈরি করুন, মেটা_কি বৈশিষ্ট্যযুক্ত পোস্টগুলি বাদ দিন, বাদ পড়ুন 5 অতি সাম্প্রতিক পোস্টগুলিতে এবং অন্য সকলকে দেখান।

<?php 

$excludeposts = $wpdb->get_col( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'featured' AND meta_value != '' ORDER BY post_id DESC LIMIT 0, 5" );

$main_query = new WP_Query( array(
    'post__not_in' => $excludeposts, 
    'paged' => $paged 
    ) 
);  

while ($main_query->have_posts()) : 

    $main_query->the_post();
    //Stuff...

endwhile;

?>

0

প্রতিক্রিয়া হিসাবে @ কার্লিজল, আপনি বৈশিষ্ট্যযুক্ত চিহ্নিত 5 টি সাম্প্রতিক পোস্টগুলি বাদ দিতে চাইলে আপনি নিম্নলিখিতগুলি করতে পারেন। আপনি কতগুলি বর্জন করতে চান তার পোস্ট_পরি_পৃষ্ঠা এবং আপনি কীভাবে বৈশিষ্ট্যযুক্ত বিভাগটি নির্ধারণ করছেন তাতে মেটা_কোয়ারিকে পরিবর্তন করুন।

function cmp_exclude_featured_posts($query) {
    $exclude = array();  //Create empty array for post ids to exclude
    if ( $query->is_main_query() ) {
            $featured = get_posts(array(
                'post_type' => 'post',
                'meta_query' => array(
                    array(
                        'key' => 'featured',
                        'value' => '1',
                        'compare' => '==',
                    ),
                ),
                'posts_per_page' => 2
            ));

            foreach($featured as $hide) {
                $exclude[] = $hide->ID;
            }   

            $query->set('post__not_in', $exclude);
        }
}

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