API REST de WordPress - parámetro opcional en endpoint personalizado

26 ene 2017, 15:52:26
Vistas: 25.4K
Votos: 24

¿Es posible usar register_rest_route() con parámetros opcionales en la URL?

Digamos que la ruta está registrada de esta manera:

register_rest_route( 'api', '/animals/(?P<id>\d+)', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals',
   'args' => [
        'id'
    ],
] );

Ahora es posible realizar una llamada a la API en una URL como /wp-json/api/animals/15, pero ¿hay alguna manera de declarar el parámetro como opcional para también capturar rutas como /wp-json/api/animals/?

También intenté declarar la ruta como se muestra a continuación, pero sin éxito:

/animals/(?P<id>\d+)?

Puedes declarar otra ruta sin el parámetro o utilizar parámetros GET, pero ¿hay alguna manera de hacer esto directamente en register_rest_route()?

Gracias por sus sugerencias.

0
Todas las respuestas a la pregunta 2
0
37

Deberías colocar los parámetros nombrados de la expresión regular de la ruta en un grupo de captura opcional:

register_rest_route( 'api', '/animals(?:/(?P<id>\d+))?', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals',
   'args' => [
        'id'
    ],
] );

El segundo parámetro es simplemente una expresión regular, por lo que puedes usar lógica de expresiones regulares normal para hacerla más compleja

20 mar 2018 23:26:30
0

Puede que exista una forma de hacerlo con una sola llamada a la función register_rest_route, no sé cómo hacerlo y sería lo ideal. Sin embargo, duplicar la llamada a la función register_rest_route en el método enganchado hará lo que deseas.

register_rest_route( 'api', '/animals/', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals'
] );

register_rest_route( 'api', '/animals/(?P<id>\d+)', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals',
   'args' => [
        'id'
    ],
] );

En el método get_animals deberás incluir condiciones que manejen cada caso. Una para cuando el argumento id esté definido, y un respaldo que verifique las variables $_GET.

25 jun 2017 22:59:17