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


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.