WordPress REST API 让开发者可以把 WordPress 当作纯后端来使用,用 Vue、React 或移动端应用消费数据。但在实际项目中,仅仅使用默认的公开 API 是不够的。你通常需要两类额外功能:一是认证机制,让前端应用可以安全地登录和操作私有数据;二是自定义端点,提供默认 API 中不包含的业务数据。

REST API 的认证是前后端分离开发中必须解决的核心问题。WordPress 默认支持 Cookie 认证(适用于同源的后台管理)和 OAuth 认证(适用于第三方应用)。但对于前后端分离的前端应用,最常用的方案是 JWT(JSON Web Token)认证。

JWT 认证的流程是这样的:前端通过用户名和密码向服务端请求登录,服务端验证后生成一个包含用户信息的加密令牌,返回给前端。前端在后续请求中携带这个令牌,服务端解码验证后就知道当前用户是谁。JWT 的好处是无状态,服务端不需要存储会话信息,适合分布式部署。

在 WordPress 中实现 JWT 认证可以使用 JWT Authentication for WP REST API 这个插件。安装配置后,它会为 REST API 增加一个 /wp-json/jwt-auth/v1/token 端点,用于获取令牌。前端登录时 POST 用户名和密码到这个端点,获得令牌后保存在 localStorage 或 Cookie 中,后续每个请求在 Authorization 头中带上 Bearer 令牌 即可。

自定义端点是另一个高频需求。默认 REST API 提供了文章、页面、分类、评论等核心数据的接口,但你的项目中一定会有一些默认接口无法覆盖的业务。比如你想获取“当前用户最近的订单列表”,或者“某篇热销商品的详细统计数据”,这些都需要通过自定义端点来实现。

注册自定义端点使用 register_rest_route 函数,通常在 rest_api_init 钩子中执行:

add_action('rest_api_init', 'register_custom_api_routes');
function register_custom_api_routes() {
    register_rest_route('my/v1', '/recent-orders/', array(
        'methods' => 'GET',
        'callback' => 'get_recent_orders',
        'permission_callback' => function() {
            return is_user_logged_in();
        }
    ));
}

function get_recent_orders($request) {
    $user_id = get_current_user_id();
    $orders = wc_get_orders(array(
        'customer' => $user_id,
        'limit' => 10,
        'orderby' => 'date',
        'order' => 'DESC'
    ));
    $data = array();
    foreach ($orders as $order) {
        $data[] = array(
            'id' => $order->get_id(),
            'total' => $order->get_total(),
            'status' => $order->get_status(),
            'date' => $order->get_date_created()->date('Y-m-d H:i:s')
        );
    }
    return new WP_REST_Response($data, 200);
}

这个例子注册了一个 /my/v1/recent-orders/ 端点,只允许登录用户访问,返回当前用户最近的 10 个订单。permission_callback 是安全的关键,它控制谁能访问这个端点。对于需要管理员权限的端点,可以改为 current_user_can('manage_options')

自定义端点支持多种 HTTP 方法:GET 用于获取数据,POST 用于创建数据,PUT 或 PATCH 用于更新数据,DELETE 用于删除数据。在注册时指定 methods 参数即可。对于 POST 请求,你可以通过 $request->get_params() 获取参数,用 $request->get_json_params() 获取 JSON body。

REST API 的响应格式需要规范化。建议所有自定义端点返回统一的格式,至少包含 successdatamessage 三个字段。失败时返回合适的 HTTP 状态码,比如 400(参数错误)、401(未认证)、403(无权限)、404(资源不存在)。WordPress 的 WP_REST_Response 和 WP_Error 可以帮你构建标准响应。

性能方面,自定义端点中尽量避免在循环中执行复杂查询。如果数据量较大,分页是必要的。REST API 默认支持 page 和 per_page 参数,你可以在自定义端点的参数定义中声明支持这些参数:

'args' => array(
    'page' => array(
        'default' => 1,
        'sanitize_callback' => 'absint'
    ),
    'per_page' => array(
        'default' => 20,
        'sanitize_callback' => 'absint'
    )
)

对于需要频繁调用的端点,启用对象缓存是很好的优化手段。在 get_recent_orders 函数中,可以用 wp_cache_get 和 wp_cache_set 缓存结果,减少数据库重复查询。

REST API 在开发前后端分离应用时是不可或缺的部分。掌握认证机制和自定义端点的开发,你就能把 WordPress 改造为灵活的数据枢纽,为各种前端应用提供支持。