WordPress REST API端点如何支持可选ID及多请求场景?
解决WordPress REST API路由匹配问题:同时支持单篇/多篇文章请求
你的问题核心确实在路由的正则表达式上——当前的规则/posts/(?P<id>[^/]+)?强制要求/posts/后面才能跟上可选的ID,这就导致不带末尾斜杠的/posts或/posts?xxx请求完全匹配不上这个路由,自然返回rest_no_route错误。下面给你两种靠谱的解决思路:
方案1:注册两个独立路由(推荐,逻辑更清晰)
WordPress REST API允许你为同一个回调函数注册多个路由,这样可以明确区分「批量文章」和「单篇文章」的请求场景,后续维护起来也更方便。
// 匹配不带ID的批量请求:/posts 或 /posts?fields=... register_rest_route('wp-api', '/posts', [ 'methods' => [WP_REST_Server::READABLE, WP_REST_Server::CREATABLE], 'callback' => function ($request) { return MyClass::wp_api_get_posts($request); }, ]); // 匹配带ID的单篇请求:/posts/123 或 /posts/123?thumbnail_size=... register_rest_route('wp-api', '/posts/(?P<id>[^/]+)', [ 'methods' => [WP_REST_Server::READABLE, WP_REST_Server::CREATABLE], 'callback' => function ($request) { return MyClass::wp_api_get_posts($request); }, ]);
两个路由各司其职,回调函数复用同一个,完全覆盖你提到的4种请求场景。
方案2:用正则分组让斜杠+ID整体可选
如果你偏好只用一个路由搞定所有情况,可以调整正则表达式,把「斜杠+ID」做成一个可选的非捕获分组,确保两者要么同时存在,要么都不存在。
register_rest_route('wp-api', '/posts(?:/(?P<id>[^/]+))?', [ 'methods' => [WP_REST_Server::READABLE, WP_REST_Server::CREATABLE], 'callback' => function ($request) { return MyClass::wp_api_get_posts($request); }, ]);
这里的(?:/(?P<id>[^/]+))?是关键:(?:...)是非捕获分组,末尾的?表示整个分组可选,这样就能匹配所有4种请求路径了。
后续处理提示
不管用哪种方案,在你的MyClass::wp_api_get_posts方法里,只需要通过$request->get_param('id')判断是否存在ID参数:
- 如果
$id有值,就处理单篇文章的逻辑 - 如果
$id为null,就处理批量文章的逻辑
同时正常读取其他查询参数(比如fields、thumbnail_size)即可,完全不影响参数处理逻辑。
内容的提问来源于stack exchange,提问作者Shwmae
相关产品推荐
相关产品推荐

