我想在 WooCommerce 管理页面添加一个按钮,允许我将文件(例如 .pdf、.jpg、.png 等)上传到位于目录中“Uploads”文件夹中的自定义文件夹。该功能只是不断重新加载到同一页面,而不上传文件。
我什至在另一个 WordPress 安装上测试了它,但奇怪的是它重定向到所有帖子。我确信我错过了一些东西。我正在使用 Local by Flywheel,本地托管,一切都是最新的。请帮忙。预先感谢您。
我所期望的是能够将文档上传到上传文件夹中的自定义文件夹,我可以根据需要调用/提取文档以附加或发送给特定用户。我尝试过以下解决方案:
add_action( 'woocommerce_after_order_itemmeta', 'uploaddocs', 10, 1);
function uploaddocs(){
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submittheform">
</form>
<?php
global $wp_filesystem;
WP_Filesystem();
$content_directory = $wp_filesystem->wp_content_dir() . 'uploads/';
$wp_filesystem->mkdir( $content_directory . 'CustomDocuments' );
$target_dir_location = $content_directory . 'CustomDocuments/';
if(isset($_POST["submittheform"])){ //&& isset($_FILES['fileToUpload'])) {
$name_file = $_FILES['fileToUpload']['name'];
$tmp_name = $_FILES['fileToUpload']['tmp_name'];
if( move_uploaded_file( $tmp_name, $target_dir_location.$name_file ) ) {
echo "File was successfully uploaded";
} else {
echo "The file was not uploaded";
}
}
}
奇怪的是,如果我将 html 表单放置两次,代码就会起作用。
add_action( 'woocommerce_after_order_itemmeta', 'uploaddocs', 10, 1);
function uploaddocs(){
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submittheform">
</form>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submittheform">
</form>
<?php
global $wp_filesystem;
WP_Filesystem();
$content_directory = $wp_filesystem->wp_content_dir() . 'uploads/';
$wp_filesystem->mkdir( $content_directory . 'CustomDocuments' );
$target_dir_location = $content_directory . 'CustomDocuments/';
if(isset($_POST["submittheform"])){ //&& isset($_FILES['fileToUpload'])) {
$name_file = $_FILES['fileToUpload']['name'];
$tmp_name = $_FILES['fileToUpload']['tmp_name'];
if( move_uploaded_file( $tmp_name, $target_dir_location.$name_file ) ) {
echo "File was successfully uploaded";
} else {
echo "The file was not uploaded";
}
}
}
我什至向 ChapGPT 寻求帮助,我遇到了同样的问题。 AI代码解决方案是这样的:
add_action( 'woocommerce_after_order_itemmeta', 'custom_file_upload_form', 10, 3 );
function custom_file_upload_form( $item_id, $item, $product ) {
// Output the form only for line items
if ( $item->get_type() !== 'line_item' ) return;
// Output the form
echo '<form action="" method="post" enctype="multipart/form-data">';
echo '<input type="file" name="custom_document" id="custom_document_' . esc_attr( $item_id ) . '">';
echo '<input type="hidden" name="action" value="upload_custom_document">';
echo '<input type="hidden" name="order_item_id" value="' . esc_attr( $item_id ) . '">';
echo '<input type="submit" value="Upload Document">';
echo '</form>';
}
add_action( 'init', 'handle_custom_document_upload' );
function handle_custom_document_upload() {
// Debugging: Check if the function is triggered
error_log('Form submitted.');
if ( isset( $_POST['action'] ) && $_POST['action'] == 'upload_custom_document' ) {
error_log('Custom document upload action triggered.');
if ( isset( $_FILES['custom_document'] ) ) {
error_log('File detected: ' . print_r($_FILES['custom_document'], true));
$file = $_FILES['custom_document'];
// Handle the file upload
$upload = wp_upload_bits( $file['name'], null, file_get_contents( $file['tmp_name'] ) );
if ( ! $upload['error'] ) {
error_log('File upload successful.');
$upload_dir = wp_upload_dir();
$custom_dir = $upload_dir['basedir'] . '/CustomDocuments';
if ( ! file_exists( $custom_dir ) ) {
wp_mkdir_p( $custom_dir );
}
$new_file = $custom_dir . '/' . basename( $upload['file'] );
if ( move_uploaded_file( $file['tmp_name'], $new_file ) ) {
error_log('File moved to CustomDocuments folder.');
} else {
error_log('Error moving file.');
}
} else {
error_log('Error in file upload: ' . $upload['error']);
}
} else {
error_log('No file detected.');
}
}
}
不幸的是我也遇到了同样的问题。如果我重复 html 表单两次,那么该功能就可以工作。但是在新安装上它不起作用。这是重复的代码:
add_action( 'woocommerce_after_order_itemmeta', 'custom_file_upload_form', 10, 3 );
function custom_file_upload_form( $item_id, $item, $product ) {
// Output the form only for line items
if ( $item->get_type() !== 'line_item' ) return;
// Output the form
echo '<form action="" method="post" enctype="multipart/form-data">';
echo '<input type="file" name="custom_document" id="custom_document_' . esc_attr( $item_id ) . '">';
echo '<input type="hidden" name="action" value="upload_custom_document">';
echo '<input type="hidden" name="order_item_id" value="' . esc_attr( $item_id ) . '">';
echo '<input type="submit" value="Upload Document">';
echo '</form>';
// Output the form
echo '<form action="" method="post" enctype="multipart/form-data">';
echo '<input type="file" name="custom_document" id="custom_document_' . esc_attr( $item_id ) . '">';
echo '<input type="hidden" name="action" value="upload_custom_document">';
echo '<input type="hidden" name="order_item_id" value="' . esc_attr( $item_id ) . '">';
echo '<input type="submit" value="Upload Document">';
echo '</form>';
}
add_action( 'init', 'handle_custom_document_upload' );
function handle_custom_document_upload() {
// Debugging: Check if the function is triggered
error_log('Form submitted.');
if ( isset( $_POST['action'] ) && $_POST['action'] == 'upload_custom_document' ) {
error_log('Custom document upload action triggered.');
if ( isset( $_FILES['custom_document'] ) ) {
error_log('File detected: ' . print_r($_FILES['custom_document'], true));
$file = $_FILES['custom_document'];
// Handle the file upload
$upload = wp_upload_bits( $file['name'], null, file_get_contents( $file['tmp_name'] ) );
if ( ! $upload['error'] ) {
error_log('File upload successful.');
$upload_dir = wp_upload_dir();
$custom_dir = $upload_dir['basedir'] . '/CustomDocuments';
if ( ! file_exists( $custom_dir ) ) {
wp_mkdir_p( $custom_dir );
}
$new_file = $custom_dir . '/' . basename( $upload['file'] );
if ( move_uploaded_file( $file['tmp_name'], $new_file ) ) {
error_log('File moved to CustomDocuments folder.');
} else {
error_log('Error moving file.');
}
} else {
error_log('Error in file upload: ' . $upload['error']);
}
} else {
error_log('No file detected.');
}
}
}
WordPress 上传需要 JavaScript / Ajax 以避免您面临的问题。尝试以下代码替换:
// Add file upload to Admin order items
add_action( 'woocommerce_after_order_itemmeta', 'admin_order_itemmeta_upload_docs', 10, 2);
function admin_order_itemmeta_upload_docs( $item_id, $item ){
// Only for "line item" order items
if( ! $item->is_type('line_item') ) return;
echo '<div class="upload-'.$item_id.'"><p class="file_uploaded">';
// Display the uploaded file (if any)
if ( $upload = $item->get_meta('_file_upload') ) {
echo 'File: <a class="button" href="'.$upload['url'].'" target="_blank">'.$upload['name'].'</a>';
}
echo '</p>';
$other_tags = 'accept=".png,.jpg,.doc,.docx,.rtf,.txt,.pdf" '; // <== Accepted file types extensions
$other_tags .= 'data-order_id="'.$item->get_order_id().'" data-item_id="'.$item_id.'"';
// Display the file upload field
?>
<p class="form-row validate-required" id="file_field" >
<label for="file"><?php _e("Upload File") . ': '; ?>
<input type="file" name="file" <?php echo $other_tags; ?> />
</label>
</p></div>
<?php
}
// jQuery Ajax sender
add_action('admin_footer', 'wc_order_admin_footer_script', 10);
function wc_order_admin_footer_script() {
?>
<script>
jQuery(function($){
$(document.body).on( 'change', 'input[name=file]', function() {
const files = $(this).prop('files'),
order_id = $(this).data('order_id'),
item_id = $(this).data('item_id');
if ( files.length ) {
const file = files[0],
itemID = $(this).data('item_id'),
formData = new FormData(),
trItem = $('tr.item[data-order_item_id="'+itemID+'"]');
formData.append( 'uploads', file );
formData.append( 'order_id', $(this).data('order_id') );
formData.append( 'item_id', itemID );
trItem.block({message: null, overlayCSS:{background:"#fff",opacity: .6}});
$.ajax({
url: '<?php echo admin_url('admin-ajax.php?action=order_item_upload&security='.wp_create_nonce('order_item_upload') ); ?>',
type: 'POST',
data: formData,
contentType: false,
enctype: 'multipart/form-data',
processData: false,
success: function ( response ) {
trItem.unblock();
$('div.upload-'+itemID).append(response);
$('#woocommerce-order-items').trigger('wc_order_items_reload');
},
error: function ( error ) {
trItem.unblock();
$('div.upload-'+itemID).append('<span style="color:red">Error: The upload failed.</span>');
$('#woocommerce-order-items').trigger('wc_order_items_reload');
}
});
}
});
});
</script>
<?php
}
// PHP Ajax responder
add_action( 'wp_ajax_order_item_upload', 'checkout_ajax_order_item_upload' );
function checkout_ajax_order_item_upload(){
check_ajax_referer('order_item_upload', 'security');
if ( isset($_FILES['uploads']) ) {
$upload_dir = wp_upload_dir();
$upload_path = '/custom-documents/'; // <== HERE set your file path
$upload_folder = $upload_dir['basedir'] . $upload_path;
$upload_url = $upload_dir['baseurl'] . $upload_path;
if ( ! is_dir( $upload_folder ) ) {
wp_mkdir_p( $upload_folder );
chmod( $upload_folder, 0777 );
}
$file_path = $upload_folder . '/' . basename($_FILES['uploads']['name']);
$file_url = $upload_url . '/' . basename( $_FILES['uploads']['name']);
if ( ! isset($_POST['order_id']) || ! isset($_POST['item_id']) ) {
echo '<span style="color:red">' . __('Error: The upload process has been stopped.') . '</span>';
wp_die();
}
if( move_uploaded_file($_FILES['uploads']['tmp_name'], $file_path)) {
$order = wc_get_order(intval($_POST['order_id']));
$order_items = $order->get_items();
$order_item = $order_items[intval($_POST['item_id'])];
$order_item->update_meta_data('_file_upload', array(
'url' => $file_url,
'name' => esc_attr($_FILES['uploads']['name']),
));
$order_item->save();
echo '<span style="color:green">' . __('Upload completed', 'woocommerce') . '</span><br>';
} else {
echo '<span style="color:red">' . __('Error: The upload failed.') . '</span>';
}
}
wp_die();
}
代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。
相关: