API REST de WordPress - parámetro opcional en endpoint personalizado
¿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.

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

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
.
