自定义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
相关产品推荐
相关产品推荐

