WP REST API 2 দিয়ে একাধিক কাস্টম ক্ষেত্র ফিল্টার করছে


14

আমি এবং সম্পর্কের সাথে একাধিক এসিফ কাস্টম ফিল্ডের উপর ভিত্তি করে পোস্টগুলি ফিল্টার করতে চাই। এটার মতো কিছু:

$args = array(
        'post_type'  => 'product',
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key'     => 'color',
                'value'   => 'blue',
                'compare' => '=',
            ),
            array(
                'key'     => 'price',
                'value'   => array( 20, 100 ),
                'type'    => 'numeric',
                'compare' => 'BETWEEN',
            ),
        ),
    );

আমার আরও ফিল্টারও থাকতে পারে। এগুলিকে কীভাবে REST API 2 ফিল্টারে রূপান্তর করতে পারি?


এই পোস্টটি একবার দেখুন এবং আপনার ফাংশন ওয়ার্ডপ্রেস
স্ট্যাককেচেঞ্জ.কমেসেশনস

উত্তর:


3

এই সমাধান সঙ্গে কাজ করে get_items()/lib/endpoints/class-wp-rest-posts-controller.phpএর v2 WP Rest API


প্রথমত, আপনি GETআর্গুমেন্টগুলি যেমন আপনার জন্য তৈরি করতে চান তেমন করতে চান new WP_Query()। এটি করার সবচেয়ে সহজ উপায়টি হ'ল http_build_query()

$args = array (
    'filter' => array (
        'meta_query' => array (
            'relation' => 'AND',
            array (
                'key'     => 'color',
                'value'   => 'blue',
                'compare' => '=',
            ),
            array (
                'key'     => 'test',
                'value'   => 'testing',
                'compare' => '=',
            ),
        ),
    ),
);
$field_string = http_build_query( $args );

এটি এমন কিছু তৈরি করবে:

filter%5Bmeta_query%5D%5Brelation%5D=AND&filter%5Bmeta_query%5D%5B0%5D%5Bkey%5D=color&filter%5Bmeta_query%5D%5B0%5D%5Bvalue%5D=blue&filter%5Bmeta_query%5D%5B0%5D%5Bcompare%5D=%3D&filter%5Bmeta_query%5D%5B1%5D%5Bkey%5D=test&filter%5Bmeta_query%5D%5B1%5D%5Bvalue%5D=testing&filter%5Bmeta_query%5D%5B1%5D%5Bcompare%5D=%3D

কোনটি, আপনি যদি পঠনযোগ্য চান, আপনি Chrome সরঞ্জামগুলিও ব্যবহার করতে পারেন এবং decodeURIComponent('your-query-here')এটি আপনার JSON রেস্ট API URL এ ফেলে দেওয়ার পরে পড়তে আরও সহজ করতে পারেন :

https://demo.wp-api.org/wp-json/wp/v2/product?filter[meta_query][relation]=AND&filter[meta_query][0][key]=color&filter[meta_query][0][value]=blue&filter[meta_query][0][compare]==&filter[meta_query][1][key]=test&filter[meta_query][1][value]=testing&filter[meta_query][1][compare]==

দ্রষ্টব্য: আপনার কাস্টম পোস্টের ধরণটি ব্যবহার করতে আপনি productআগে রাখবেন?

/wp-json/wp/v2/<custom-post-type>?filter[meta_query]


সুতরাং আপনার কাছে আপনার জিজ্ঞাসা রয়েছে তবে কয়েকটি বিষয় কীভাবে পরিচালনা করতে হবে তা আমাদের WP কে নির্দেশ করতে হবে:

  1. কাস্টম পোস্ট ধরণের জন্য REST সমর্থন যুক্ত করা হচ্ছে product
  2. কোয়েরি আরগসকে অনুমতি দেওয়া হচ্ছে meta_query
  3. পদান্বয় meta_query

// 1) Add CPT Support <product>


function wpse_20160526_add_product_rest_support() {
    global $wp_post_types;

    //be sure to set this to the name of your post type!
    $post_type_name = 'product';
    if( isset( $wp_post_types[ $post_type_name ] ) ) {
        $wp_post_types[$post_type_name]->show_in_rest = true;
        $wp_post_types[$post_type_name]->rest_base = $post_type_name;
        $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller';
    }
}

