Truy vấn WP REST API v2 bằng nhiều khóa meta


9

Sử dụng v2 của API REST, tôi muốn truy vấn một số bài đăng bằng nhiều khóa meta. Với v1, tôi có thể định dạng url như thế &filter[meta_value][month]=12&[meta_value][year]=2015và nó đã hoạt động (sau khi hiển thị các giá trị meta cho API).

Bây giờ với v2, tôi chỉ có thể làm việc này bằng cách sử dụng các phương thức được liệt kê trên chuỗi GitHub này: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805

Về cơ bản, đã thêm các trường meta bằng cách sử dụng rest_query_varsbộ lọc như:

add_filter( 'rest_query_vars', 'flux_allow_meta_query' ); function flux_allow_meta_query( $valid_vars ) { $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value', 'meta_compare' ) ); return $valid_vars; }

Cùng với đó, tôi có thể lọc theo một khóa meta bằng cách sử dụng url như thế nào wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on.

Tuy nhiên, có vẻ như cách duy nhất để lọc trên nhiều khóa meta là viết bộ lọc tùy chỉnh. Ai đó có thể chỉ cho tôi đi đúng hướng làm điều đó?

Câu trả lời:


4

Thêm một điểm cuối tùy chỉnh là khá đơn giản.

Tôi cũng đã sửa đổi url để trông giống hơn

http://example.com/wp-json/namespace/v2/posts?filter[meta_value][month]=12&filter[meta_value][year]=2015

function wp_json_namespace_v2__init()
{

    // create json-api endpoint

    add_action('rest_api_init', function () {

        // http://example.com/wp-json/namespace/v2/posts?filter[meta_value][month]=12&filter[meta_value][year]=2015

        register_rest_route('namespace/v2', '/posts', array (
            'methods'             => 'GET',
            'callback'            => 'wp_json_namespace_v2__posts',
            'permission_callback' => function (WP_REST_Request $request) {
                return true;
            }
        ));
    });

    // handle the request

    function wp_json_namespace_v2__posts($request)
    {
        // json-api params

        $parameters = $request->get_query_params();

        // default search args

        $args = array(
            'post_type'      => 'post',
            'post_status'    => 'publish',
            'numberposts'    => -1,
            // limit to only ids
            // 'fields'      => 'ids', 
        );

        // check the query and add valid items

        if (isset($parameters['filter']['meta_value'])) {
            foreach ($parameters['filter']['meta_value'] as $key => $value) {
                switch ($key) {

                    case 'month':
                        if (is_numeric($value))
                            $args['monthnum'] = $value;
                        break;

                    case 'year':
                        if (is_numeric($value))
                            $args['year'] = $value;
                        break;
                }
            }
        }

        // run query

        $posts = get_posts($args);

        // return results

        $data = array(
            'success' => true,
            'request' => $parameters,
            'count' => count($posts),
            'posts' => $posts,
        );

        return new WP_REST_Response($data, 200);
    }

    flush_rewrite_rules(true); // FIXME: <------- DONT LEAVE ME HERE
}

add_action('init', 'wp_json_namespace_v2__init');

Làm thế nào tôi có thể đính kèm hình ảnh đặc trưng trên phản ứng này?
Shinya Koizumi


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.