skip to Main Content

I need to calculate the volume of single order, and store the totale result in the DB to then retrieve it trough the Rest Api and access this parameter there.
i tried to write it down something, but in the checkout i get Internal server error.

This is what I am trying to do (in my imagination):

// Store volume in the database
add_action('woocommerce_checkout_update_order_meta', 'woo_add_cart_volume');

function woo_add_cart_volume( $order_id ) {
    $order        = wc_get_order( $order_id ); // <== Was missing
    $total_volume = 0; // Initializing variable

    foreach( $order->get_items() as $item ){
        $product = $item['data'];
        $qty     = $item['quantity'];

        // Get product dimensions  
        $length = $product->get_length();
        $width  = $product->get_width();
        $height = $product->get_height();

        // Calculations a item level
        $total_volume += $length * $width * $height * $qty;
    }
    
    update_post_meta( $order_id, '_item_volume', $total_volume );
}

Thanks for you precious help be patient with me. Thank you again

2

Answers


  1. This should suffice, to store the total volume in the wp_postmeta table.

    • $product = $item['data']; is not correct, causing you to get the following error further in the code Uncaught Error: Call to a member function get_length() on null. Use $product = $item->get_product(); instead
    • Additional explanation via comment tags added in the code
    // Store total volume in the database (wp_postmeta table)
    function action_woocommerce_checkout_update_order_meta( $order_id ) {
        // Get $order object
        $order = wc_get_order( $order_id );
        
        // Is a WC_Order
        if ( is_a( $order, 'WC_Order' ) ) {
            // Initializing variable
            $total_volume = 0;
            
            // Loop through order items
            foreach( $order->get_items() as $item ) {
                // Get product object
                $product = $item->get_product();
                
                // Get quantity
                $qty = $item->get_quantity();
    
                // Get product dimensions  
                $length = $product->get_length();
                $width  = $product->get_width();
                $height = $product->get_height();
    
                // Calculations a item level
                $total_volume += $length * $width * $height * $qty;
            }
            
            // Store in wp_postmeta table
            update_post_meta( $order_id, '_item_volume', $total_volume );
        }
    }
    add_action( 'woocommerce_checkout_update_order_meta', 'action_woocommerce_checkout_update_order_meta', 10, 1 );
    
    Login or Signup to reply.
  2. You can first save each order item volume as custom order item meta data, with the following:

    add_action('woocommerce_checkout_create_order_line_item', 'woo_order_item_volume', 10, 4 );
    function woo_order_item_volume( $item, $cart_item_key, $values, $order ) {
        $product = $values['data'];
        $qty     = $values['quantity'];
    
        $length = $product->get_length();
        $width  = $product->get_width();
        $height = $product->get_height();
    
        $item->update_meta_data( '_volume', $length * $width * $height * $qty ); // Save item volume
    }
    

    Then you save the order total volume as order meta data as follows:

    add_action('woocommerce_checkout_create_order', 'woo_order_total_volume');
    function woo_order_total_volume( $order ) {
        $total_volume = 0; // Initializing
    
        // Loop through order items
        foreach( $order->get_items() as $item ){
            $total_volume += $item->get_meta( '_volume' ); // Add item volume to total
        }
        $order->update_meta_data( '_total_volume', $total_volume ); // Save total volume for order
    }
    

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

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search