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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:35:27