Parâmetro opcional do ponto de extremidade personalizado da API do Wordpress Rest


15

É possível usar register_rest_route()com parâmetros opcionais em url?

Digamos que a rota esteja registrada desta maneira:

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

Agora é possível executar chamadas api em url como / wp-json / api / animals / 15 , mas existe uma maneira de declarar o parâmetro como opcional para também pegar rota como / wp-json / api / animals / .

Eu também tentei declarar a rota como abaixo, mas sem sucesso:

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

Você pode declarar outra rota sem o parâmetro ou utilizar os parâmetros GET, mas já existe uma maneira de fazer isso no register_rest_route()?

Obrigado por suas sugestões.

Respostas:


18

Você deve colocar os parâmetros nomeados da regex de rota em um grupo de captura opcional:

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

O segundo parâmetro é simplesmente uma regex, portanto, você pode usar a lógica normal de regex para torná-la mais complexa


3

Pode haver uma maneira de fazer isso com uma register_rest_routechamada de função, eu não sei como fazer isso e seria o ideal. No entanto, duplicar a register_rest_routechamada de função no método viciado fará o que você deseja.

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'
    ],
] );

É o método get_animals que você deseja ter condições para lidar com cada caso. Um para se o idargumento estiver definido e o fallback verificará $_GETvariáveis.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.