1

I am trying to catch productId and price from WooCommerce checkout, but not able to figure out why its not working.

I created a hook which I placed in functions.php (Astra theme)

add_action( 'woocommerce_checkout_order_processed', 'is_express_delivery',  1, 1  );
function is_express_delivery( $order_id ){

   $order = new WC_Order( $order_id );
   
   $product = wc_get_product( $order_id );
   
   $productId = $product->get_id(); 
   $price = $product->get_price();
   
   ?>
    <script type="text/javascript">
        var clicky_goal = { id: ""<?php echo $productId ?>"", revenue: ""<?php echo $price ?>"" };
    </script>
    <?php
}

Basically, I want to catch productId and price on cart submission and send it to tracking tool

7uc1f3r
  • 28,449
  • 17
  • 32
  • 50
dcron
  • 47
  • 6
  • 1
    The `woocommerce_checkout_order_processed` hook is run when an order's status changes to "processed". A better one might be when the order is actually created, on checkout: `woocommerce_checkout_create_order_line_item`. – Jason Oct 12 '21 at 07:49

2 Answers2

1
  • woocommerce_checkout_order_processed contains not 1 but 3 arguments
  • An order usually consists of several products, so $product = wc_get_product( $order_id ); won't work

Use: How to make Google Chrome JavaScript console persistent? to view the results in the console log.

So you get:

function action_woocommerce_checkout_order_processed( $order_id, $posted_data, $order ) {
    // Initialize
    $product_ids = array();
    $prices = array();
    
    // Loop through order items
    foreach ( $order->get_items() as $item_id => $item ) {
        // Get the WC_Product Object
        $product = $item->get_product();
        
        // Product ID
        $product_id = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
        
        // Price
        $product_price = $product->get_price();
        
        // Push to array
        $product_ids[] = $product_id;
        $prices[] = $product_price;
    }
    ?>
    <script>
    jQuery(function($) {
        // jQuery variables
        var product_ids = <?php echo json_encode( $product_ids ); ?>;
        var prices = <?php echo json_encode( $prices ); ?>;
        
        // Log
        console.log( product_ids );
        console.log( prices );
    });
    </script>
    <?php
}
add_action( 'woocommerce_checkout_order_processed', 'action_woocommerce_checkout_order_processed', 10, 3 );
7uc1f3r
  • 28,449
  • 17
  • 32
  • 50
0

You can use the woocommerce_checkout_create_order_line_item hook. It's run for each order item, at the moment an order is created.

If you're working with variations, you might need that ID as well.

add_action('woocommerce_checkout_create_order_line_item', 'is_express_delivery',  1, 4);
function is_express_delivery($item, $cartItemKey, $values, $order)
{
    $itemDetails = [
        'productId' => $item->get_product_id(),
        'variationId' => $item->get_variation_id(),
        'itemPrice' => $item->get_total(),
        'itemQuantity' => $item->get_quantity(),
        'itemTotal' => $item->get_total() * $item->get_quantity(),
    ];

    // your work with this array
}

Code is tested and works - place it in your child theme's function.php file.

Jason
  • 245
  • 1
  • 4
  • 12