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

无法通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:09:23