如何将多部分表单数据发送到WordPress端点

时间:2021-09-10 作者:Frostbourn

我构建了带有文件上载的自定义React/Gatsby多部分表单,我想将所有表单数据发送到WordPress端点,将文件上载到特定文件夹,并在WordPress后端显示所有数据。

这是我发送数据的方式:

const {
    stepOne,
    stepTwo,
  } = useContext(FormStepProvider)

  const steps = {
    stepOne: stepOne,
    stepTwo: stepTwo,
  }

  const postData = async () => {
    const formData = new FormData()

    formData.append("stepOne", JSON.stringify(stepOne))
    formData.append("stepTwo", stepTwo.file)

    await fetch("https://panel.domain.com/wp-json/test/v1/forms", {
      method: "POST",
      headers: {
        "Content-Type": "multipart/form-data",
      },

      body: formData,
    })
      .then(response => response)
      .then(result => {
        console.log("Success:", result)
      })
      .catch(error => {
        console.error("Error:", error)
      })
  }

  useEffect(() => {
    postData()
    console.log(steps)
  }, [])
这是我得到的回应:enter image description here

这是我的端点:

add_action( \'rest_api_init\', function () {
  register_rest_route( \'test/v1\', \'forms\', array(
    \'methods\' => \'POST\',
    \'callback\' => \'get_formdata_function\',
    \'args\'     => array(),
  ) );
} );

function get_formdata_function(WP_REST_Request $request)
{
    $data = $request->get_body();
    print_r($data);
}
我是WordPress的新手,我想知道做这件事的最好方法是什么?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

所以我不知道是什么stepTwo.file 是的,但我想是File 对象实例,我相信这里的问题是您没有意识到实际上不需要手动设置Content-Type 标头,因为当请求正文是FormData 实例,则内容类型标头将始终默认为multipart/form-data.

因此,只需从headers 在您的fetch() 调用,然后在端点回调中,使用WP_REST_Request::get_file_params() 获取上传的文件数据(名称、临时路径、大小等)。例如,你可以$request->get_file_params()[\'stepTwo\']. ($_FILES[\'stepTwo\'] 也可以,但我会使用class方法)

至于stepOne 参数(将存储在$_POST 数组),您只需$request[\'stepOne\'] 获取值,或者您也可以$request->get_param( \'stepOne\' ).

看见https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/#arguments 了解更多详细信息。

此外,应始终设置permission_callback, 例如,如果您的REST API端点是公共的,您可以\'permission_callback\' => \'__return_true\'.

相关推荐

WooCommerce Endpoints content

我有一个与woocommerce集成的自定义插件。我想在用户的配置文件中显示列表记录,并已成功完成此操作。创建端点。刷新永久链接。但是,不会出现在endpoint选项卡中绘制内容的回调。仅仪表板。 function mylistings_account_menu_items( $items ) { $items[\'mylistings\'] = __( \'Active Listings\', \'mylistings\' ); return $items