Google Tag Manager运行代码报Parse error,如何修复实现GA内容分组
问题根因
- 你编写的是PHP服务端代码,无法直接在Google Tag Manager的自定义HTML块中运行:GTM注入的代码运行在用户浏览器的JavaScript环境,不支持PHP语法、WordPress内置函数(
get_post_field/str_word_count等均为PHP/WordPress专属函数)。 - 你排查到的
$post->ID报错的直接原因:PHP代码中调用全局文章对象$post前未声明global $post,导致$post为未定义变量,访问其属性会触发语法错误。
修复方案
方案一:服务端注入(推荐,数据更准确)
将代码放到WordPress主题的functions.php文件末尾即可,无需写入GTM。修复后代码如下:
function word_range() { global $post; $content = get_post_field( 'post_content', $post->ID ); $word_count = str_word_count( strip_tags( $content ) ); if ($word_count < 200) { $word_range = '0-200';} elseif($word_count < 400) { $word_range = '200-400'; } elseif($word_count < 600) { $word_range = '400-600'; } elseif($word_count < 800) { $word_range = '600-800'; } elseif($word_count < 1000) { $word_range = '800-1000'; } elseif($word_count < 1200) { $word_range = '1000-1200'; } elseif($word_count < 1400) { $word_range = '1200-1400'; } elseif($word_count < 1600) { $word_range = '1400-1600'; } elseif($word_count < 1800) { $word_range = '1600-1800'; } elseif($word_count < 2000) { $word_range = '1800-2000'; } elseif($word_count < 2200) { $word_range = '2000-2200'; } elseif($word_count < 2400) { $word_range = '2200-2400'; } elseif($word_count < 2600) { $word_range = '2400-2600'; } elseif($word_count < 2800) { $word_range = '2600-2800'; } elseif($word_count < 3000) { $word_range = '2800-3000'; } elseif($word_count < 3200) { $word_range = '3000-3200'; } elseif($word_count < 3400) { $word_range = '3200-3400'; } elseif($word_count < 3600) { $word_range = '3400-3600'; } elseif($word_count < 3800) { $word_range = '3600-3800'; } elseif($word_count < 4000) { $word_range = '3800-4000'; } elseif($word_count >= 4000) { $word_range = '4000+'; } return $word_range; } function word_count() { global $post; $content = get_post_field( 'post_content', $post->ID ); return str_word_count( strip_tags( $content ) ); } function post_year() { global $post; return get_the_date( 'Y', $post->ID ); } function tag_manager_variables() { if (!is_singular('post')) return; ?> <script> window.dataLayer = window.dataLayer || []; dataLayer.push({ 'wordCount': '<?php echo word_count(); ?>', 'wordRange': '<?php echo word_range(); ?>', 'postYear': '<?php echo post_year(); ?>' }); </script> <?php } add_action ( 'wp_head', 'tag_manager_variables' );
配置完成后直接在GTM中创建对应dataLayer类型的自定义变量,即可拿到三个字段值用于GA内容分组。
方案二:纯前端JS实现(适合无法修改主题代码的场景)
直接将以下代码写入GTM自定义HTML块,触发条件设置为DOM Ready即可:
<script> window.dataLayer = window.dataLayer || []; // 替换为你站点文章内容区域的CSS选择器 const contentEle = document.querySelector('.post-content'); const contentText = contentEle ? contentEle.innerText.trim() : ''; // 统计字数 const wordCount = contentText.split(/\s+/).filter(item => item.length > 0).length; // 计算字数区间 let wordRange = '4000+'; const rangeSteps = [200,400,600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800,3000,3200,3400,3600,3800,4000]; for (let i = 0; i < rangeSteps.length; i++) { if (wordCount < rangeSteps[i]) { wordRange = `${i==0 ? 0 : rangeSteps[i-1]}-${rangeSteps[i]}`; break; } } // 替换为你站点发布时间的CSS选择器或meta标签规则 const publishDate = document.querySelector('meta[property="article:published_time"]')?.content || document.querySelector('.post-date')?.innerText; const postYear = publishDate ? new Date(publishDate).getFullYear() : ''; dataLayer.push({ wordCount, wordRange, postYear }); </script>
需注意将代码中的内容选择器、发布时间选择器替换为你站点实际的DOM结构对应值。
内容的提问来源于stack exchange,提问作者Charles L'Heureux
相关产品推荐
相关产品推荐

