如何将PHP变量传递至GA数据层多产品数组以跟踪全部订单商品
解决GA仅跟踪最后一件商品的问题
问题出在你当前的代码中,PHP循环结束后,$order变量只保留了最后一个商品的数据,所以JavaScript里只能拿到最后一件商品的信息。要获取所有商品详情,你需要先在PHP中收集所有订单商品的数据,再传递给Google Tag Manager的数据层。
步骤1:修改PHP代码,收集所有商品数据
在原有循环中,新增一个数组来存储每一件商品的信息,最后将数组转为JSON格式(方便JS解析):
<?php // 初始化数组存储所有商品数据 $productsData = []; $i = 1; foreach($previousorder->LineItems->OrderDetailLineItems as $order){ $previousOrderHTML = ""; if($i == 2){ $i = 1; $class = " odd"; }else{ $i++; $class = ""; } if(!$order->LineDiscountAmountGross == "0"){ $lineDiscount = sprintf('<span class="required">-%s</span>', $locale->formatCurrency($order->LineDiscountAmountGross, $nwc->getTemplateValue("lb_CurrencySymbol"))); }else{ $lineDiscount = "-"; } $previousOrderHTML .= sprintf('<tr><td align="left" valign="top" class="extra-padding first-column details-row-one%s">%s</td><td align="left" valign="top" class="item-name extra-padding details-row-one%s">%s %s %s', $class, $order->ProductCode, $class, $order->ProductGroupName, $order->Size, $order->Colour); if(isset($order->BundleProductList->PriceListBundleProductList) && count($order->BundleProductList->PriceListBundleProductList) >= 1){ $previousOrderHTML .= '<span class="offer-small">'; foreach($order->BundleProductList->PriceListBundleProductList as $bundleItem){ $previousOrderHTML .= sprintf("<br />- %s %s %s (%s) - %s %s", $bundleItem->ProductGroupName, $bundleItem->Size, $bundleItem->FabricColour, $bundleItem->ProductCode, $nwc->getValue("lb_RRP"), $locale->FormatCurrency($bundleItem->Original_GROSS_Price)); } $previousOrderHTML .= '</span>'; } $previousOrderHTML .= sprintf('</td><td align="left" valign="top" class="extra-padding details-row-one%s">%s</td><td align="center" valign="top" class="extra-padding details-row-one%s">%s</td><td align="right" valign="top" class="extra-padding details-row-one%s">%s</td></td><td align="right" valign="top" class="extra-padding details-row-one last-column%s">%s</td></tr>', $class, $locale->formatCurrency($order->RRP, $nwc->getTemplateValue("lb_CurrencySymbol")), $class, $order->Quantity, $class, $lineDiscount, $class, $locale->formatCurrency($order->GrossDiscountPrice, $nwc->getTemplateValue("lb_CurrencySymbol"))); echo $previousOrderHTML; // 关键:将当前商品的核心信息加入数组 $productsData[] = [ 'id' => $order->ProductCode, 'name' => $order->ProductGroupName, 'price' => $order->RRP, 'quantity' => $order->Quantity // 如果需要额外字段(如分类、品牌),可在此添加 ]; } // 将商品数组转为JSON字符串,供JS使用 $productsJson = json_encode($productsData); ?>
步骤2:修改JavaScript代码,传入所有商品数据
不再单独定义单个商品的变量,直接使用PHP生成的JSON数组,传递给dataLayer的products字段:
<script type="text/javascript"> $(function(){ var cartTot = '<?=$previousorder->TotalOrderAmountExVAT;?>'; var curr = '<?=$ShoppingCartSummary->Currency;?>'; var ref = '<?=$previousorder->OurReferenceNumber;?>'; var vatx = '<?=$previousorder->TotalVATAmount;?>'; // 解析PHP传递的商品JSON数组 var products = <?=$productsJson;?>; dataLayer.push({ 'ecommerce': { 'purchase': { 'actionField': { 'id': ref, // 交易ID,必填 'affiliation': 'Online Store', 'revenue': cartTot, // 注意:GA的revenue需包含税费和运费,若当前值不含税,需调整为含税总额 'tax': vatx, 'shipping': '', }, 'products': products // 传入所有商品的数组 } } }); }); </script>
额外注意事项
- 确认
revenue字段的正确性:Google Analytics要求revenue是订单的总交易额(包含税费、运费),如果你的$previousorder->TotalOrderAmountExVAT是不含税金额,需要替换为含税总额的字段。 - 如果有捆绑商品(Bundle)需要单独跟踪,可以在
$productsData中添加捆绑商品的条目,或者根据GA的ecommerce规范调整字段。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

