Я попробовал два разных метода, но оба зашли в тупик. Я попробовал два разных решения:
- Форма загрузки Gravity Forms — попробовал отобразить форму Gravity Forms на странице оформления заказа с помощью хука и поля файла. данные никогда не будут отображаться в $_FILES или $_POST.
- Загрузить поле с помощью ajax — попробовал создать поле загрузки, а затем использовать ajax для отправки данных поля загрузки в функцию ajax WordPress, но Проблема с этим подходом заключается в том, что вы не можете проверить размер файла/если файл уже загружен. Таким образом, пользователь потенциально может загружать очень большие файлы или может испортить место хранения файла из-за добавления пути загрузки файла в 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;
}
Затем я дошел до того момента, когда теперь могу добавлять поля типа «файл» с помощью следующего кода:
Код: Выделить всё
/**
* 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 = '';
$field .= '
';
$field .= 'Upload Certificate';
$field .= '';
$field .= sprintf(
'',
esc_attr( implode( ' ', $args['class'] ) ),
esc_attr( $key ),
esc_attr( $args['id'] ),
);
$field .= '';
$field .= '
';
$field .= '';
}
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' );
Я пробовал поискать, как WooCommerce работает с полями оформления заказа по умолчанию, чтобы увидеть, как я могу добавить данные своего файла в $_FILES/$_POST, но все, что я придумал, это то, что они управляют данными возможно через плагин WooCommerce:
woocommerce->assets->js->frontend->checkout.js
но я не знаю, как это сделать добавление поддержки файлов на страницу оформления заказа после этого момента без изменения их файлов (которые будут переопределяться при каждом обновлении плагина), если это даже правильный файл, в котором это можно делать.
Есть ли checkout.js - файл, который мне следует просмотреть в первую очередь, чтобы добавить данные моего файла в $_FILES, или мне следует искать где-то еще? Если checkout.js — это правильный файл, который мне следует просмотреть, есть ли способ изменить его файл, чтобы разрешить добавление данных моего файла в $_FILES?
Я хотел бы избежать мне приходится загружать плагин только для того, чтобы сделать возможной загрузку файлов на страницу оформления заказа, поскольку я пытаюсь избежать раздувания, но если это единственное решение, я думаю, я воспользуюсь этим, если это невозможно исправить.
Подробнее здесь: https://stackoverflow.com/questions/766 ... e-checkout