add_action( 'init', 'wpse_20160526_add_product_rest_support', 25 );


// 2) Add `meta_query` support in the GET request

function wpse_20160526_rest_query_vars( $valid_vars ) {
    $valid_vars = array_merge( $valid_vars, array(  'meta_query'  ) ); // Omit meta_key, meta_value if you don't need them
    return $valid_vars;
}

add_filter( 'rest_query_vars', 'wpse_20160526_rest_query_vars', PHP_INT_MAX, 1 );


// 3) Parse Custom Args

function wpse_20160526_rest_product_query( $args, $request ) {

    if ( isset( $args[ 'meta_query' ] ) ) {

        $relation = 'AND';
        if( isset($args['meta_query']['relation']) && in_array($args['meta_query']['relation'], array('AND', 'OR'))) {
            $relation = sanitize_text_field( $args['meta_query']['relation'] );
        }
        $meta_query = array(
            'relation' => $relation
        );

        foreach ( $args['meta_query'] as $inx => $query_req ) {
        /*
            Array (

                [key] => test
                [value] => testing
                [compare] => =
            )
        */
            $query = array();

            if( is_numeric($inx)) {

                if( isset($query_req['key'])) {
                    $query['key'] = sanitize_text_field($query_req['key']);
                }
                if( isset($query_req['value'])) {
                    $query['value'] = sanitize_text_field($query_req['value']);
                }
                if( isset($query_req['type'])) {
                    $query['type'] = sanitize_text_field($query_req['type']);
                }
                if( isset($query_req['compare']) && in_array($query_req['compare'], array('=', '!=', '>','>=','<','<=','LIKE','NOT LIKE','IN','NOT IN','BETWEEN','NOT BETWEEN', 'NOT EXISTS')) ) {
                    $query['compare'] = sanitize_text_field($query_req['compare']);
                }
            }

            if( ! empty($query) ) $meta_query[] = $query;
        }

        // replace with sanitized query args
        $args['meta_query'] = $meta_query;
    }

    return $args;
}
add_action( 'rest_product_query', 'wpse_20160526_rest_product_query', 10, 2 );

2

লোকালহোস্টে করা একটি পরীক্ষা এখানে দেওয়া হয়েছে:

সুরক্ষার কারণে মেটা ক্যোয়ারী ডাব্লুপি এপি-তে অনুমোদিত নয়, প্রথমে আপনাকে যা করতে হবে তা হল আপনার ওয়ার্ডপ্রেস থিমটিতে এই ফাংশনটি যুক্ত করে meta_query কে অনুমোদিত বিশ্রাম_কোয়ারিতে যুক্ত করা to functions.php

function api_allow_meta_query( $valid_vars ) {

  $valid_vars = array_merge( $valid_vars, array( 'meta_query') );
  return $valid_vars;
}
add_filter( 'rest_query_vars', 'api_allow_meta_query' );

এর পরে আপনার অন্য ওয়েবসাইটটিতে এই ফাংশনটি ব্যবহার করে এইচটিএমএল কোয়েরি তৈরি করতে হবে যা ওয়ার্ডপ্রেস ওয়েবসাইট থেকে ডেটা পাবে

$curl = curl_init();
$fields = array (
  'filter[meta_query]' => array (
    'relation' => 'AND',
      array (
        'key' => 'color',
        'value' => 'blue',
        'compare' => '='
      ),
      array (
        'key' => 'price',
        'value' => array ( 20, 100 ),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
      ),
    ),
  );

$field_string = http_build_query($fields);

curl_setopt_array($curl, array (
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://yourwordpreswebssite.com/wp-json/wp/v2/posts?' . $field_string
  )
);

$result = curl_exec($curl);

echo htmlentities($result);

আমি ক্ষেত্রগুলি অ্যারে পরিবর্তন করি তাই এখন আপনার কোয়েরি যুক্তিগুলির মতো চেহারা। এনকোডেড ক্যোয়ারী স্ট্রিংটি এর মতো দেখবে:

