如何从WordPress REST API中获取表单对象并处理FormData
如何在WordPress REST API中处理FormData提交的表单数据与文件
嘿,我来帮你搞定这个问题!你已经用AJAX正确设置了FormData提交(包括contentType: false和processData: false,这步很关键),现在只需要在REST端点里用WP_REST_Request提供的专用方法来获取数据就行,不用直接取get_body()。
1. 获取普通表单字段(subject、message)
对于文本类的表单字段,你可以用两种简单的方式获取:
- 用
get_param()方法:
$subject = $request->get_param('subject'); $message = $request->get_param('message');
- 或者直接像数组一样访问:
$subject = $request['subject']; $message = $request['message'];
这两种方式都能安全获取到你提交的文本值。
2. 获取上传的文件
对于FormData里的文件,WordPress的WP_REST_Request专门提供了get_file_param()方法来处理,它会返回一个和PHP原生$_FILES结构类似的数组,包含tmp_name、name、type、size、error这些关键信息。
完整的文件处理流程:
首先获取文件,然后验证上传状态,再用WordPress内置的wp_handle_upload()来安全处理文件上传(不要自己手动移动文件,这个函数会帮你处理权限、文件名冲突等问题):
// 获取上传的文件 $uploaded_file = $request->get_file_param('file'); // 先检查文件是否上传成功 if ($uploaded_file['error'] !== UPLOAD_ERR_OK) { return new WP_Error('upload_error', '文件上传失败,请重试', array('status' => 400)); } // 配置上传参数:跳过表单验证(因为是API提交,不是传统表单) $upload_overrides = array('test_form' => false); // 处理文件上传 $movefile = wp_handle_upload($uploaded_file, $upload_overrides);
整合完整的端点代码
把上面的逻辑整合到你的端点里,还可以加上邮件发送的逻辑,比如:
function test_endpoint(WP_REST_Request $request){ // 1. 获取普通表单字段 $subject = $request->get_param('subject'); $message = $request->get_param('message'); // 2. 处理上传文件 $uploaded_file = $request->get_file_param('file'); if ($uploaded_file['error'] !== UPLOAD_ERR_OK) { return new WP_Error('upload_error', '文件上传失败', array('status' => 400)); } $upload_overrides = array('test_form' => false); $movefile = wp_handle_upload($uploaded_file, $upload_overrides); if ($movefile && !isset($movefile['error'])) { // 文件上传成功,准备发送邮件 $to = '你的收件邮箱@example.com'; $headers = array('Content-Type: text/html; charset=UTF-8'); $attachments = array($movefile['file']); // 用上传后的文件路径作为附件 // 发送邮件 $mail_sent = wp_mail($to, $subject, $message, $headers, $attachments); if ($mail_sent) { return rest_ensure_response(array( 'status' => 'success', 'message' => '邮件和附件发送成功', 'uploaded_file_url' => $movefile['url'] )); } else { return new WP_Error('mail_failed', '邮件发送失败', array('status' => 500)); } } else { return new WP_Error('upload_failed', $movefile['error'], array('status' => 400)); } }
额外注意事项
- 注册端点时,记得设置合适的
permission_callback,确保只有授权用户能访问(比如permission_callback: '__return_true'是测试用,正式环境要换成权限验证逻辑)。 - 你的AJAX配置已经很正确了:
contentType: false、processData: false、enctype: 'multipart/form-data',这些是让jQuery正确处理FormData的必要参数,不用改。
内容的提问来源于stack exchange,提问作者bstras21
相关产品推荐
相关产品推荐

