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

自定义WordPress REST API端点无法更新文章内容求助

解决WordPress自定义REST API更新文章内容的问题

你现在的问题很明确——你的回调函数只是把接收到的参数返回了,根本没有执行更新文章内容的核心逻辑!接下来我一步步帮你修改代码,实现真正的文章更新功能:

1. 完善回调函数的核心更新逻辑

WordPress内置了wp_update_post()函数专门用于更新文章,我们需要在回调里调用它,同时必须做好权限验证(这是安全红线,不然任意用户都能修改你的文章)。修改后的回调函数如下:

function wl_post_write( $request ) {
    // 1. 从请求中获取文章ID和新内容
    $post_id = $request->get_param('id');
    $new_content = $request->get_param('content');

    // 2. 权限检查:确保当前登录用户有权限编辑该文章
    if ( !current_user_can('edit_post', $post_id) ) {
        return new WP_Error(
            'rest_forbidden',
            '你没有权限编辑这篇文章',
            ['status' => 403]
        );
    }

    // 3. 验证目标文章是否存在
    $existing_post = get_post($post_id);
    if ( !$existing_post ) {
        return new WP_Error(
            'rest_post_not_found',
            '指定的文章不存在',
            ['status' => 404]
        );
    }

    // 4. 准备更新参数
    $update_args = [
        'ID' => $post_id,
        'post_content' => $new_content,
    ];

    // 5. 执行更新操作
    $updated_post_id = wp_update_post($update_args, true);

    // 6. 处理更新结果:成功返回文章数据,失败返回错误信息
    if ( is_wp_error($updated_post_id) ) {
        return new WP_Error(
            'rest_update_failed',
            $updated_post_id->get_error_message(),
            ['status' => 500]
        );
    }

    // 返回更新后的完整文章数据(方便前端确认)
    return get_post($updated_post_id);
}

2. 优化REST路由的规范(可选但推荐)

从RESTful设计的角度来说,更新资源应该使用PUT或PATCH方法,而不是POST。你可以调整路由的配置,让它更符合规范:

add_action('rest_api_init', function() {
    register_rest_route('wl/v1', 'posts/(?P<id>\d+)', [
        'methods' => WP_REST_Server::EDITABLE, // 等价于支持PUT和PATCH方法
        'callback' =>'wl_post_write',
        // 提前添加权限回调,更严谨地拦截无权限请求
        'permission_callback' => function( $request ) {
            $post_id = $request->get_param('id');
            return current_user_can('edit_post', $post_id);
        }
    ]);
})

对应的JavaScript代码也要把请求方法改成PUT,同时调整路由路径:

var ourPostData = { "content": content }
var updatePost = new XMLHttpRequest();
// 注意这里的请求方法改为PUT,路由路径调整为posts/{id}
updatePost.open("PUT", mySiteData.siteURL + '/wp-json/wl/v1/posts/'+id);
updatePost.setRequestHeader("X-WP-Nonce", mySiteData.nonce);
updatePost.setRequestHeader("Content-Type","application/json;charset=UTF-8");
updatePost.send( JSON.stringify(ourPostData) );

// 建议监听请求完成事件,更准确地获取响应结果
updatePost.onload = function() {
    if (this.status >= 200 && this.status < 400) {
        var response = JSON.parse(this.responseText);
        console.log('文章更新成功:', response);
    } else {
        console.error('更新失败:', this.responseText);
    }
};

3. 关键注意事项

  • 权限验证不能少:current_user_can('edit_post', $post_id)会自动结合当前登录用户的权限进行判断,也可以通过路由的permission_callback提前拦截无权限请求,避免无效的后续操作。
  • 参数获取更省心:因为你设置了Content-Type: application/json,$request->get_param()可以直接获取到JSON里的字段,不用手动解析请求体。
  • 错误处理要清晰:添加详细的错误返回信息,方便前端快速定位问题(比如文章不存在、权限不足、更新失败等场景)。

这样修改后,你的自定义API就能真正实现更新文章内容的功能了,测试一下应该就能看到ID为51的文章内容被正常修改啦!

内容的提问来源于stack exchange,提问作者Brisk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:49:41