http://yourwordpreswebssite.com/wp-json/wp/v2/posts?filter%5Btaxonomy%5D=product&filter%5Bmeta_query%5D%5Brelation%5D=AND&filter%5Bmeta_query%5D%5B0%5D%5Bkey%5D=color&filter%5Bmeta_query%5D%5B0%5D%5Bvalue%5D=blue&filter%5Bmeta_query%5D%5B0%5D%5Bcompare%5D=%3D&filter%5Bmeta_query%5D%5B1%5D%5Bkey%5D=price&filter%5Bmeta_query%5D%5B1%5D%5Bvalue%5D%5B0%5D=20&filter%5Bmeta_query%5D%5B1%5D%5Bvalue%5D%5B1%5D=100&filter%5Bmeta_query%5D%5B1%5D%5Btype%5D=numeric&filter%5Bmeta_query%5D%5B1%5D%5Bcompare%5D=BETWEEN

ব্যবহার করে urldecode(), যা এক্ষেত্রে হবে: urldecode('http://yourwordpreswebssite.com/wp-json/wp/v2/posts?' . $field_string);আপনার এই জাতীয় URL থাকবে:

http://yourwordpreswebssite.com/wp-json/wp/v2/posts?filter[taxonomy]=product&filter[meta_query][relation]=AND&filter[meta_query][0][key]=color&filter[meta_query][0][value]=blue&filter[meta_query][0][compare]==&filter[meta_query][1][key]=price&filter[meta_query][1][value][0]=20&filter[meta_query][1][value][1]=100&filter[meta_query][1][type]=numeric&filter[meta_query][1][compare]=BETWEEN

আপনি যদি আমাদের আমাদের লাইভ ওয়েবসাইট ইউআরএল সরবরাহ করতে পারেন তবে আমরা এটি সরাসরি আপনার ওয়েবসাইটে পোস্টম্যান ব্যবহার করে পরীক্ষা করতে পারি, কারণ লোকালহোস্ট বা কোনও বিদ্যমান ওয়ার্ডপ্রেস সাইটে এটি পরীক্ষা করতে পণ্য কাস্টম পোস্ট টাইপ তৈরি এবং মেটা ক্ষেত্র ইত্যাদি যুক্ত করতে হবে ইত্যাদি চিয়ার্স!


আপনার উত্তরের জন্য ধন্যবাদ তবে পোস্টম্যানের প্রশ্নের মতো আমি ক্যোয়ারীটি পরীক্ষা করেছি এবং এটি কার্যকর হয়নি।
MinhTri

@ ড্যান আমি সমাধানটিতে কিছু উন্নতি করেছি, ফিল্টার মানগুলি আপনার ক্যোয়ার যুক্তির মতো, পূর্ববর্তী সমাধানে নির্দিষ্ট না হওয়া কাস্টম পোস্ট প্রকার সহ are
এমিলুশি

আমাদের productট্যাক্সোনমি নেই। এটি দুর্দান্ত কাজ করে! meta_queryভিতরে মোড়ানো সম্পর্কে ভাবেন নি filter:)
MinhTri

@ ডান আমি এটি শুনে খুশি। গতকাল আমি এটি সম্পর্কে একটি পোস্ট লিখেছেন, আপনি এটা ভাগ বিবেচনা করতে পারে :) মেটা ক্ষেত্রের সাথে ওয়ার্ডপ্রেস বিশ্রাম এপিআই
এমিলুশি

1
কয়েকটি AWS সার্ভারে কয়েকটি জিনিস, [] অ্যারে হিসাবে ব্যবহার করলে অনুরোধটি হ্রাস পাবে। নিরাপদ থাকতে আপনার কীভাবে অ্যারে () ব্যবহার করা উচিত এবং কীভাবে কপি / পেস্ট করা যায়। এছাড়াও, এটি কি সিপিটি পণ্যকে সমর্থন করে বা কেবল শ্রেণিবিন্যাসকে সমর্থন করে? এবং সবশেষে, আপনার কি মেটা_কিউরিটি স্যানিটাইজ করা দরকার? এটি টানা হয়েছে তা দেখে, আপনি কি কোনও সরবরাহকারী সরবরাহের কিছু গ্রহণ করে সুরক্ষা ঝুঁকিপূর্ণ চালান?
jgraup

