Enhanced Ecommerce dataLayer WooCommerce

Tags: , , , ,



I’m trying to set up a dataLayer for WooCommerce Thank you page. Look here what I’ve done so far (the variables are not completely set up yet):

function dataLayer_google_gtm( $order_id ) {

    // Lets grab the order
    $order = wc_get_order( $order_id );

    // Products
    $products = $order->get_items();
    ?>

    <script>
        dataLayer.push({
        'ecommerce': {
            'purchase': {
                'actionField':{
                    'id':'<?php echo $order->get_order_number(); ?>',
                    'affiliation':'CHACAFOODS', 
                    'revenue':'<?php echo $order->get_order_total(); ?>',
                    'tax':'<?php echo $order->get_total_tax(); ?>',
                    'shipping':'<?php echo $order->get_shipping(); ?>',
                    'coupon':'<?php echo $order->get_order_discount_total(); ?>',
                },
                window['service'].push('products':,[
                <?php
                    $count = 0;
                    foreach( $products as $item_id => $item ) {
                        $count++;
                        $product = $order->get_product_from_item( $item ); ?>
                        {
                            'name':<?php echo $item['name']; ?>',
                            'id':
                            'price': '<?php echo $order->get_line_subtotal( $item ); ?>',
                            'brand':
                            'category':
                            'variant':
                            'quantity': '<?php echo $item['qty']; ?>'
                        }
                <?php if ( count( $order->get_items() ) > $count ) { echo ","; } ?>
                <?php } ?>
                ]);
            }
        }
        });
    </script>
    <?php
}
add_action( 'woocommerce_order_status_completed', 'prefix_service_conversion_tracking' );

Can anybody tell me if my structure above will look like the enhanced ecommerce structure below in result?

google dataLayer structure:

<script>
// Send transaction data with a pageview if available
// when the page loads. Otherwise, use an event when the transaction
// data becomes available.
dataLayer.push({
  'ecommerce': {
    'purchase': {
      'actionField': {
        'id': 'T12345',                         // Transaction ID. Required for purchases and refunds.
        'affiliation': 'Online Store',
        'revenue': '35.43',                     // Total transaction value (incl. tax and shipping)
        'tax':'4.90',
        'shipping': '5.99',
        'coupon': 'SUMMER_SALE'
      },
      'products': [{                            // List of productFieldObjects.
        'name': 'Triblend Android T-Shirt',     // Name or ID is required.
        'id': '12345',
        'price': '15.25',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Gray',
        'quantity': 1,
        'coupon': ''                            // Optional fields may be omitted or set to empty string.
       },
       {
        'name': 'Donut Friday Scented T-Shirt',
        'id': '67890',
        'price': '33.75',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Black',
        'quantity': 1
       }]
    }
  }
});
</script>

Thanks so much for your help!

Best regards, Anton

Answer

You can try something like this:

<script>
      dataLayer.push({
          'ecommerce': {
            'currencyCode': '<?php echo $order->get_order_currency(); ?>',
            'purchase': {
              'actionField':{
                'id': '<?php echo $order->get_order_number(); ?>',
                'affiliation': 'WooCommerce',
                'revenue': <?php echo number_format($order->get_subtotal(), 2, ".", ""); ?>,
                'tax': <?php echo number_format($order->get_total_tax(), 2, ".", ""); ?>,
                'shipping': <?php echo number_format($order->calculate_shipping(), 2, ".", ""); ?>,
                <?php if($order->get_used_coupons()): ?>
                    'coupon': '<?php echo implode("-", $order->get_used_coupons()); ?>'
                <?php endif; ?>
              },
              'products': [
                  <?php
                    foreach($order->get_items() as $key => $item):
                      $product = $order->get_product_from_item( $item );
                      $variant_name = ($item['variation_id']) ? wc_get_product($item['variation_id']) : '';
                  ?>
                      {
                        'name': '<?php echo $item['name']; ?>',
                        'id': '<?php echo $item['product_id']; ?>',
                        'price': '<?php echo number_format($order->get_line_subtotal($item), 2, ".", ""); ?>',
                        'brand': '',
                        'category': '<?php echo strip_tags($product->get_categories(', ', '', '')); ?>',
                        'variant': '<?php echo ($variant_name) ? implode("-", $variant_name->get_variation_attributes()) : ''; ?>',
                        'quantity': <?php echo $item['qty']; ?>
                      },
                  <?php endforeach; ?>
                ]
            }
          }
      });
    </script>

For Brand you could use a product attribute that you then print.

Best of luck!



Source: stackoverflow