Опциональные параметры в пользовательской конечной точке WordPress Rest API
Возможно ли использовать 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()
?
Спасибо за ваши предложения.

Вам следует поместить именованные параметры регулярного выражения маршрута в необязательную захватывающую группу:
register_rest_route( 'api', '/animals(?:/(?P<id>\d+))?', [
'methods' => WP_REST_Server::READABLE,
'callback' => 'get_animals',
'args' => [
'id'
],
] );
Второй параметр — это просто регулярное выражение, поэтому вы можете использовать стандартную логику регулярных выражений для его усложнения

Возможно, существует способ сделать это с помощью одного вызова функции 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
установлен, и запасной вариант с проверкой переменных $_GET
.
