通过挂接到 Woocommerce 管理订单页面,如何将文件上传到 Wordpress 中的 Uploads 文件夹中的特定子文件夹?

问题描述 投票:0回答:1

我想在 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.');
    }
}
}
html wordpress forms woocommerce file-upload
1个回答
0
投票

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 文件中(或插件中)。已测试并有效。

相关:

© www.soinside.com 2019 - 2024. All rights reserved.