ti-enxame.com

Inquerir WP REST API v2 por várias chaves meta

Usando v2 da API REST, estou querendo consultar algumas postagens com as chaves multiple meta. Com v1 eu era capaz de formatar o URL como &filter[meta_value][month]=12&[meta_value][year]=2015 e funcionou (depois de expor os valores meta para a API).

Agora, com v2, só posso fazer isso funcionar usando os métodos listados neste encadeamento do GitHub: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805

Basicamente, adicionamos os meta-campos usando o filtro rest_query_vars como:

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

Com isso, posso filtrar por one meta key usando um URL como wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on.

No entanto, parece que a única maneira de filtrar várias chaves meta é escrever um filtro personalizado. Alguém poderia me apontar na direção certa de fazer isso?

9
Trevan Hetzel

Adicionar um ponto de extremidade personalizado é bastante simples.

Eu também modifiquei o URL para parecer mais

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