Consultar WP REST API v2 por varias claves de metadatos

9

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

Ahora con v2, solo puedo hacer que esto funcione con los métodos que se enumeran en este hilo de GitHub: enlace

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

Con eso, puedo filtrar por una meta clave 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 varias claves de metadatos es escribir un filtro personalizado. ¿Alguien podría indicarme la dirección correcta para hacerlo?

    
pregunta Trevan Hetzel 03.12.2015 - 00:01

1 respuesta

5

Agregar un punto final personalizado es bastante sencillo.

También modifiqué la url para que se pareciera más a

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');
    
respondido por el jgraup 17.12.2015 - 03:03

Lea otras preguntas en las etiquetas