
2020年3月13日
如何使用Google跟踪代码管理器提取部分URL路径
已更新:2020年3月13日
这篇博客文章听起来可能类似于我’最近出版, 如何提取URL的查询参数,但这一次解决了一些不同的问题。在该博客文章中,我正在使用查询参数。例如,我能够获取 productId 如果页面URL是 http:// _www.example.com?productId=123.
但是今天’s blog post, let’假设我们有以下结构的URL: //www.example.com/products/category_name/id 我们想把 分类名称 放入GTM变量中(知道类别名称始终位于“页面路径”的第二个子目录中。
我们如何实现这一目标?让’s find out.
如果你’不知道URL中的子目录是什么 在这个博客中 帖子显示清楚。
回到我们的例子。为了访问URL的第二个子目录,我们需要编写一些自定义JavaScript。我们’请尝试逐步进行操作,以便对那些刚开始使用JavaScript的人更容易理解(免责声明:我也属于 仍然 以JS开头)。

匿名JavaScript函数
为了提取部分网址路径,我们’我将需要使用自定义JS变量。这个通用变量必须包含一个满足两个条件的脚本:
- 它必须是匿名函数,例如 function(){… }
- 它必须返回一些值
毫不犹豫地,让’s打开文本或代码编辑器(或仅在GTM界面中的Custom JS编辑器)并粘贴以下代码:
function(){ }
它不会做任何事情(但这只是我们Custom JS变量的开始)。
现在,让’创建一个JavaScript变量并将其命名 pageUrl然后,让’为其分配一个值, window.location.href:
function(){ var pageUrl = window.location.href; }
window.location.href 是一种访问用户/访问者所在页面的当前URL的方法。在下一步中,让’s 返回 that pageUrl 但只有一部分。我们可以通过 split()方法,它将字符串(在本例中为URL)拆分为子字符串数组。如果你’re new to this, we’我会仔细看看。
添加一个 返回对该脚本的声明(因为GTM中的每个Custom JS变量都必须返回某些内容),然后是您要返回的变量的名称Â (pageUrl),最后,让’s add a 分裂 方法。
function(){ var pageUrl = window.location.href; 返回 pageUrl.split(); }
但是那’不是全部。我们需要告诉 split() 方法我们要如何精确地拆分页面URL。如果回到我们的例子,我们’re working with the //www.example.com/products/category_name/id (如果您是’重新尝试遵循他的方法,您可以在URL包含某些子目录的其他页面上工作)。
从该URL,我们要访问 分类名称。由于它被斜杠(/)包围,因此可以用作我们的分隔符(分隔符) 分裂 方法。让’s加上该斜杠(用引号引起来)。
function(){ var pageUrl = window.location.href; 返回 pageUrl.split("/"); }
结果,这将返回一个数组(简单地说, 清单)中的所有部分。这里’更直观的解释。使用之前 split() 方法,页面URL如下所示:
//www.example.com/products/category_name/id
使用该方法后,结果在视觉上将如下所示:
如您在上方所见,URL被分为6项列表,以 https 并以 ID。 列表中的第二项为空(“”),因为https中的两个斜杠之间没有任何内容://.
We’re almost there. 分类名称 已与URL分离,我们现在要做的就是从此数组中选择它。这可以通过定义该数组成员的索引来完成。在我们的示例中,该数字为4。如果您要获取“页面路径”的第3级( ID),那么您应该输入数字5。
在split方法之后添加它(用方括号括起来):
function(){ var pageUrl = window.location.href; 返回 pageUrl.split("/")[4]; }
唐e!
Custom JavaScript 变量
现在,让’将此代码粘贴到自定义JavaScript变量中(在GTM界面中)。您可以使用适合容器命名约定的任何名称进行命名,例如 cjs–URL的第二个子目录
Save the 变量, enable the 预览和调试模式Â转到要测试此变量的页面(请确保URL在“页面路径”中包含某些内容(至少2个级别,又名文件夹,又名子目录)。
预期结果应如下所示(当然,您的情况下该值将有所不同)。
这也可以应用于其他网址
唐’仅使用页面URL来限制自己。您也可以将其应用于其他地址,例如,点击URL,视频URL等。您只需要为 pageUrl 变量(在该自定义JavaScript中)。这里’s是一个示例,说明您要访问Clicked URL的特定部分的外观。
function(){ var clickUrl= {{Click URL}}; 返回 clickUrl.split("/")[4]; }
而不是 window.location.href,我们使用了 点击网址 GTM容器的变量(只需确保在容器中启用了此内置变量)。然后脚本将 点击网址,将其拆分(“/”),然后选择索引为4的项目。
请记住,JavaScript中的索引以0(零)开头,因此,第4个元素实际上是第5个元素。
唐’t limit yourself
有无数的用例 分裂() 方法真的很有价值。假设您有一个名为{{dlv –productId}},它返回以下结构的产品ID— productId-variantId (例如123456-887766),而您只想使用 productId (没有 variantId)。
在这种情况下,自定义JS代码如下所示:
function(){ var productId = {{dlv- productId}}; 返回 productId.split("-")[0]; }
说明:
- 我在代码中将var(变量)命名为 productId
- 我为该变量分配了数据层变量的值 {{dlv– productId}}
- 我将破折号(–)作为分隔符(分隔符),因为我想在横杠所在的位置正确分割产品ID(提醒:初始ID看起来像这样 123456-887766)
- 当一个 分裂() 方法创建了两个项目的数组(123456 和 887766)。 我选择了第一个。在JavaScript中,第一项的索引号是0(零),而不是1,因此我输入了0。
如果该变量将返回值123456 dlv– productId 变量’值是123456-887766)。
使用Google跟踪代码管理器提取部分网址路径:最终词
以便’有关这篇简短的博客文章。的 split() 当我需要解析一个字符串(通常是URL)并获取它的一部分时(如果输入值始终遵循相同的结构),该方法在此类任务中绝对非常有用。
如果有任何极端情况,’d想找到解决方法,请在下面给我留言。这样的案例也帮助我学习(自从我’我仍然在我的JS旅程的开始阶段)。

