Consulta WP REST API v2 por múltiples meta claves

9

Usando v2 de la API REST, quiero consultar algunas publicaciones con múltiples meta claves. Con v1 pude formatear la url como &filter[meta_value][month]=12&[meta_value][year]=2015y funcionó (después de exponer los meta valores a la API).

Ahora con v2, solo puedo hacer que esto funcione usando los métodos enumerados en este hilo de GitHub: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805

Básicamente, agregó los metacampos usando el rest_query_varsfiltro 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; }

Con eso, puedo filtrar por una meta tecla usando una URL como wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on.

Sin embargo, parece que la única forma de filtrar en múltiples meta claves es escribir un filtro personalizado. ¿Podría alguien señalarme en la dirección correcta para hacer eso?

Trevan Hetzel
fuente

Respuestas:

4

Agregar un punto final personalizado es bastante sencillo.

También modifiqué la url para que parezca más

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');
jgraup
fuente
¿Cómo puedo adjuntar la imagen destacada en esta respuesta?
Shinya Koizumi