এক কাস্টম ফিল্ড দ্বারা ফিল্টার, অন্য দ্বারা অর্ডার?


10

আমি একটি কাস্টম পোস্ট টাইপ "তালিকাবদ্ধকরণ" আছে এবং আমি সব তালিকা একটি কাস্টম ক্ষেত্র আছে পেতে চান gateway_value != 'Yes', এবং অন্য কাস্টম ক্ষেত্র দ্বারা ফলাফল অর্ডার, location_level1_value। আমি আলাদাভাবে কাজ করার জন্য প্রশ্নগুলি পেতে পারি, তবে আমি সেগুলি একত্রিত করতে পারি না:

প্রশ্ন 1 (অবস্থান অনুসারে বাছাই করুন):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

ক্যোয়ারী 2 (কাস্টম ফিল্ডের মান! = হ্যাঁ):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

সম্মিলিত ক্যোয়ারী:

আমি এটির সাহায্যের জন্য কোডেক্সের দিকে চেয়েছিলাম , তবে নিম্নলিখিত কোয়েরিটি কার্যকর হয় না:

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

সম্মিলিত ক্যোয়ারিতে আমি কী ভুল করছি?

[আপডেট]: সুতরাং এখন যে 3.1 প্রকাশিত হয়েছে, উপরের সম্মিলিত ক্যোয়ারী এখনও কাজ করে না। আমি ফলাফলগুলি পাই, কেবল সঠিকভাবে বাছাই করা হয়নি।

[আপডেট]: var_dump($wp_query->request)নিম্নলিখিতটি দেয়:
string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"


3
আপনি কি ওয়ার্ডপ্রেস ৩.১ ব্যবহার করছেন? meta_queryপ্যারামিটার 3.1 নতুন হয়, কারণে খুব শীঘ্রই মুক্তি পেতে, কিন্তু বর্তমান স্থিতিশীল সংস্করণ এখনো 3.0.5, এই পরামিতি ছাড়া।
— জান ফ্যাব্রি

এর ... ঠিক আছে, তাহলে সম্ভবত তাই হবে। 3.0.5 এ কাজ করার কোনও উপায়?
— gillespieza

মিলজেঙ্কোর সবচেয়ে ভাল উত্তর আছে আপনার নিজের পরিবর্তে তাকে গ্রহণ করা উচিত।
— হুগো

উত্তর:


9

ফিল্টারিং বিকল্পগুলির সাথে 'মেটা_কোয়ারি' ব্যবহার করে এবং অর্ডার অংশের জন্য, কেবল নীচের প্যারামিটারগুলি যুক্ত / সংশোধন করে আপনি কন্টেন্টটি ফিল্টার করতে ক্যোরিটি ব্যবহার করতে পারেন:

  • 'অর্ডারবাই' => 'মেটা_ভ্যালু'
  • 'মেটা_কি' => 'অবস্থান_সামান্য 1_ মূল্য'
  • 'অর্ডার' => 'এএসসি'

    $wp_query = new WP_Query( array (
        'post_type'      => 'listing',
        'posts_per_page' => '9',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'       => 'gateway_value',
                'value'     => 'Yes',
                'compare'   => '!='
            )
        ),
        'orderby'  => 'meta_value',            // this means we will be using a selected 
                                               // meta field to order
    
        'meta_key' => 'location_level1_value', // this states which meta field 
                                               // will be used in the ordering, 
                                               // regardless of the filters
        'order'    => 'ASC',
        'paged'    => $paged
        )
    );

2

ঠিক যেমন জানুয়ারী নতুন ওয়ার্ডপ্রেস ৩.১ এ বলেছে আপনি ব্যবহার করতে পারেন meta_queryতবে এটি বের না হওয়া পর্যন্ত আপনি অর্ডারবাই এবং আপনার লুপের ভিতরে ফিল্টার করতে আপনার প্রথম ক্যোয়ারীটি ব্যবহার করতে পারেন:

 Global $my_query;
