
Adjuntar PDF al email del pedido en WooCommerce
En este tutorial te muestro cómo subir un PDF por producto en WooCommerce y que ese archivo se envíe automáticamente adjunto en el email de nuevo pedido que recibe el comprador.
Agregar un campo de subida de PDF en el producto
Usamos add_meta_box
para agregar un campo tipo FILE
en la edición del producto:
<?php add_action( 'add_meta_boxes', 'addProductPdfUploadBox' ); function addProductPdfUploadBox() { add_meta_box( 'productPdfMeta', 'Archivo PDF para el comprador', 'renderProductPdfMetaBox', 'product', 'side' ); } function renderProductPdfMetaBox( $post ) { wp_nonce_field( 'saveProductPdfMeta', 'productPdfMetaNonce' ); $pdfUrl = get_post_meta( $post->ID, '_productPdfUrl', true ); echo '<input type="file" name="productPdfFile" accept="application/pdf" />'; if ( $pdfUrl ) { echo '<p><a href="' . esc_url( $pdfUrl ) . '" target="_blank">Ver PDF actual</a></p>'; } }
Guardar el PDF al guardar el producto
El archivo se guarda en la carpeta uploads y se almacena la URL en un meta campo:
<?php add_action( 'save_post', 'saveProductPdfMeta' ); function saveProductPdfMeta( $postId ) { if ( ! isset( $_POST['productPdfMetaNonce'] ) || ! wp_verify_nonce( $_POST['productPdfMetaNonce'], 'saveProductPdfMeta' ) ) { return; } if ( isset( $_FILES['productPdfFile'] ) && $_FILES['productPdfFile']['error'] === UPLOAD_ERR_OK ) { require_once ABSPATH . 'wp-admin/includes/file.php'; $uploadedFile = wp_handle_upload( $_FILES['productPdfFile'], [ 'test_form' => false ] ); if ( isset( $uploadedFile['url'] ) ) { update_post_meta( $postId, '_productPdfUrl', esc_url_raw( $uploadedFile['url'] ) ); } } }
Adjuntar el PDF en el email de pedido nuevo
Usamos el filtro woocommerce_email_attachments
para agregar los archivos PDF al email de procesamiento de pedido al cliente:
<?php add_filter( 'woocommerce_email_attachments', 'attachProductPdfsToEmail', 10, 4 ); function attachProductPdfsToEmail( $attachments, $emailId, $order, $email ) { if ( $emailId !== 'customer_processing_order' ) { return $attachments; } foreach ( $order->get_items() as $item ) { $productId = $item->get_product_id(); $pdfUrl = get_post_meta( $productId, '_productPdfUrl', true ); if ( $pdfUrl ) { $uploadDir = wp_upload_dir(); $filePath = $uploadDir['basedir'] . str_replace( $uploadDir['baseurl'], '', $pdfUrl ); if ( file_exists( $filePath ) ) { $attachments[] = $filePath; } } } return $attachments; }
¿Qué logramos con esto?
- Puedes subir un PDF por producto desde el admin.
- Ese archivo se adjunta automáticamente al email que recibe el comprador cuando hace una compra.
- El PDF se guarda en la carpeta
uploads
del sitio y no es accesible públicamente salvo por enlace directo.