WP REST API 2 के साथ कई कस्टम फ़ील्ड फ़िल्टर करना


14

मैं और संबंध के साथ कई acf कस्टम फ़ील्ड के आधार पर पदों को फ़िल्टर करना चाहता हूं। कुछ इस तरह:

$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 फ़िल्टर में कैसे बदल सकता हूँ?


इस पोस्ट को देखें और अपने फंक्शन को बनाने की कोशिश करें। wordpress.stackexchange.com/questions/169408/…
emilushi

जवाबों:


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

जो, यदि आप पठनीय चाहते हैं, तो आप क्रोम टूल्स का उपयोग कर सकते हैं और 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

यहाँ मैं एक परीक्षण है जो लोकलहोस्ट पर बनाया गया है:

सुरक्षा कारणों से WP Api पर मेटा क्वेरी की अनुमति नहीं है, सबसे पहले आपको जो करना है, वह है कि meta_query को अपने वर्डप्रेस थीम पर इस फ़ंक्शन को जोड़कर अनुमत rest_query में जोड़ें। 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' );

उसके बाद आपको दूसरी वेबसाइट पर इस फ़ंक्शन का उपयोग करके html क्वेरी बनाने की आवश्यकता होगी जो कि वर्डप्रेस वेबसाइट से डेटा प्राप्त करेगी

$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

यदि आप हमें अपना लाइव वेबसाइट URL प्रदान कर सकते हैं, तो हम इसे सीधे अपनी वेबसाइट पर पोस्टमैन का उपयोग करके परीक्षण कर सकते हैं, क्योंकि इसे स्थानीयहोस्ट या किसी भी मौजूदा वर्डप्रेस साइट पर परीक्षण करने के लिए उत्पाद कस्टम पोस्ट प्रकार बनाने और मेटा फ़ील्ड आदि आदि को जोड़ने की आवश्यकता होगी!


आपके उत्तर के लिए धन्यवाद, लेकिन मैंने प्रश्न के साथ पोस्टमैन पर प्रश्न के रूप में परीक्षण किया है और यह काम नहीं किया।
मिन्ट्री

@ मैंने समाधान पर कुछ सुधार किए हैं, फ़िल्टर मान आपके क्वेरी तर्क के समान हैं, जिसमें कस्टम पोस्ट प्रकार शामिल हैं जो पिछले समाधान में निर्दिष्ट नहीं थे।
एमिलुशी

हमारे पास productवर्गीकरण नहीं है । यह बहुत अच्छा काम करता है! meta_queryअंदर लपेटने के बारे में नहीं सोचा था filter:)
MinTri

@ मुझे यह सुनकर खुशी हुई। मैंने कल इसके बारे में एक पोस्ट लिखी है, आप इसे साझा करने पर विचार कर सकते हैं :) मेटा फ़ील्ड के साथ वर्डप्रेस रीस्ट एपीआई
एमिलुशी

1
कुछ AWS सर्वर पर, एक सरणी के रूप में [] का उपयोग करके कुछ चीजें, अनुरोध को मार देंगी। आपको केवल सुरक्षित रहने के लिए सरणी () का उपयोग करना चाहिए और उन लोगों के लिए जो कॉपी / पेस्ट कर सकते हैं। इसके अलावा, क्या यह सीपीटी उत्पाद या केवल वर्गीकरण का समर्थन करता है? और अंत में, क्या आपको मेटा_क्वेरी को सैनिटाइज करने की आवश्यकता है? यह देखते हुए कि इसे खींचा गया था, क्या आप किसी उपयोगकर्ता की आपूर्ति को स्वीकार करके सुरक्षा जोखिम चलाते हैं?
jagup

1

आप इसे रेस्ट एपीआई की तरह कर सकते हैं (यह मेरी पोस्ट फिल्टर है)

    $ paged = (get_query_var ('paged'))? get_query_var ('पृष्ठांकित'): 1;
$ args = सरणी (
        'paged' => $ paged,
        'ऑर्डरबी' => 'तिथि', // сортировка по дате у нас будет в любом случае (но в м мжжтете изменик / доработать >то)
        'ऑर्डर' => 'DESC',
    );

    // созда см массив $ args ['meta_query'] если указана хотя бы одна цена или отмечен чекбокс
    if (isset ($ _GET ['price_min']) || isset ($ _GET ['price_max']) || isset ($ _GET ['type']))
        $ args ['meta_query'] = array ('रिलेशन' => 'AND'); // और значит все условия meta_query должны выполняться


    अगर ($ प्रकार) {
        $ args ['meta_query'] [] = array (
            'कुंजी' => 'प्रकार',
            'मान' => $ प्रकार,
        );
    };

    अगर ($ योजना) {
        $ args ['meta_query'] [] = array (
            'कुंजी' => 'योजना',
            'मूल्य' => $ योजना,
        );
    };

    अगर ($ room_num) {
        $ args ['meta_query'] [] = array (
            'कुंजी' => 'room_num',
            'मान' => $ room_num,
        );
    };

    अगर ($ etage) {
        $ args ['meta_query'] [] = array (
            'की' => 'एटेज',
            'मान' => $ etage,
        );
    };  

    अगर ($ price_min || $ price_max) {
        $ args ['meta_query'] [] = array (
            'कुंजी' => 'मूल्य',
            'मान' => सरणी ($ price_min, $ price_max),
            'टाइप' => 'न्यूमेरिक',
            'तुलना' => 'बेटविन'
        );
    };  

    अगर ($ area_min || $ area_max) {
        $ args ['meta_query'] [] = array (
            'कुंजी' => 'क्षेत्र',
            'मान' => सरणी ($ area_min, $ area_max),
            'टाइप' => 'न्यूमेरिक',
            'तुलना' => 'बेटविन'
        );
    };

1
आपके उत्तर के लिए धन्यवाद, लेकिन मैं वास्तव में REST API v2 के साथ इसे करने के लिए उत्सुक हूं।
मिन्ट्री

ठीक है, मुझे लगता है, मेरा संस्करण अच्छा है, लेकिन यदि आप चाहते हैं ... तथ्य यह है कि मेरा तरीका मापदंडों तक सीमित नहीं है!
इगोर फेडोरोव

1

वर्डप्रेस 4.7 में filterतर्क को हटा दिया गया है।

आप Wordpress टीम द्वारा प्रदान किए गए इस प्लगइन को स्थापित करके इसे फिर से सक्रिय कर सकते हैं । उसके बाद ही आप अन्य उत्तरों में प्रस्तावित समाधानों में से किसी एक का उपयोग कर सकते हैं।

मैं प्लगइन स्थापित किए बिना ही ऐसा करने के लिए एक समाधान नहीं मिला है, अभी तक।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.