在进行WooCommerce二次开发时,通常需要自定义一些功能。其中,在结账页面上传文件是一个常见需求。为了实现这个功能,我们需要在结账页面添加一个自定义文件上传字段。虽然这个字段看起来很简单,但实际上需要进行一些复杂的工作。下面是具体的代码实现。
1、在前段增加文件上传字段并使用Ajax上传
添加文件上传表单
下面的代码中,我们把上传文件需要的HTML表单代码添加到了结账表单中。
add_action( 'woocommerce_after_checkout_billing_form', 'misha_file_upload_field' );
function misha_file_upload_field() {
?>
<div class="form-row form-row-wide">
<input type="file" id="misha_file" name="misha_file" />
<input type="hidden" name="misha_file_field" />
<label for="misha_file"><a>Select a cool image</a></label>
<div id="misha_filelist"></div>
</div>
<?php
}
使用jQuery处理用户文件上传。
jQuery( function( $ ) {
$( '#misha_file' ).change( function() {
if ( ! this.files.length ) {
$( '#misha_filelist' ).empty();
} else {
// we need only the only one for now, right?
const file = this.files[0];
$( '#misha_filelist' ).html( '<img src="' + URL.createObjectURL( file ) + '"><span>' + file.name + '</span>' );
const formData = new FormData();
formData.append( 'misha_file', file );
$.ajax({
url: wc_checkout_params.ajax_url + '?action=mishaupload',
type: 'POST',
data: formData,
contentType: false,
enctype: 'multipart/form-data',
processData: false,
success: function ( response ) {
$( 'input[name="misha_file_field"]' ).val( response );
}
});
}
} );
} );
在服务端接收并保存前端Ajax上传的文件
保存用户上传的图像到服务器上
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;
}
在订单中保存上传的文件URL并显示在订单详情页面
在订单信息中保存上传的文件URL
add_action( 'woocommerce_checkout_update_order_meta', 'misha_save_what_we_added' );
function misha_save_what_we_added( $order_id ){
if( ! empty( $_POST[ 'misha_file_field' ] ) ) {
update_post_meta( $order_id, 'misha_file_field', sanitize_text_field( $_POST[ 'misha_file_field' ] ) );
}
}
在订单信息中显示上传的图像
add_action( 'woocommerce_admin_order_data_after_order_details', 'misha_order_meta_general' );
function misha_order_meta_general( $order ){
$file = get_post_meta( $order->get_id(), 'misha_file_field', true );
if( $file ) {
echo '<img src="' . esc_url( $file ) . '" />';
}
}
总结
jQuery( function( $ ) {
$( '#misha_file' ).change( function() {
if ( ! this.files.length ) {
$( '#misha_filelist' ).empty();
} else {
// we need only the only one for now, right?
const file = this.files[0];
$( '#misha_filelist' ).html( '<img src="' + URL.createObjectURL( file ) + '"><span>' + file.name + '</span>' );
const formData = new FormData();
formData.append( 'misha_file', file );
$.ajax({
url: wc_checkout_params.ajax_url + '?action=mishaupload',
type: 'POST',
data: formData,
contentType: false,
enctype: 'multipart/form-data',
processData: false,
success: function ( response ) {
$( 'input[name="misha_file_field"]' ).val( response );
}
});
}
} );
} );
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;
}
在订单中保存上传的文件URL并显示在订单详情页面
在订单信息中保存上传的文件URL
add_action( 'woocommerce_checkout_update_order_meta', 'misha_save_what_we_added' );
function misha_save_what_we_added( $order_id ){
if( ! empty( $_POST[ 'misha_file_field' ] ) ) {
update_post_meta( $order_id, 'misha_file_field', sanitize_text_field( $_POST[ 'misha_file_field' ] ) );
}
}
在订单信息中显示上传的图像
add_action( 'woocommerce_admin_order_data_after_order_details', 'misha_order_meta_general' );
function misha_order_meta_general( $order ){
$file = get_post_meta( $order->get_id(), 'misha_file_field', true );
if( $file ) {
echo '<img src="' . esc_url( $file ) . '" />';
}
}
总结
add_action( 'woocommerce_checkout_update_order_meta', 'misha_save_what_we_added' );
function misha_save_what_we_added( $order_id ){
if( ! empty( $_POST[ 'misha_file_field' ] ) ) {
update_post_meta( $order_id, 'misha_file_field', sanitize_text_field( $_POST[ 'misha_file_field' ] ) );
}
}
add_action( 'woocommerce_admin_order_data_after_order_details', 'misha_order_meta_general' );
function misha_order_meta_general( $order ){
$file = get_post_meta( $order->get_id(), 'misha_file_field', true );
if( $file ) {
echo '<img src="' . esc_url( $file ) . '" />';
}
}