Requête WP REST API v2 par plusieurs méta-clés


9

En utilisant la v2 de l'API REST, je souhaite interroger certains messages par plusieurs méta-clés. Avec la v1, j'ai pu formater l'URL comme &filter[meta_value][month]=12&[meta_value][year]=2015cela a fonctionné (après avoir exposé les méta-valeurs à l'API).

Maintenant, avec v2, je ne peux que faire fonctionner cela en utilisant les méthodes répertoriées sur ce fil GitHub: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805

Fondamentalement, a ajouté les champs méta en utilisant le rest_query_varsfiltre comme:

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

Avec cela, je peux filtrer par une méta-clé en utilisant une URL comme wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on.

Cependant, il semble que la seule façon de filtrer sur plusieurs métadonnées est d'écrire un filtre personnalisé. Quelqu'un pourrait-il m'orienter dans la bonne direction?

Réponses:


4

L'ajout d'un point de terminaison personnalisé est assez simple.

J'ai également modifié l'URL pour ressembler davantage à

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

comment puis-je joindre l'image en vedette sur cette réponse?
Shinya Koizumi


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.