Wordpress Rest API необязательный параметр конечной точки

15

Можно ли использовать register_rest_route()с дополнительными параметрами в URL?

Допустим, маршрут зарегистрирован таким образом:

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

Теперь можно выполнить вызов API по URL-адресу, например / wp-json / api / animals / 15 , но есть ли способ объявить параметр необязательным, чтобы также перехватить маршрут, например / wp-json / api / animals / .

Я также попытался объявить маршрут, как показано ниже, но безуспешно:

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

Вы можете объявить другой маршрут без параметра или использовать параметры GET, но есть ли способ сделать это уже в register_rest_route()?

Спасибо за ваши предложения.

rozklad
источник

Ответы:

18

Вы должны поместить именованные параметры регулярного выражения маршрута в необязательную группу захвата:

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

Второй параметр - это просто регулярное выражение, поэтому вы можете использовать обычную логику регулярного выражения, чтобы сделать его более сложным

Никола Пелучетти
источник
3

Может быть способ сделать это одним register_rest_routeвызовом функции, я не знаю, как это сделать, и это было бы идеально. Однако дублирование register_rest_routeвызова функции в подключенном методе будет делать то, что вы хотите.

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

В методе get_animals вы хотите иметь условия, которые обрабатывают каждый случай. Один для, если установлен idаргумент arg, и резервный проверяет наличие $_GETпеременных.

jackreichert
источник