Come aggiungere un costo aggiuntivo per ogni prodotto – Woocommerce

Ecco qui come aggiungere un extra costo alla scheda prodotto Woocommerce sistematicamente tramite una casella di selezione, che va ad aggiungere il costo ad ogni prodotto aggiunto al carrello.

/*
 * garanzia aggiuntiva
 */

// Backend: Additional pricing option custom field
add_action( 'woocommerce_product_options_pricing', 'wc_cost_product_field' );
function wc_cost_product_field() {
    woocommerce_wp_text_input( array(
        'id'        => '_warrenty_price',
        'class'     => 'wc_input_price short',
        'label'     => __( 'Warrenty', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')'
    ));
}

// Backend: Saving product pricing option custom field value
add_action( 'woocommerce_admin_process_product_object', 'save_product_custom_meta_data', 100, 1 );
function save_product_custom_meta_data( $product ){
    if ( isset( $_POST['_warrenty_price'] ) )
        $product->update_meta_data( '_warrenty_price', sanitize_text_field($_POST['_warrenty_price']) );
}

// Front: Add a text input field inside the add to cart form on single product page
add_action('woocommerce_single_product_summary','add_warrenty_price_option_to_single_product', 2 );
function add_warrenty_price_option_to_single_product(){
    global $product;

    if( $product->is_type('variable') || ! $product->get_meta( '_warrenty_price' ) ) return;

    add_action('woocommerce_before_add_to_cart_button', 'product_option_custom_field', 30 );
}

function product_option_custom_field(){
    global $product;

    $active_price = (float) $product->get_price();
    $warrenty_price = (float) $product->get_meta( '_warrenty_price' );
    $warrenty_price_html   = strip_tags( wc_price( wc_get_price_to_display( $product, array('price' => $warrenty_price ) ) ) );
    $active_price_html   = wc_price( wc_get_price_to_display( $product ) );
    $disp_price_sum_html = wc_price( wc_get_price_to_display( $product, array('price' => $active_price + $warrenty_price ) ) );

    echo '<div class="hidden-field">
    <p class="form-row form-row-wide" id="warrenty_option_field" data-priority="">
    <span class="woocommerce-input-wrapper"><span class="war-title"> ' . __("Warrenty price:", "Woocommerce") .
    '</span><label class="checkbox"><input type="checkbox" class="input-checkbox " name="warrenty_option" id="warrenty_option" value="1"> Add Warrenty for ' . $warrenty_price_html .
    '</label></span></p>
    <input type="hidden" name="warrenty_price" value="' . $warrenty_price . '">
    <input type="hidden" name="active_price" value="' . $active_price . '"></div>';

    // Jquery: Update displayed price
    ?>
    <script type="text/javascript">
    jQuery(function($) {
        var cb = 'input[name="warrenty_option"]'
            pp = 'p.price';

        // On change / select a variation
        $('form.cart').on( 'change', cb, function(){
            if( $(cb).prop('checked') === true )
                $(pp).html('<?php echo $disp_price_sum_html; ?>');
            else
                $(pp).html('<?php echo $active_price_html; ?>');
        })

    });
    </script>
    <?php
}

// Front: Calculate new item price and add it as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_product_data', 10, 3);
function add_custom_product_data( $cart_item_data, $product_id, $variation_id ) {
    if (isset($_POST['warrenty_option']) && !empty($_POST['warrenty_option'])) {
        $cart_item_data['new_price'] = (float) ($_POST['active_price'] + $_POST['warrenty_price']);
        $cart_item_data['warrenty_price'] = (float) $_POST['warrenty_price'];
        $cart_item_data['active_price'] = (float) $_POST['active_price'];
        $cart_item_data['unique_key'] = md5(microtime().rand());
    }

    return $cart_item_data;
}

// Front: Set the new calculated cart item price
add_action('woocommerce_before_calculate_totals', 'extra_price_add_custom_price', 20, 1);

function extra_price_add_custom_price($cart) {
    if (is_admin() && !defined('DOING_AJAX'))
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach($cart->get_cart() as $cart_item) {
        if (isset($cart_item['new_price']))
            $cart_item['data']->set_price((float) $cart_item['new_price']);
    }
}

// Front: Display option in cart item
add_filter('woocommerce_get_item_data', 'display_custom_item_data', 10, 2);

function display_custom_item_data($cart_item_data, $cart_item) {
    if (isset($cart_item['warrenty_price'])) {
        $cart_item_data[] = array(
            'name' => __("Extra Warrenty", "woocommerce"),
            'value' => strip_tags( '+ ' . wc_price( wc_get_price_to_display( $cart_item['data'], array('price' => $cart_item['warrenty_price'] ) ) ) )
        );
    }

    return $cart_item_data;
}

// Save warranty as order item custom meta data and display it everywhere
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_product_warranty', 10, 4 );
function save_order_item_product_warranty( $item, $cart_item_key, $values, $order ) {
    if( isset($values['warrenty_price']) && $values['warrenty_price'] > 0 ) {
        $key = __("Extra Warrenty", "woocommerce");
        $value = strip_tags( '+ '. wc_price( wc_get_price_to_display( $values['data'], array('price' => $values['warrenty_price']) ) ) );
        $item->update_meta_data( $key, $value );
    }
}
//aggiungere la garanzia extra nel backend del sito tra gli ordini
add_action( 'woocommerce_admin_order_data_after_order_details', 'warrenty_price_order_meta_general' );

function warrenty_price_order_meta_general( $order ){  ?>

        <br class="clear" />
        <h4>Gift Order <a href="#" class="edit_address">Edit</a></h4>
        <?php 
            /*
             * get all the meta data values we need
             */ 
            $_warrenty_price = get_post_meta( $order->get_id(), '_warrenty_price', true );

        ?>
        <div class="address">
            <p><strong>Warranty</strong></p>
            <?php

                if( $_warrenty_price ) : 
                ?>
                    <p><strong>Price:</strong> <?php echo $_warrenty_price ?></p>

                <?php
                endif;
            ?>
        </div>
<?php } ?>

//aggiungere la dicitura della garanzia extra nell'email
add_action('woocommerce_email_order_meta', 'warrenty_price_email_order_meta', 10, 3);

function warrenty_price_email_order_meta($order_obj, $sent_to_admin, $plain_text) {


    $warrenty_price = get_post_meta($order_obj->get_id(), '_warrenty_price', true);

    if (empty($warrenty_price))
        return;

    if ($plain_text === false) {


        echo '<h2>Warranty</h2>
        <ul>
        <li><strong>Price:</strong> ' . $warrenty_price . '</li>
        </ul>';
    } else {

        echo "Warranty\n
        Price: $warrenty_price";
    }
}

Volendo questo codice si può personalizzare molto di più in modo che sia attribuito a livello di categoria prodotto, senza andare a modificare ogni singolo prodotto o facendo in modo di applicarlo una volta sola anche se sono più prodotti.
Il motivo potrebbe essere, oltre alla garanzia aggiuntiva, un costo sulla riparazione o un costo sulla personalizzazione del prodotto.
Le possibilità sono praticamente infinite e se non sai come customizzare il tuo Woocommerce, contattami attraverso questo modulo.

Hai un problema con il web?

Il tuo sito internet non vuole funzionare?

Vuoi rinnovarlo o sistemarlo?

Hai un’idea di integrazione ma non sai se è possibile realizzarla o meno?

    Accetto la Privacy Policy
    Autorizzo al trattamento dei miei dati personali, per ricevere le informazioni richieste attraverso questo modulo di contatto. I dati da te inseriti attraverso questo modulo verranno utilizzati solo per essere da me ricontattato.

    Recensioni

    Scrivimi una recensione

    Questo QR Code ti permette di lasciarmi una recensione in maniera facile e veloce.

    Altrimenti qui sotto ti lascio un bottone, con il quale puoi lasciare la recensione direttamente su Google My Business.

    Lascia una recensione su Google