Permintaan WP REST API v2 dengan beberapa kunci meta


9

Menggunakan v2 API REST, saya ingin menanyakan beberapa posting dengan beberapa kunci meta. Dengan v1 saya bisa memformat url like &filter[meta_value][month]=12&[meta_value][year]=2015dan berfungsi (setelah mengekspos nilai meta ke API).

Sekarang dengan v2, saya hanya bisa menjalankan ini dengan menggunakan metode yang tercantum di utas GitHub ini: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805

Pada dasarnya, tambahkan bidang meta menggunakan rest_query_varsfilter seperti:

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; }

Dengan itu, saya bisa memfilter dengan satu meta key menggunakan url like wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on.

Namun, sepertinya satu-satunya cara untuk memfilter pada beberapa kunci meta adalah dengan menulis filter khusus. Bisakah seseorang mengarahkan saya ke arah yang benar untuk melakukan itu?

Jawaban:


4

Menambahkan titik akhir khusus cukup mudah.

Saya juga memodifikasi url agar terlihat lebih seperti

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');

bagaimana saya bisa melampirkan gambar unggulan pada respons ini?
Shinya Koizumi


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.