如何在Google Tag Manager中为Schema创建遍历多演员数据的循环函数
问题根因
GTM内置的DOM元素变量默认仅返回CSS选择器匹配到的第一个元素的对应值,即使你在循环里多次调用,也只会重复返回第一个匹配项的内容,这就是你所有条目数据相同的原因。不要通过预定义的DOM变量获取多条重复结构的列表数据,直接在自定义HTML标签中用原生JS遍历DOM生成数组即可。
完整实现代码
直接替换你原来的Schema代码即可,代码会自动遍历页面所有匹配的导演、演员节点生成对应数组:
<script type="application/ld+json"> { "name": "{{post eletitle}}", "url": "{{Page URL}}", "sameAs": [], "dateCreated": ["{{post modified time}}"], "image": { "width": "{{post image width}}", "height": "{{post image height}}", "url": "{{post image}}", "@context": "http://schema.org", "@type": "ImageObject" }, "description": "{{post description}}", "keywords": "master movie rating, Tamil Movie, tamil movie box office report", // 动态生成导演数组 "director": (function(){ var directors = []; // 可根据实际DOM结构调整选择器 var directorUrlNodes = document.querySelectorAll('li .movie-director-url'); var directorNameNodes = document.querySelectorAll('li .movie-director-name'); for(var i=0; i<directorUrlNodes.length; i++){ if(directorNameNodes[i]){ directors.push({ "url": directorUrlNodes[i].href, "name": directorNameNodes[i].textContent.trim(), "@context": "http://schema.org", "@type": "Person" }) } } return directors; })(), // 动态生成演员数组 "actor": (function(){ var actors = []; // 可根据实际DOM结构调整选择器 var castUrlNodes = document.querySelectorAll('a.movie-cast-url'); var castNameNodes = document.querySelectorAll('span.movie-cast-name'); for(var i=0; i<castUrlNodes.length; i++){ if(castNameNodes[i]){ actors.push({ "url": castUrlNodes[i].href, "name": castNameNodes[i].textContent.trim(), "@context": "http://schema.org", "@type": "Person" }) } } return actors; })(), "@context": "http://schema.org", "@type": "Movie" } </script>
注意事项
- 如果你页面的导演、演员节点有共同的父级容器,建议在选择器前加上父容器的类名缩小匹配范围,比如
.movie-detail a.movie-cast-url,避免匹配到页面其他区域的同class元素 - 部署前可以在GTM预览模式下,打开浏览器控制台打印生成的
director、actor数组,确认数据匹配正确后再正式发布 - 若页面演员/导演名字存在双引号等特殊字符,可在
textContent后加.replace(/"/g, '"')避免JSON格式错误
内容的提问来源于stack exchange,提问作者mrpuyal
相关产品推荐
相关产品推荐

