php - Save custom values from Woocommerce checkout as custom order meta data ← (PHP)

In Woocommerce, I have a checkout page (review order) with custom data. I need to find a hook to register some custom data ($totaleiva_1 and $totalefinitocarrello) in the order and then I have to send them in email new order.

I'm not able to make it for instance. Any advice or help please?


Edit - That is my code:

$totaleiva_1 = 0; 
$items = $woocommerce->cart->get_cart(); 
foreach($items as $item ) { 
    $totaleiva_1 += $totalForSebeneArray[$item ['data']->get_id()]; 
} 
$totaleiva_1 = number_format($totaleiva_1, 2, '.', ''); 
$totalefinitocarrello = $totaleiva_1 + $total; echo "€"; 
echo $totalefinitocarrello; 

Answer



Solution:

You will need to add and display 2 hidden fields with the 2 desired values (to be able to get and save them as custom order meta data on submission).

Also your code is a bit outdated and can be simplified.

Here is your revisited code:

$totaleiva_1 = 0; 

// Loop through cart items
foreach (WC()->cart->get_cart() as $cart_item ) { 
    $totale_iva_1 += $totalForSebeneArray[$cart_item['data']->get_id()]; 
} 

$totale_finito_carrello = wc_price( $totale_iva_1 + $total ); 

echo $totale_finito_carrello; 

// Display 2 hidden input fields
echo '<input type="hidden" id="totaleiva1" name="totaleiva1" value="'.$totale_iva_1.'">
<input type="hidden" id="tfcarrello" name="tfcarrello" value="'.$totale_finito_carrello.'">';

Then you will save that data as custom order meta data using:

add_action('woocommerce_checkout_create_order', 'save_order_custom_meta_data', 10, 2 );
function save_order_custom_meta_data( $order, $data ) {
    if( isset($_POST['totaleiva1']) && ! empty($_POST['totaleiva1']) ) {
        $order->update_meta_data( '_totale_iva_1', esc_attr( $_POST['totaleiva1'] ) );
    }
    if( isset($_POST['tfcarrello']) && ! empty($_POST['tfcarrello']) ) {
        $order->update_meta_data( '_totale_fin_carrello', esc_attr( $_POST['tfcarrello'] ) );
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.


Now to get that data and use it anywhere:

1) from the order ID variable, use:

$totaleiva_1 = get_post_meta( $order_id, '_totale_iva_1', true );
$totalefinitocarrello = get_post_meta( $order_id, '_totale_fin_carrello', true );

2 from the WC_Order Object:

$totaleiva_1 = $order->get_meta('_totale_iva_1');
$totalefinitocarrello = $order->get_meta('_totale_fin_carrello');

To display those in Woocommerce new order notification, ou will use:

add_action( 'woocommerce_email_order_details', 'email_order_details_action_callback', 5, 4 );
function email_order_details_action_callback( $order, $sent_to_admin, $plain_text, $email ){
    if( $email->id === 'new_order' ) {
        if ( $tiva1  = $order->get_meta('_totale_iva_1') ) {
            echo '<p>'. __("Totale IVA") . ': ' . $tiva1 . '</p>';
        }

        if ( $tfcarr = $order->get_meta('_totale_fin_carrello') ) {
            echo '<p>'. __("Totale finito carrello") . ': ' . $tfcarr . '</p>';
        }
    }
}

Display the fields in Admin order pages:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'admin_order_after_billing_address_callback', 10, 1 );
function admin_order_after_billing_address_callback( $order ){
    if ( $tiva1  = $order->get_meta('_totale_iva_1') ) {
        echo '<p>'. __("Totale IVA") . ': ' . $tiva1 . '</p>';
    }
    if ( $tfcarr = $order->get_meta('_totale_fin_carrello') ) {
        echo '<p>'. __("Totale finito carrello") . ': ' . $tfcarr . '</p>';
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

Now I think that all your IVA custom calculations can be handled by Woocommerce using available settings possibilities, as you are making things Much more complicated everywhere.

Source