无法通过WordPress REST API更新自定义用户书签元数据
嘿,我来帮你捋捋这个基于WordPress REST API实现用户书签功能的思路~ 你的register_rest_field注册字段的方向是对的,咱们把细节补全,还要注意权限和数据验证这些关键问题:
实现WordPress用户书签的REST API字段
先把你已经写的注册代码放出来,方便后续分析:
function handle_user_bookmarks() { register_rest_field( 'user', 'bookmarks', array( 'get_callback' => array( $this, 'get_user_bookmarks' ), 'update_callback' => array( $this, 'add_user_bookmarks' ), 'schema' => null )); }
假设这段代码是在类中实现的,所以用了array($this, ...)的回调方式,这个没问题。接下来咱们把两个核心回调函数补全,并加上必要的校验逻辑:
1. 获取用户书签的回调函数get_user_bookmarks
这个函数负责从用户元数据中读取书签,重点要做权限校验,确保用户只能查看自己的书签(管理员例外):
function get_user_bookmarks( $user, $field_name, $request ) { // 权限检查:普通用户只能看自己的书签,管理员可查看所有 if ( get_current_user_id() !== $user['id'] && !current_user_can('manage_options') ) { return new WP_Error( 'rest_forbidden', '你没有权限查看此用户的书签', array( 'status' => 403 ) ); } // 从用户元数据取出书签,默认返回空数组避免报错 $bookmarks = get_user_meta( $user['id'], 'user_bookmarks', true ); return empty( $bookmarks ) ? array() : $bookmarks; }
2. 更新用户书签的回调函数add_user_bookmarks
这个函数处理收藏/取消收藏的逻辑,同样要做权限校验,还要验证传入的数据格式:
function add_user_bookmarks( $value, $user, $field_name ) { // 权限检查:只能修改自己的书签 if ( get_current_user_id() !== $user->ID ) { return new WP_Error( 'rest_forbidden', '你没有权限修改此用户的书签', array( 'status' => 403 ) ); } // 验证数据格式:书签应该是内容ID组成的数组 if ( !is_array( $value ) ) { return new WP_Error( 'rest_invalid_param', '书签数据必须是数组格式', array( 'status' => 400 ) ); } // 去重处理,避免重复收藏同一内容 $unique_bookmarks = array_unique( $value ); // 更新用户元数据 update_user_meta( $user->ID, 'user_bookmarks', $unique_bookmarks ); return $unique_bookmarks; }
几个必注意的细节
- 权限验证不能少:REST API开放接口必须做权限校验,不然会出现越权访问的安全问题。
- Schema优化:你现在把
schema设为null,如果想让API文档更清晰,可以补充字段定义:'schema' => array( 'description' => '用户收藏的内容ID数组', 'type' => 'array', 'items' => array( 'type' => 'integer' ), 'context' => array( 'view', 'edit' ) ) - 钩子挂载:别忘了把
handle_user_bookmarks挂载到rest_api_init钩子上,不然字段注册不会生效:add_action( 'rest_api_init', array( $this, 'handle_user_bookmarks' ) );
前端调用参考
当用户点击“收藏”按钮时,可以用fetch发送PUT请求更新书签:
// 假设当前用户ID为123,要收藏的内容ID是456 fetch('/wp-json/wp/v2/users/123', { method: 'PUT', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': wpApiSettings.nonce // 必须带上WP的验证nonce }, body: JSON.stringify({ bookmarks: [...现有书签数组, 456] // 先GET获取现有书签再追加,避免覆盖 }) }) .then(response => response.json()) .then(data => console.log('书签更新成功:', data.bookmarks)) .catch(error => console.error('更新失败:', error));
内容的提问来源于stack exchange,提问作者grazdev
相关产品推荐
相关产品推荐

