No importa lo que intentes, pero simplemente agregue un HTML type de entrada = «archivo» No funcionará en la página de pago de WooCommerce. Creo que esta es una medida de seguridad y, como tal, necesitamos encontrar una solución.
La única solución posible es cargar el archivo antes de que se envíe el pago, de modo que, en «Orden de lugar», el archivo ya está disponible en la sección de medios y se puede adjuntar al pedido como una simple cadena (URL).
Dicha carga puede ocurrir a través de AJAX, para que el cliente no note nada en la página de pago: en realidad está cargando un archivo en su sitio web sin siquiera notificarlo (sí, debe aplicar algunas medidas de seguridad, por supuesto).
Así es como se hace, ¡disfruta!
Php Snippet: permita a los clientes cargar archivos en la página de pago de WooCommerce
Nota 1: En este ejemplo, solo permito a los usuarios cargar un archivo PDF. Esto se define a través del aceptar Parámetro del tipo de entrada de archivo.
Nota 2: Yo uso wp_upload_bits () Función de WordPress Para agregar el archivo al directorio de carga actual, por ejemplo, WP-Content/uploads/2022/09
Nota 3: Una vez que el archivo se carga y luego se adjunta al pedido, lo muestro en el administrador en la página de pedido de edición y los correos electrónicos del administrador.
/** n*@snippet File Upload Input @ WooCommerce Ccheckout n*@how-to https://tdestudiodesign.com/tutoriales n*@author Tomás Lucas D´Amario, TD Estudio Design n*@compatible WooCommerce 6 n*@community https://tdestudiodesign.com/club */add_action( 'woocommerce_after_order_notes', 'tddesign_checkout_file_upload' );function tddesign_checkout_file_upload() {echo '<p class="form-row"><label for="appform">Application Form (PDF)<abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="file" id="appform" name="appform" accept=".pdf" required><input type="hidden" name="appform_field"/></span></p>';wc_enqueue_js( "$( '#appform' ).change( function() {if ( this.files.length ) {const file = this.files[0];const formData = new FormData();formData.append( 'appform', file );$.ajax({url: wc_checkout_params.ajax_url + '?action=appformupload',type: 'POST',data: formData,contentType: false,enctype: 'multipart/form-data',processData: false,success: function ( response ) {$( 'input[name="appform_field"]' ).val( response );}});}});" );}add_action( 'wp_ajax_appformupload', 'tddesign_appformupload' );add_action( 'wp_ajax_nopriv_appformupload', 'tddesign_appformupload' );function tddesign_appformupload() {global $wpdb;$uploads_dir = wp_upload_dir();if ( isset( $_FILES['appform'] ) ) {if ( $upload = wp_upload_bits( $_FILES['appform']['name'], null, file_get_contents( $_FILES['appform']['tmp_name'] ) ) ) {echo $upload['url'];}}die;}add_action( 'woocommerce_checkout_process', 'tddesign_validate_new_checkout_field' ); function tddesign_validate_new_checkout_field() {if ( empty( $_POST['appform_field'] ) ) {wc_add_notice( 'Please upload your Application Form', 'error' );}}add_action( 'woocommerce_checkout_update_order_meta', 'tddesign_save_new_checkout_field' ); function tddesign_save_new_checkout_field( $order_id ) { if ( ! empty( $_POST['appform_field'] ) ) {update_post_meta( $order_id, '_application', $_POST['appform_field'] );}} add_action( 'woocommerce_admin_order_data_after_billing_address', 'tddesign_show_new_checkout_field_order', 10, 1 ); function tddesign_show_new_checkout_field_order( $order ) { $order_id = $order->get_id(); if ( get_post_meta( $order_id, '_application', true ) ) echo '<p><strong>Application PDF:</strong> <a href="https://www.businessbloomer.com/woocommerce-upload-file-checkout-page/'%20.%20get_post_meta(%20$order_id,%20'_application',%20true%20)%20.%20'" target="_blank">https://www.businessbloomer.com/woocommerce-upload-file-checkout-page/'%20.%20get_post_meta(%20$order_id,%20'_application',%20true%20)%20.%20'</a></p>';} add_action( 'woocommerce_email_after_order_table', 'tddesign_show_new_checkout_field_emails', 20, 4 ); function tddesign_show_new_checkout_field_emails( $order, $sent_to_admin, $plain_text, $email ) { if ( $sent_to_admin && get_post_meta( $order->get_id(), '_application', true ) ) echo '<p><strong>Application Form:</strong> ' . get_post_meta( $order->get_id(), '_application', true ) . '</p>';}
¿Dónde agregar código personalizado?
Debes colocar PHP personalizado en funciones.php y CSS personalizado en style.css del tema de su hijo: ¿Dónde colocar la personalización de WooCommerce?
Este código todavía funciona, a menos que informe lo contrario. Para excluir los conflictos, cambie temporalmente al tema de la tienda, deshabilite todos los complementos, excepto WooCommerce, y pruebe el fragmento nuevamente: Solución de problemas de WooCommerce 101
Contenido relacionado
Tomás Lucas D´Amario
Programador y Desarrollador
Experto en WooCommerce y WordPress. Trabajando como un profesional independiente de WooCommerce desde 2016. Su objetivo es ayudar a los empresarios y desarrolladores a superar sus pesadillas de WooCommerce. Sigueme o contactame por Linkedin