1

আপনি এটির মতো রেস্ট এপিআই ছাড়া এটি করতে পারেন (এটি আমার পোস্ট ফিল্টার)

    $ পেজড = (get_query_var ('পেজড'))? get_query_var ('পেজড'): 1;
gs আরোগুলি = অ্যারে (
        'পেজড' => $ পেজড,
        'অর্ডারবাই' => 'তারিখ', // по по дате у нас будет в в любом случае (но вы можете изменить / доработать это)
        'অর্ডার' => 'ডিইএসসি',
    );

    // создаём массив $ আরগস ['মেটা_কোয়ারি'] если указана хотя бы одна цена или отмечен чекбокс
    যদি (isset ($ _GET ['প্রাইস_মিনি']) || || isset ($ _GET ['প্রাইস_ম্যাক্স']) || isset ($ _GET ['টাইপ']))
        gs আরগস ['meta_query'] = অ্যারে ('সম্পর্ক' => 'এবং'); // এবং значит все все মেটা_কোয়ারি должны выполняться полняться


    যদি ($ প্রকার) {
        gs আরগস ['মেটা_কোয়ারি'] [] = অ্যারে (
            'কী' => 'টাইপ',
            'মান' => $ প্রকার,
        );
    };

    যদি ($ পরিকল্পনা) {
        gs আরগস ['মেটা_কোয়ারি'] [] = অ্যারে (
            'কী' => 'পরিকল্পনা',
            'মান' => $ পরিকল্পনা,
        );
    };

    যদি ($ রুম_নুম) {
        gs আরগস ['মেটা_কোয়ারি'] [] = অ্যারে (
            'কী' => 'ঘর_নুম',
            'মান' => $ কক্ষ_নুম,
        );
    };

    যদি ($ মত) {
        gs আরগস ['মেটা_কোয়ারি'] [] = অ্যারে (
            'কী' => 'এটেজ',
            'মান' => $ পরিমাণ,
        );
    };  

    যদি ($ দাম_মিনি || $ মূল্য_ম্যাক্স) {
        gs আরগস ['মেটা_কোয়ারি'] [] = অ্যারে (
            'কী' => 'দাম',
            'মান' => অ্যারে ($ মূল্য_মিনি, $ মূল্য_ম্যাক্স),
            'টাইপ' => 'সংখ্যা',
            'তুলনা' => 'বিটওয়াইন'
        );
    };  

    যদি ($ অঞ্চল_মিনি || $ অঞ্চল_ম্যাক্স) {
        gs আরগস ['মেটা_কোয়ারি'] [] = অ্যারে (
            'কী' => 'অঞ্চল',
            'মান' => অ্যারে ($ অঞ্চল_মিনি, $ এলাকা_ম্যাক্স),
            'টাইপ' => 'সংখ্যা',
            'তুলনা' => 'বিটওয়াইন'
        );
    };

1
আপনার উত্তরের জন্য ধন্যবাদ তবে আমি REST এপিআই v2 দিয়ে এটি সম্পর্কে সত্যই আগ্রহী।
MinhTri

ঠিক আছে, আমি মনে করি, আমার রূপটি ভাল, তবে আপনি যদি চান ... তবে আমার পদ্ধতিটি কেবল পরামিতিগুলির মধ্যে সীমাবদ্ধ নয়!
ইগোর ফেদোরভ

1

ওয়ার্ডপ্রেস ৪.7-তে filterযুক্তিটি সরানো হয়েছে।

আপনি ওয়ার্ডপ্রেস টিমের সরবরাহিত এই প্লাগইনটি ইনস্টল করে এটি পুনরায় সক্রিয় করতে পারেন । তারপরেই আপনি অন্যান্য উত্তরগুলিতে প্রস্তাবিত সমাধানগুলির একটি ব্যবহার করতে পারেন।

আমি এখনও প্লাগইন ইনস্টল না করে এটি করার কোনও সমাধান পাইনি।

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