由于安全原因,WooCommerce结账页面不支持将文件上传字段添加为可能的字段。我期待添加一个文件上传结帐页面上的字段,以便客户可以给予我们一个文件,然后可以附加到他们的订单,并通过在未来的订单 Jmeter 板管理员再次引用,如果我们需要。
我试过两种不同的方法,但都是死路一条。我尝试过的两种不同的解决方案是:
- Gravity Forms Upload Form -尝试通过挂钩在结帐页面上显示Gravity Forms表单,但文件字段数据永远不会显示在$_FILES或$_POST中。
1.使用 AJAX 上传字段-尝试创建一个上传字段,然后使用ajax将上传字段的数据发送到wordpress的ajax函数,但这种方法的问题是,如果文件已经上传,则无法验证文件大小。因此,用户可能会上传非常大的文件,或者由于文件上传路径被添加到文件上传元素的HTML中,他们可能会弄乱文件的存储位置,如下所示:
add_action( 'wp_ajax_mishaupload', 'misha_file_upload' );
add_action( 'wp_ajax_nopriv_mishaupload', 'misha_file_upload' );
function misha_file_upload(){
$upload_dir = wp_upload_dir();
if ( isset( $_FILES[ 'misha_file' ] ) ) {
$path = $upload_dir[ 'path' ] . '/' . basename( $_FILES[ 'misha_file' ][ 'name' ] );
if( move_uploaded_file( $_FILES[ 'misha_file' ][ 'tmp_name' ], $path ) ) {
echo $upload_dir[ 'url' ] . '/' . basename( $_FILES[ 'misha_file' ][ 'name' ] );
}
}
die;
}
字符串
其中行**echo $upload_dir[ 'url' ]。“/”. basename($_FILES[ 'misha_file' ][ 'name' ]);**将文件目录添加到input元素的value=部分,这在安全性方面并不理想。
然后,我到了这一点,我现在可以用下面的代码添加'file'类型字段:
/**
* Function for `woocommerce_form_field` filter-hook.
*
* @param $field
* @param $key
* @param $args
* @param $value
*
* @return
*/
function wp_kama_woocommerce_form_field_filter( $field, $key, $args, $value ){
// check if field is a file field
if( $args['type'] == 'file' ){
// add custom HTML to the field
$field = '<div class="woocommerce-additional-fields__field-wrapper">';
$field .= '<p class="form-row notes woocommerce-validated" id="certificate_file_upload_field" data-priority="">';
$field .= '<label for="certificate_file_upload" class="">Upload Certificate</label>';
$field .= '<span class="woocommerce-input-wrapper">';
$field .= sprintf(
'<input type="file" class="%s" name="%s" id="%s"/>',
esc_attr( implode( ' ', $args['class'] ) ),
esc_attr( $key ),
esc_attr( $args['id'] ),
);
$field .= '</span>';
$field .= '</p>';
$field .= '</div>';
}
return $field;
}
add_filter( 'woocommerce_form_field', 'wp_kama_woocommerce_form_field_filter', 10, 4 );
型
上面的代码让我在另一个钩子中执行以下操作:
function add_custom_checkout_field($checkout) {
woocommerce_form_field('certificate_file_upload', array(
'type' => 'file',
'class' => array('form-row-wide'),
'label' => __('Upload Certificate'),
'required' => false,
), $checkout->get_value('certificate_file_upload'));
}
add_action( 'woocommerce_after_order_notes', 'add_custom_checkout_field' );
型
然后,此代码向 checkout 页面添加一个文件字段。此时的问题是$_FILES和$_POST都没有任何与密钥“certificate_file_upload”相关的文件数据,这在尝试使用实际文件数据本身执行任何操作时都是一个问题。
我试着搜索WooCommerce如何处理默认的结帐字段,看看我如何将我的文件数据添加到$_FILES/$_POST,但我想到的是他们通过WooCommerce插件管理数据可能:woocommerce->assets->js->frontend->checkout.js但我不知道如何在不修改文件的情况下将文件支持添加到结帐页面(每当他们更新插件时都会被覆盖),如果这是正确的文件。
如果要将文件数据添加到$_FILES中,首先应该查看checkout.js文件,还是应该查看其他文件?如果checkout.js是我应该查看的正确文件,有没有办法修改他们的文件,以允许我的文件数据添加到$_FILES?
我想避免下载一个插件只是为了使文件上传的结帐页面可能,因为我试图避免臃肿,但如果这是唯一的解决方案,我想我会去,如果没有什么是可能的,以解决这个问题。
1条答案
按热度按时间dgjrabp21#
下面的超轻量级插件以非常安全的方式使用 AJAX ,允许在WooCommerce结帐页面上传。
使用 AJAX 时,您可以:
所有上传的文件将转到名为“wc_checkout_uploads”的文件夹中,该文件夹位于WordPress主“uploads”目录中。它们将包含在一个子文件夹中,用户ID作为名称(6位数长度)。
对于访客用户,如果启用了 checkout ,则上传具有相同的上传目录
000000
和基于计费电子邮件的子目录。参见**“完整用法示例”**部分 (在插件代码之后):
这个轻量级插件代码如下:
**PHP主文件 (添加到您喜欢的文件夹中):checkout_uploads.php
字符串
JavaScript文件位于 “js” 子文件夹:checkout_upload.js
型
插件代码结束。
新的输入字段类型“file”现在可用于woocommerce表单字段,并具有2个额外的可选参数:
'max_size'
(单位:ko),'accept'
的值。完整使用示例:
1)新增上传字段:
**A)订单备注后 (仅接受文本/ pdf文件并限制下载大小)。
型
此代码将在您的活动子主题(或活动主题)的functions.php文件中或使用Code Snippets plugin(WooCommerce推荐)。
B)在特定用户角色的账单 (或发货) 地址部分*(仅接受文本/ pdf文件并限制下载大小)*。
**注意:**此处字段已启用必填选项。
型
仅对于登录用户,您可以用途:
型
**重要提示:**当该字段是必填字段,并且位于账单或运输字段部分时,添加以下代码,以避免woocommerce停止结帐(当文件已上传时):
型
此代码将在您的活动子主题(或活动主题)的functions.php文件中或使用Code Snippets plugin(WooCommerce推荐)。
2)需要文件时使用的校验:
型
此代码将在您的活动子主题(或活动主题)的functions.php文件中或使用Code Snippets plugin(WooCommerce推荐)。
3)保存上传文件的URL和名称:
型
4)显示上传文件的URL和名称:
A)在管理界面,订单编辑页面,账单地址后:
型
此代码将在您的活动子主题(或活动主题)的functions.php文件中或使用Code Snippets plugin(WooCommerce推荐)。
B)Everywhere neededwith
$order
variable(WC_Order对象):首先,如果需要,您可以从订单ID中获取WC_Order对象,如下所示:
型
然后,您将使用以下命令获取数据:
型
然后,对于一个文件,您可以将其显示为一个链接,如:
型
或者对于图片,可以这样显示图片:
型