自定义WordPress BuddyPress API端点返回空响应如何排查
问题排查与解决方案
核心问题原因
你代码的核心问题是路由参数名和取值键名不匹配:
你在register_rest_route中定义路径参数的捕获规则是(?P<id>\d+),这意味着REST请求传入的参数会被存到$data['id']中,但你在favourite_members函数里错误地读取了不存在的$data['user_id'],导致传入SQL的用户ID为空,自然查询不到结果。
修正后的完整代码
/*** Grab favourite members for a specified user ***/ function favourite_members( $data ) { // 正确读取路由中定义的id参数 $favourites = get_favourite_members(array( 'user_id' => $data['id'], ) ); if ( empty( $favourites ) ) { // 按WordPress REST规范返回标准错误,便于前端处理 return new WP_Error( 'no_favourites', '该用户暂无收藏成员', array( 'status' => 404 ) ); } return $favourites; } function get_favourite_members( $data ){ global $wpdb; // 动态获取表前缀,适配不同站点的自定义前缀配置 $table_name = $wpdb->prefix . 'my_favourite_members'; $sql = $wpdb->prepare( "SELECT member_id FROM {$table_name} WHERE user_id = %d", $data['user_id'] ); return $wpdb->get_results( $sql ); } /*** Register register_rest_route ***/ add_action( 'rest_api_init', function () { register_rest_route( 'myapi/v1', '/favouritemembers/(?P<id>\d+)', array( 'methods' => 'GET', 'callback' => 'favourite_members', // 参数合法性校验 'args' => array( 'id' => array( 'validate_callback' => function($param) { return is_numeric( $param ); }, 'required' => true ) ), // 权限校验,可根据业务需求调整,允许公开访问可直接返回true 'permission_callback' => function () { return current_user_can( 'read' ); } ) ); } );
额外优化说明
- 移除了硬编码的表前缀
wp_,改用$wpdb->prefix动态获取,兼容不同WordPress站点的自定义表前缀配置 - 新增参数校验逻辑,拦截非法格式的ID请求
- 空查询结果按WordPress REST API规范返回标准错误对象,而非
null,更便于前端统一处理响应 - 新增权限校验位,可根据业务需求调整是否需要登录、是否有权限查看对应用户的收藏列表
内容的提问来源于stack exchange,提问作者KDev
相关产品推荐
相关产品推荐

