同时包含 GTM 和 gtag 脚本的正确方法是什么?

What's the correct way to include both GTM and gtag scripts?

我同时使用 gtag 和 GTM;我如何正确地将它们都包含在中?另外,我想知道我是否应该覆盖 dataLayer 变量或检查它是否已经存在于每个页面上——即 dataLayer = [];window.dataLayer = window.dataLayer || [];?

这看起来正确吗?

<!-- Google Tag Manager -->
<script>
    window.dataLayer = window.dataLayer || [];
</script>

<script>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXX');</script>
<!-- End Google Tag Manager -->

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UAXXXX"></script>

<script>
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'UA-XXXX');
</script>

这完全解决了您的问题:https://support.google.com/tagmanager/answer/7582054?hl=en

简而言之:完全删除您的 gtag 并将所有跟踪逻辑置于 GTM 中。

标签管理器旨在容纳您的所有分析逻辑,并成为访问任何与行为跟踪相关的内容的单一访问点。

关于您的 DL 问题,

window.dataLayer = window.dataLayer || [];

比较合适。永远不要 redefine/overwrite DL。即使你相信它不存在。异步可能是恶性的,所以在这种情况下安全总是好的。

哦,GTM 也会自动提供数据层,因此如果您将逻辑移至其中,您也可以跳过定义它以使源代码更清晰。或者您可以在模板级别定义它,以防您希望能够在加载 GTM 之前将其推入其中。