通过unctions.php在纯javascript中安装GTM

时间:2019-07-24 作者:JackLinkers

GTM documentation 表示包含两个片段,1个在后面<head> 开始标记和1之后<body> 打开标签。最初,我是在孩子的标题中添加代码片段。php文件。我想放弃这个方法,改用纯JS,主要是因为父主题更新。

我编写了下面的代码以在函数中使用。php,但它不起作用,我不知道我做错了什么。

Edit : 我得到的错误是Uncaught TypeError: Cannot read property \'insertBefore\' of null 对于document.body.insertBefore(el, document.body.firstChild);

<?php
add_action( \'wp_head\', \'webplus_hook_gtm\' );
function webplus_hook_gtm() {
?>
<script type="text/javascript">
    var para = document.createElement("script");
    var t = document.createTextNode(
    "(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\');"
    );
    para.appendChild(t);
    document.head.insertBefore(para, document.head.firstChild);

    var el = document.createElement("noscript");
    var ifrm = document.createElement("iframe");
    ifrm.setAttribute(
    "src",
    "https://www.googletagmanager.com/ns.html?id=GTM-XXXX"
    );
    ifrm.setAttribute("height", "0");
    ifrm.setAttribute("width", "0");
    ifrm.setAttribute("style", "display:none;visibility:hidden");
    el.appendChild(ifrm);
    document.body.insertBefore(el, document.body.firstChild);
</script>
<?php
};
蒂亚,非常感谢你的帮助。

2 个回复
SO网友:Jacob Peattie

问题是您的代码在<head> 元素,但代码正在尝试访问document.body 它在脚本运行时不存在。如果我没记错的话,您应该在打开后立即放置此代码<body> 标签从函数执行此操作。php您的主题需要支持new wp_body_open() hook.

header.php:

<body <?php body_class(); ?>>
<?php wp_body_open(); ?>

functions.php

add_action( \'wp_body_open\', \'webplus_hook_gtm\' );

SO网友:JackLinkers

感谢您的所有贡献,帮助我理解我的错误并解决我的问题,特别是“Krzysiek Dródż”的提示和“Jacob”的部分解决方案。这是我的最终工作代码:

    <?php

    add_action( \'wp_head\', \'webplus_hook_gtm\' );
    function webplus_hook_gtm() {
        ?>
        <script>
            var para = document.createElement("script");
            var t = document.createTextNode(
            "(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\');"
            );
            para.appendChild(t);
            document.head.insertBefore(para, document.head.firstChild);
        </script>
        <?php
    };

    add_action( \'wp_body_open\', \'webplus_hook_gtm_noscript\' );
    function webplus_hook_gtm_noscript() {
        ?>
        <script>
            var el = document.createElement("noscript");
            var ifrm = document.createElement("iframe");
            ifrm.setAttribute(
            "src",
            "https://www.googletagmanager.com/ns.html?id=GTM-XXXX"
            );
            ifrm.setAttribute("height", "0");
            ifrm.setAttribute("width", "0");
            ifrm.setAttribute("style", "display:none;visibility:hidden");
            el.appendChild(ifrm);
            document.body.insertBefore(el, document.body.firstChild);
        </script>
        <?php
    };

相关推荐

如何在WordPress中正确添加和访问一个JavaScript文件?

我打算在我的WP网站上使用JavaScript库,并已通过FTP将JS文件上载到当前激活主题的以下目录:/public_html/wp-content/themes/salient/js然后,为了加载JavaScript,我在“页眉和页脚”设置中添加了以下行(在正文结束标记之前插入):<script type=\"text/javascript\" src=\"https://www.mypage.../public_html/wp-content/themes/salient/js/javascr