真好!我最近设置了一些非常相似的方法来跟踪出站会员链接。另外,如果没有值,则将值设置为undefined,因为如果类别或操作中有空值,我会遇到GTM无法触发事件的问题。我还将值通过另一个变量/函数传递,以根据需要设置文本格式:
function(){
var path = {{Click URL}}。split(“ / go /”)[1] .split(“ /”);
var product = path [2]!==''吗? path [2]:未定义;
返回{{Go Link-Format}}(product);
}
感谢这篇文章朱利叶斯!
很有用。我最近对此用例有需求,并做了类似的事情。
是否存在这种方法不起作用并为变量返回undefined的实例?
您只需要说明您的情况,共享指向您正在处理的页面的链接即可,我可以看看:)这样的帮助比谈论假设的情况更容易
如果您想避免分裂并且只对整个路径感兴趣
function(){
var url =新网址({{Click URL}})
返回url.pathname;
}
如果有人对完整点击URL路径感兴趣,则不需要自定义JS。使用以下变量可以达到相同的结果:
-类型:URL
-组件类型:路径
- More Settings > URL Source: {{Click URL}}
不知道这是否是我想要做的正确方法。
有没有办法使用正则表达式或其他方法来修改url,使其对分析更加通用。例如,网址可能是/ product / 123 / details。在这种情况下,我们的应用程序和分析有很多独特的ID(例如123),使分析更难汇总,我们更关心/ product / details上有多少人,而不必关注哪个特定产品,因此有一种方法可以操纵并删除123部分而不爆炸每个网址?
尝试使用正则表达式表变量。但是您将需要具备一些正则表达式知识。
我如何使用正则表达式?
感谢您的输入。很有帮助。我有个问题。
我使用您的脚本下载了第六个“ /”之后的URL片段,但是该脚本使我的URL太长了。
我的脚本如下所示:
function(){
var pageUrl = window.location.href;
返回pageUrl.split(“ /”)[6];
}
但是,我通过脚本下载的网址看起来像这样:
auto23434,Skoda_Octavia-2017
我只想下载URL中以逗号开头的部分,即“ auto23434”。
您能帮我修改脚本吗?
嗨,我在这篇博客文章中已经解释了同样的原理
function(){
var pageUrl = window.location.href;
返回pageUrl.split(“ /”)[6] .split(',')[0];
}
嗨,朱利叶斯。目前正在参加您的GTM中级课程,发现它非常有价值!我的问题是,当我们尝试跟踪的是附加到网址末尾的唯一ID时,我们该如何拆分?换句话说,位置可能会从第3位更改为第5位,但始终在最后。
在方括号之间,您应该输入以下内容:
pageUrl.split(“ /”)。length-1
这将返回最后一个索引
最终结果可能看起来像这样(但是,当然,您可能需要根据具体情况进行调整)
function(){
var pageUrl = window.location.href;
返回pageUrl.split(“ /”)[pageUrl.split(“ /”)。length-1];
}
感谢您所做的出色工作,那些剧烈的小事可能会带来麻烦。我遇到了以下情况:
name-name2-name3作为在页面url上使用slpit方法的结果
我想知道如何获取结果'name name2 name3'(.replace对我不起作用)
替换只能执行一次。您有2个破折号。
使用这个temp.split('-')。join('')
工作得很好。谢谢
很棒的文章,朱利叶斯(一如既往)!
如果我能为您所从事的SaaS公司的边缘案例提供一些见解而麻烦您,请执行以下操作:
- We use only one form for "Request a demo" and "联系我们"
-无论您点击哪个行业或产品,它都会转到相同的/ contact-us页面。
-我的想法是使用此网址提取变量在Google Analytics(分析)上设置不同的转化目标。例如行业>索取演示或产品>Contact us
尝试在GTM中使用引荐来源网址变量。
你好!根据您的建议,我将其设置为捕获页面路径的末尾。除非在末尾添加了参数(特别是“?glid =“),否则效果很好。然后,它将获取这些参数。有什么办法可以防止这种情况?
感谢所有帮助,朱利叶斯!
您可以分享无法使用的网址示例吗?还有另一个例子,它在哪里工作?
该URL是动态的,可在页面加载后添加一个唯一的标识符(这是我试图捕获的自定义维度,名为Quote Number)。它以“ example.com/campaign/?utm=4600”开始,然后在加载时转换为“ example.com/campaign/543a726c81001”之类的东西。该着陆页已在带有自动标记的Google Ads广告系列中使用,因此最终结果可能类似于:“ example.com/campaign/543a726c81001?gclid=CjwKCAjwkJj6BRA-EiwA0ZVPViS77Swqm27VVjcP”
奇怪的是,有时它会正确捕获字符串,而其他时候会捕获gclid参数。它成功的时间约为1/4。
如果在“?gclid = CjwKCAjwkJj6BRA-EiwA0ZVPViS77Swqm27VVjcP”前面始终有一个/,则该脚本将始终有效。
我的猜测是,有时/会在问号之前添加,有时则不会。这将更改脚本的最终结果。
尝试玩这个
function(){
var splitPageUrl = window.location.href.split(“ /”)[4];
如果(splitPageUrl.indexOf('?')>-1){
返回splitPageUrl.split(“?”)[0];
}
}
只需将[4]更改为您想要访问的内容即可(如果现在不适合您)。
嘿朱利叶斯,感谢您的帖子,我尝试了上述方法
function(){
var splitPageUrl = window.location.href.split(“ /”)[5];
如果(splitPageUrl.indexOf('?')> -1) {
返回splitPageUrl.split(“?”)[0];
}
}
但是,例如,某些URL并非采用这种格式
/ app / account / Register?sourceid = 39&campid = 2731-捕获的页面名称为“注册”
/ app / Account / Register?sourceid = 587&campid = 2581-捕获的页面名称是“注册?&sourceid=587&campid=2581"
任何想法为什么对于某些相同类型的URL都可以正常工作,却无法获取正确的页面名称
那是因为在/之前没有/。
在发表评论之前检查一下评论,您将找到解决方案。
你好朱利叶斯,
我了解,事实上,我只在发布之前将脚本从先前的评论中复制出来
function(){
var splitPageUrl = window.location.href.split(“ /”)[5];
如果(splitPageUrl.indexOf('?')> -1) {
返回splitPageUrl.split(“?”)[0];
}
}
如您所见,实现了我的大部分页面名称后,它们都被正确存储了
奇怪的是,请检查以下2个示例,它们都具有相同的url类型,但是其中一个使用此脚本存储了正确的页面名称,另一个则没有
1.)/ app / account / Register?sourceid = 39&campid = 2731-捕获的页面名称为“注册”
2.) / app / Account / Register?sourceid = 587&campid=2581
-捕获的页面名称是“注册?&sourceid=587&campid=2581"
这是我的疑问,因为脚本可以在第一个网址中将页面名称标识为Register,但在第二个网址中却以某种方式失败
你能看看吗
然后使用
function(){
返回{{Page Path}} .split(“ /”)[{{Page Path}}。length-1];
}
它将返回路径的最后一部分
大家好,检索URL最后部分的另一种方法是:
function(){
var lastItem = {{Click URL}}。substring({{Click URL}}。lastIndexOf('/')+ 1);
返回lastItem;
}
// note:其他变量,例如{{Page URL}}或{{PagePath}}也可以