Skip to content

Commit 12aab25

Browse files
Added support for Google Analytics 4 Enhanced eCommerce (#3198)
Co-authored-by: Fabrizio Balliano <fabrizio.balliano@gmail.com>
1 parent 6b08b60 commit 12aab25

File tree

3 files changed

+207
-24
lines changed

3 files changed

+207
-24
lines changed

app/code/core/Mage/GoogleAnalytics/Block/Ga.php

Lines changed: 165 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -197,36 +197,177 @@ protected function _getOrdersTrackingCodeUniversal()
197197
*/
198198
protected function _getOrdersTrackingCodeAnalytics4()
199199
{
200+
$result = [];
201+
$request = $this->getRequest();
202+
$moduleName = $request->getModuleName();
203+
$controllerName = $request->getControllerName();
204+
205+
//purchase events
200206
$orderIds = $this->getOrderIds();
201-
if (empty($orderIds) || !is_array($orderIds)) {
202-
return '';
207+
if (!empty($orderIds) && is_array($orderIds)) {
208+
$collection = Mage::getResourceModel('sales/order_collection')
209+
->addFieldToFilter('entity_id', ['in' => $orderIds]);
210+
/** @var Mage_Sales_Model_Order $order */
211+
foreach ($collection as $order) {
212+
$orderData = [
213+
'currency' => $order->getBaseCurrencyCode(),
214+
'transaction_id' => $order->getIncrementId(),
215+
'value' => number_format($order->getBaseGrandTotal(), 2),
216+
'coupon' => strtoupper($order->getCouponCode()),
217+
'shipping' => number_format($order->getBaseShippingAmount(), 2),
218+
'tax' => number_format($order->getBaseTaxAmount(), 2),
219+
'items' => []
220+
];
221+
222+
/** @var Mage_Sales_Model_Order_Item $item */
223+
foreach ($order->getAllVisibleItems() as $item) {
224+
$orderData['items'][] = [
225+
'item_id' => $item->getSku(),
226+
'item_name' => $item->getName(),
227+
'quantity' => $item->getQtyOrdered(),
228+
'price' => $item->getBasePrice(),
229+
'discount' => $item->getBaseDiscountAmount()
230+
];
231+
}
232+
$result[] = "gtag('event', 'purchase', " . json_encode($orderData, JSON_THROW_ON_ERROR) . ");";
233+
}
203234
}
204-
$collection = Mage::getResourceModel('sales/order_collection')
205-
->addFieldToFilter('entity_id', ['in' => $orderIds]);
206-
$result = [];
207-
/** @var Mage_Sales_Model_Order $order */
208-
foreach ($collection as $order) {
209-
$orderData = [
210-
'currency' => $order->getBaseCurrencyCode(),
211-
'transaction_id' => $order->getIncrementId(),
212-
'value' => number_format($order->getBaseGrandTotal(), 2),
213-
'coupon' => strtoupper($order->getCouponCode()),
214-
'shipping' => number_format($order->getBaseShippingAmount(), 2),
215-
'tax' => number_format($order->getBaseTaxAmount(), 2),
216-
'items' => []
235+
236+
//Begin advanced eCommerce events
237+
//product page
238+
if ($moduleName == 'catalog' && $controllerName == 'product') {
239+
$productViewed = Mage::registry('current_product');
240+
$eventData = [];
241+
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
242+
$eventData['value'] = number_format($productViewed->getFinalPrice(), 2);
243+
$eventData['items'] = [];
244+
$eventData['items'][] = [
245+
'id' => $productViewed->getSku(),
246+
'name' => $productViewed->getName(),
247+
'list_name' => 'Product Detail Page',
248+
'brand' => $productViewed->getAttributeText('manufacturer'),
249+
'category' => 'Products',
250+
'price' => number_format($productViewed->getFinalPrice(), 2),
217251
];
218252

219-
/** @var Mage_Sales_Model_Order_Item $item */
220-
foreach ($order->getAllVisibleItems() as $item) {
221-
$orderData['items'][] = [
222-
'item_id' => $item->getSku(),
223-
'item_name' => $item->getName(),
224-
'quantity' => $item->getQtyOrdered(),
225-
'price' => $item->getBasePrice(),
226-
'discount' => $item->getBaseDiscountAmount()
253+
$result[] = "gtag('event', 'view_item', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
254+
}
255+
256+
//category page
257+
elseif ($moduleName == 'catalog' && $controllerName == 'category') {
258+
$layer = Mage::getSingleton('catalog/layer');
259+
$category = $layer->getCurrentCategory();
260+
$productCollection = clone $layer->getProductCollection();
261+
$toolbarBlock = Mage::app()->getLayout()->getBlock('product_list_toolbar');
262+
$pageSize = $toolbarBlock->getLimit();
263+
$currentPage = $toolbarBlock->getCurrentPage();
264+
if ($pageSize !== 'all') {
265+
$productCollection->setPageSize($pageSize)->setCurPage($currentPage);
266+
}
267+
$eventData = [];
268+
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
269+
$eventData['value'] = 0.00;
270+
$eventData['item_list_id'] = 'category_'.$category->getUrlKey();
271+
$eventData['item_list_name'] = $category->getName();
272+
$eventData['items'] = [];
273+
274+
foreach ($productCollection as $productViewed) {
275+
$eventData['items'][] = [
276+
'id' => $productViewed->getSku(),
277+
'name' => $productViewed->getName(),
278+
'list_name' => 'Product Detail Page',
279+
'brand' => $productViewed->getAttributeText('manufacturer'),
280+
'category' => 'Products',
281+
'price' => number_format($productViewed->getFinalPrice(), 2),
282+
];
283+
$eventData['value'] += $productViewed->getFinalPrice();
284+
}
285+
$eventData['value'] = number_format($eventData['value'], 2);
286+
$result[] = "gtag('event', 'view_item_list', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
287+
}
288+
289+
//cart
290+
elseif ($moduleName == 'checkout' && $controllerName == 'cart') {
291+
$removedProduct = Mage::getSingleton('core/session')->getRemovedProductCart();
292+
if ($removedProduct) {
293+
$_removedProduct = Mage::getModel('catalog/product')->load($removedProduct);
294+
$eventData = [];
295+
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
296+
$eventData['value'] = number_format($_removedProduct->getFinalPrice(), 2);
297+
$eventData['items'] = [];
298+
$eventData['items'][] = [
299+
'id' => $_removedProduct->getSku(),
300+
'name' => $_removedProduct->getName(),
301+
'list_name' => 'Product Detail Page',
302+
'brand' => $_removedProduct->getAttributeText('manufacturer'),
303+
'category' => 'Products',
304+
'price' => number_format($_removedProduct->getFinalPrice(), 2),
305+
];
306+
$result[] = "gtag('event', 'remove_from_cart', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
307+
Mage::getSingleton('core/session')->unsRemovedProductCart();
308+
}
309+
310+
$addedProduct = Mage::getSingleton('core/session')->getAddedProductCart();
311+
if ($addedProduct) {
312+
$_addedProduct = Mage::getModel('catalog/product')->load($addedProduct);
313+
$eventData = [];
314+
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
315+
$eventData['value'] = number_format($_addedProduct->getFinalPrice(), 2);
316+
$eventData['items'] = [];
317+
$eventData['items'][] = [
318+
'id' => $_addedProduct->getSku(),
319+
'name' => $_addedProduct->getName(),
320+
'list_name' => 'Product Detail Page',
321+
'brand' => $_addedProduct->getAttributeText('manufacturer'),
322+
'category' => 'Products',
323+
'price' => number_format($_addedProduct->getFinalPrice(), 2),
324+
];
325+
$result[] = "gtag('event', 'add_to_cart', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
326+
Mage::getSingleton('core/session')->unsAddedProductCart();
327+
}
328+
329+
$productCollection = Mage::getSingleton('checkout/session')->getQuote()->getAllVisibleItems();
330+
$eventData = [];
331+
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
332+
$eventData['value'] = 0.00;
333+
$eventData['items'] = [];
334+
335+
foreach ($productCollection as $productInCart) {
336+
$eventData['items'][] = [
337+
'id' => $productInCart->getSku(),
338+
'name' => $productInCart->getName(),
339+
'list_name' => 'Product Detail Page',
340+
'brand' => $productInCart->getAttributeText('manufacturer'),
341+
'category' => 'Products',
342+
'price' => number_format($productInCart->getFinalPrice(), 2),
343+
];
344+
$eventData['value'] += $productInCart->getFinalPrice();
345+
}
346+
$eventData['value'] = number_format($eventData['value'], 2);
347+
$result[] = "gtag('event', 'view_cart', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
348+
}
349+
350+
//begin checkout
351+
elseif ($moduleName == 'checkout' && $controllerName == 'onepage') {
352+
$productCollection = Mage::getSingleton('checkout/session')->getQuote()->getAllVisibleItems();
353+
$eventData = [];
354+
$eventData['currency'] = Mage::app()->getStore()->getCurrentCurrencyCode();
355+
$eventData['value'] = 0.00;
356+
$eventData['items'] = [];
357+
358+
foreach ($productCollection as $productInCart) {
359+
$eventData['items'][] = [
360+
'id' => $productInCart->getSku(),
361+
'name' => $productInCart->getName(),
362+
'list_name' => 'Product Detail Page',
363+
'brand' => $productInCart->getAttributeText('manufacturer'),
364+
'category' => 'Products',
365+
'price' => number_format($productInCart->getFinalPrice(), 2),
227366
];
367+
$eventData['value'] += $productInCart->getFinalPrice();
228368
}
229-
$result[] = "gtag('event', 'purchase', " . json_encode($orderData, JSON_THROW_ON_ERROR) . ");";
369+
$eventData['value'] = number_format($eventData['value'], 2);
370+
$result[] = "gtag('event', 'begin_checkout', " . json_encode($eventData, JSON_THROW_ON_ERROR) . ");";
230371
}
231372
return implode("\n", $result);
232373
}

app/code/core/Mage/GoogleAnalytics/Model/Observer.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,30 @@ public function setGoogleAnalyticsOnOrderSuccessPageView(Varien_Event_Observer $
4949
$block->setOrderIds($orderIds);
5050
}
5151
}
52+
53+
/**
54+
* Add 'removed item' from cart into session for GA4 block to render event on cart view
55+
*
56+
* @param Varien_Event_Observer $observer
57+
*/
58+
public function removeItemFromCartGoogleAnalytics(Varien_Event_Observer $observer)
59+
{
60+
$productRemoved = $observer->getEvent()->getQuoteItem()->getProduct();
61+
if ($productRemoved) {
62+
Mage::getSingleton('core/session')->setRemovedProductCart($productRemoved->getId());
63+
}
64+
}
65+
66+
/**
67+
* Add 'added item' to cart into session for GA4 block to render event on cart view
68+
*
69+
* @param Varien_Event_Observer $observer
70+
*/
71+
public function addItemToCartGoogleAnalytics(Varien_Event_Observer $observer)
72+
{
73+
$productAdded = $observer->getEvent()->getQuoteItem()->getProduct();
74+
if ($productAdded) {
75+
Mage::getSingleton('core/session')->setAddedProductCart($productAdded->getId());
76+
}
77+
}
5278
}

app/code/core/Mage/GoogleAnalytics/etc/config.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,22 @@
7272
</googleanalytics_order_success>
7373
</observers>
7474
</checkout_multishipping_controller_success_action>
75+
<sales_quote_remove_item>
76+
<observers>
77+
<googleanalytics_remove_item>
78+
<class>googleanalytics/observer</class>
79+
<method>removeItemFromCartGoogleAnalytics</method>
80+
</googleanalytics_remove_item>
81+
</observers>
82+
</sales_quote_remove_item>
83+
<sales_quote_add_item>
84+
<observers>
85+
<googleanalytics_add_item>
86+
<class>googleanalytics/observer</class>
87+
<method>addItemToCartGoogleAnalytics</method>
88+
</googleanalytics_add_item>
89+
</observers>
90+
</sales_quote_add_item>
7591
</events>
7692
<layout>
7793
<updates>

0 commit comments

Comments
 (0)