Ajouter un fichier à un produit et le joindre à l’email de commande WooCommerce

Ce code vous permettra d’ajouter un nouvel onglet dans les données du produit à votre produit woocommerce et de téléverser un fichier via la bibliothèque multimédia WordPress.

Ensuite, lorsque vos clients passeront une commande et que la commande sera en cours, ils recevront le fichier dans l’e-mail.
Sur le corps du courrier et également en fichier joint.

Super, non ? 🙂

Voici le code complet du plugin

				
					<?php
/*
Plugin Name: File upload per product and send in order email
Description: Adds a tab to upload a file in the product data and sends it as an attachment for "processing" orders, and adds a download link in the confirmation email.
Version: 1.0
Author: <a href="https://josselynjayant.fr">Josselyn jayant</a> & <a href="https://wycan.fr">WYCAN</a>
*/

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly.
}

// Ajouter l'onglet
add_filter('woocommerce_product_data_tabs', 'add_upload_file_tab', 50, 1);
function add_upload_file_tab($tabs) {
    $tabs['upload_file'] = array(
        'label' => __('Téléverser un fichier', 'woocommerce'),
        'target' => 'upload_file_options',
        'class'  => array(),
    );
    return $tabs;
}

// Ajouter le contenu de l'onglet
add_action('woocommerce_product_data_panels', 'upload_file_tab_content');
function upload_file_tab_content() {
    global $post;
    $file_url = get_post_meta($post->ID, '_uploaded_file', true);
    ?>
    <div id='upload_file_options' class='panel woocommerce_options_panel'>
        <div class='options_group'>
            <p class="form-field _uploaded_file_field">
                <label for="_uploaded_file_url"><?php _e('Fichier associé', 'woocommerce'); ?></label>
                <input type="text" class="short" style="width:70%;" name="_uploaded_file_url" id="_uploaded_file_url" value="<?php echo esc_url($file_url); ?>" readonly />
                <button id="upload_file_button" class="button"><?php _e('Ouvrir la galerie', 'woocommerce'); ?></button>
                <button id="delete_file_button" class="button"><?php _e('Supprimer', 'woocommerce'); ?></button>
            </p>
        </div>
    </div>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            var custom_uploader;

            $('#upload_file_button').click(function(e) {
                e.preventDefault();

                if (custom_uploader) {
                    custom_uploader.open();
                    return;
                }

                custom_uploader = wp.media.frames.file_frame = wp.media({
                    title: 'Sélectionner un fichier',
                    button: {
                        text: 'Sélectionner ce fichier'
                    },
                    multiple: false
                });

                custom_uploader.on('select', function() {
                    attachment = custom_uploader.state().get('selection').first().toJSON();
                    $('#_uploaded_file_url').val(attachment.url);
                });

                custom_uploader.open();
            });

            $('#delete_file_button').click(function(e) {
                e.preventDefault();
                $('#_uploaded_file_url').val('');
            });
        });
    </script>
    <?php
}

// Sauvegarder le fichier quand le produit est sauvegardé.
add_action('woocommerce_process_product_meta', 'save_uploaded_file_url');
function save_uploaded_file_url($post_id) {
    if(isset($_POST['_uploaded_file_url'])) {
        update_post_meta($post_id, '_uploaded_file', esc_url($_POST['_uploaded_file_url']));
    }
}

// Ajouter le fichier en pièce jointe à l'e-mail "processing"
add_filter('woocommerce_email_attachments', 'attach_file_to_processing_email', 10, 3);
function attach_file_to_processing_email($attachments, $email_id, $order) {
    if ($email_id === 'customer_processing_order') {
        $items = $order->get_items();

        foreach ($items as $item) {
            $product_id = $item->get_product_id();
            $file_url = get_post_meta($product_id, '_uploaded_file', true);

            if ($file_url) {
                $file_path = get_attached_file(get_attachment_id_by_url($file_url));
                if ($file_path) {
                    $attachments[] = $file_path;
                }
            }
        }
    }
    return $attachments;
}

// Ajouter le lien de téléchargement dans l'e-mail de confirmation
add_action('woocommerce_email_after_order_table', 'add_file_link_to_order_email', 10, 4);
function add_file_link_to_order_email($order, $sent_to_admin, $plain_text, $email) {
    if ($email->id == 'customer_processing_order') {
        $items = $order->get_items();

        foreach ($items as $item) {
            $product_id = $item->get_product_id();
            $file_url = get_post_meta($product_id, '_uploaded_file', true);

            if ($file_url) {
                echo "<h2>Fichier lié à votre produit : " . $item->get_name() . "</h2>";
                if ($plain_text) {
                    echo "Télécharger: " . $file_url . "\n";
                } else {
                    echo "<a href='" . esc_url($file_url) . "'>Télécharger</a><br>";
                }
            }
        }
    }
}

// Fonction pour récupérer l'ID d'une pièce jointe depuis son URL
function get_attachment_id_by_url($url) {
    $id = attachment_url_to_postid($url);
    if ($id) {
        return $id;
    }
    return false;
}

// Ajouter l'icône "dashicons-upload"
function custom_admin_style() {
    echo '<style>
        #woocommerce-product-data ul.wc-tabs li.upload_file_options a:before {
            font-family: "dashicons";
            content: "\f317";
        }
    </style>';
}
add_action('admin_head', 'custom_admin_style');


				
			
Envie de laisser un commentaire ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Tu veux voir d'autres bouts de code ?

WooCommerce Product Buyers List

Ajoute un onglet dans WooCommerce pour afficher les acheteurs d'un produit spécifique avec filtre de date.

Emails additionnels par produits WooCommerce

Ajoute un onglet personnalisé dans les produits WooCommerce pour écrire un e-mail spécifique à chaque produit. Celui-ci sera envoyé dans un e-mail dédié.

Créer une galerie personnalisée avec Elementor

Avec ce code vous allez pouvoir créer une galerie personnalisée avec Elementor

Afficher le poids total des produits dans le panier et commande

Ce code va nous permettre d'afficher le poids total des produits dans la page panier et commande de WooCommerce

ID de CSS personnalisé pour Elementor nested tabs

Ce script nous permettra d'exécuter une URL directement vers un onglet Elementor

Statistiques des commandes WooCommerce par pays

Ce plugin vous permet d'afficher rapidement les volumes de vente en fonction des pays.
ON DISCUTE ?

Une question sur WordPress ?
Un projet web à faire sous traiter par un freelance ?
Je suis votre homme !