You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:57:52