You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Tag Manager运行代码报Parse error,如何修复实现GA内容分组

问题根因

  1. 你编写的是PHP服务端代码,无法直接在Google Tag Manager的自定义HTML块中运行:GTM注入的代码运行在用户浏览器的JavaScript环境,不支持PHP语法、WordPress内置函数(get_post_field/str_word_count等均为PHP/WordPress专属函数)。
  2. 你排查到的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:27:02