Con este código (Snippet) añadiremos una nueva funcionalidad que permite añadir archivo descargable a producto simple WooCommerce. Imaginaros que vendemos un producto que necesita un manual de instrucciones, pues podremos realizar el envío físico del producto y a su vez que le llegue el manual de instrucciones al cliente al realizar el pedido.

Código para añadir archivo descargable a un producto de envío en WooCommerce
// Crea campos para adjuntar descargables en la paágina de edición del producto
if ( in_array( 'woocommerce/woocommerce.php', get_option( 'active_plugins' ) ) ){
add_action( 'woocommerce_product_data_tabs', 'woo_add_custom_admin_product_tab' );
function woo_add_custom_admin_product_tab( $product_data_tabs ) {
$product_data_tabs[ 'documentation-data-tab' ] = array(
'label' => __( 'Documentación', 'woocommerce' ),
'target' => 'documentation_product_data',
);
return $product_data_tabs;
}
add_action( 'woocommerce_product_data_panels', 'add_documentation_tab_fields' );
function add_documentation_tab_fields(){
global $post;
wp_nonce_field( plugin_basename(__FILE__), 'wp_custom_attachment_nonce' );
?>
<div id="documentation_product_data" class="panel woocommerce_options_panel">
<div class="form-field downloadable_files">
<label><?php _e( 'Archivos descargables', 'woocommerce' ); ?>:</label>
<table class="widefat">
<thead>
<tr>
<th><?php _e( 'Name', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e( 'This is the name of the download shown to the customer.', 'woocommerce' ); ?>">[?]</span></th>
<th colspan="2"><?php _e( 'File URL', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e( 'This is the URL or absolute path to the file which customers will get access to. URLs entered here should already be encoded.', 'woocommerce' ); ?>">[?]</span></th>
<th> </th>
</tr>
</thead>
<tbody>
<?php
$downloadable_files = get_post_meta( $post->ID, 'documentation_product_files', true );
?>
<tr>
<td class="file_name"><input type="text" id="title_documentation_file" placeholder="Ej: Información adicional" name="wp_custom_attachment[title]" class="input_text" value="<?php if ( isset ( $downloadable_files['title'] ) ) echo esc_attr( $downloadable_files['title'] ); ?>" /></td>
<td class="file_url"><input type="text" id="attachment_documentation_file" placeholder="<?php esc_attr_e( "http://", 'woocommerce' ); ?>" name="wp_custom_attachment[documentation]" class="input_text" value="<?php if ( isset ( $downloadable_files['documentation'] ) ) echo esc_attr( $downloadable_files['documentation'] ); ?>" /></td>
<td class="file_url_choose" width="1%"><input type="button" class="button upload_file_button" data-file="attachment_documentation_file" value="<?php _e( 'Choose file', 'woocommerce' )?>" /></td>
</tr>
</tbody>
</table>
</div>
</div>
<?php
}
// Guarda ficheros de documentación adjuntos a cada ficha de producto
add_action( 'save_post', 'save_custom_meta_data', 99, 2 );
function save_custom_meta_data( $post_id, $post ) {
/* --- security verification --- */
if ( 'product' !== $post->post_type ) {
return $post_id;
}
if(!wp_verify_nonce($_POST['wp_custom_attachment_nonce'], plugin_basename(__FILE__))) {
return $post_id;
} // end if
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
} // end if
if('product' == $_POST['post_type']) {
if(!current_user_can('edit_page', $post_id)) {
return $post_id;
} // end if
} else {
if(!current_user_can('edit_page', $post_id)) {
return $post_id;
} // end if
} // end if
/* - end security verification - */
// Make sure the file array isn't empty
if( isset( $_POST[ 'wp_custom_attachment' ] ) ) {
$attachment_files = $_POST[ 'wp_custom_attachment' ];
update_post_meta( $post_id, 'documentation_product_files', $attachment_files );
}
}
// Añade botón de descarga de adjunto debajo de imágenes del producto
add_action( 'woocommerce_after_single_product_summary', 'show_download_additional_info_button', 1 );
function show_download_additional_info_button(){
global $post, $product;
?>
<div class="attach_documentation_downloadable">
<?php
if( $documentation = get_post_meta( $post->ID, 'documentation_product_files', true )) {
if ( !empty( $documentation[ 'documentation' ] ) ):
?>
<a class="button" href="<?php echo esc_attr( $documentation[ 'documentation' ] ); ?>" target="_blank" ><i class="fa fa-file-pdf-o fa-fw"></i><?php echo !empty( $documentation[ 'title' ] )? esc_attr( $documentation[ 'title' ] ) : 'Información adicional'; ?></a>
<?php endif;
}
?>
</div>
<?php
}
}