$my_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );
while ($my_query->have_posts){
    $my_query->the_post();
              //do your loop stuff
} 

এবং এই ফাংশন.এফপি এই কোড যুক্ত করুন

   //join filter
         add_filter('posts_join', 'listing_join_865' );
         function listing_join_865($join){
Global$ my_query;            
if ('listing' = $my_query->query['post_type']){
                $restriction1 = 'gateway_value';
                return $join .="
                LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                $wpdb->posts.ID = $restriction1.post_id
                AND $restriction1.meta_key = '$restriction1'
                )";
             }else {
                return $join;
            }
         }
         //where filter
         add_filter('posts_where', 'listing_where_865' );
         function listing_where_865($where){
             global $my_query;
            if ('listing' = $my_query->query['post_type']){
                return $where.= " AND $restriction1.meta_value != 'yes'";
            }else{
                return $where;
            }
         }

এখন এটি কাজ করা উচিত।


এর জন্য ধন্যবাদ. এটি কাজ করে, আমার এই বিজোড় পার্শ্ব প্রতিক্রিয়া ব্যতীত আমার পেজিংটি আরও সঠিকভাবে কাজ করে না। প্রতি পৃষ্ঠায় 9 এর পরিবর্তে, আমার গ্রিডে আমার "ফাঁকা স্পট" রয়েছে যেখানে কাস্টম পোস্টগুলি যে gateway_value == "Yes"শর্ত ছাড়াই থাকত ... এটি কীভাবে ঠিক করবেন সে সম্পর্কে কোনও ধারণা?
— gillespieza

হ্যাঁ এই পেজিংয়ের মধ্যে গোলমাল হবে তাই আমার আশেপাশের একমাত্র উপায়টি একটি কাস্টম এসকিএল কোয়েরি হবে, আমাকে কয়েক মিনিট দিন।
— বেন্টারনেট

চিন্তা করবেন না - আমি কেবল দ্বিতীয় কোয়েরিটি ব্যবহার করব এবং 3.1 প্রকাশ না হওয়া অবধি ওয়ার্ডপ্রেস.আর.
— এক্সটেন্ড

বাঁধ, সমাধান খুঁজে পাওয়ার পরে আপনার মন্তব্যটি দেখতে আমি ঠিক এখনই ফিরে এসেছি। যাইহোক এটি ভবিষ্যতের জিজ্ঞাসকদের জন্য এখানে।
— বেন্টারনেট

1
@ t31os - আমি সাধারণত তা করি তবে আমার সেল ফোন থেকে উত্তর দেওয়ার সময় না when
— বেন্টারনেট

1

আমার নিজের প্রশ্নের উত্তর দেওয়ার জন্য দুঃখিত:

[Http://core.trac.wordpress.org/ticket/15031 +11] দেখে মনে হচ্ছে এটি একটি পরিচিত সমস্যা। আমি এটি ব্যবহার করে এটি ঠিক (হ্যাক?) post_filterঠিক করেছি (ঠিক একই উত্তরটির সন্ধানকারী যে কারও রেফারেন্সের জন্য):

ফাংশন.এফপি-তে ###

add_filter('posts_orderby', 'EV_locationl1' );
function EV_locationl1 ($orderby) {
    global $EV_locationl1_orderby;
    if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
    return $orderby;
}

টেমপ্লেট ফাইলে সংশোধিত wp_query ###

$EV_locationl1_orderby = " mt1.meta_value ASC";

$wp_query = new WP_Query( array (
    'post_type' => 'listing',
    'posts_per_page' => '9',
    'post_status' => 'publish',
    'meta_query' => array(
            array(
                    'key' => 'gateway_value',
                    'value' => 'Yes',
                    'compare' => '!='
                    ),
            array(
                    'key' => 'location_level1_value'
            )
        ),
    'order' => $EV_locationl1_orderby,
    'paged' => $paged
    ));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.