【问题标题】:How to include google analytics in a php JSON encode result?如何在 php JSON 编码结果中包含谷歌分析?
【发布时间】:2016-04-06 21:10:03
【问题描述】:

我有一个 php 页面,它将数组编码为 JSON 对象或 JSONP 回调,并简单地回显结果。因为这将成为一个可以直接访问的独立页面,所以我想收集见解并包括谷歌分析。

JSON 编码 php 页面:

<?php
    $arr = array('country' => 'United States', 'city' => 'New York');

    if(isset ($_GET['jsonp'])) {
        echo $_GET['jsonp'] . '(' . json_encode($arr) . ')';
    } 
    else {
        echo json_encode($arr);
    }
?>

jQuery 解码部分:

<script>
    $.getJSON('https://geoip-db.com/json/geoip.php?jsonp=callback') 
         .done (function(location)
         {
             $('#country').html(location.country);
             $('#city').html(location.city);            
         });
</script>

Google 指南建议创建一个包含 javascript 跟踪代码的单独 php 文件,并将其包含在您要跟踪的所有 php 页面中。比如:

<?php include_once("analyticstracking.php") ?>

这样,跟踪器可以工作,但是当尝试解码生成的 JSON 对象时,JQuery 部分会因注入的跟踪器脚本导致的语法错误而中断。 php 编码页面也会响应跟踪器脚本,这会产生无用的 JSON 结果。

有什么建议吗?

【问题讨论】:

    标签: javascript php jquery json google-analytics


    【解决方案1】:

    我不确定我是否正确理解了您的问题,但您始终可以通过measurement protocol 使用服务器端代码调用 Google Analytics:

    $url = "v=1&t=pageview&tid=UA-39221247-1&cid=5555&dp=%2Fmy%2Fpage";
    fopen($url);
    

    其中“v”是版本,“tid”是帐号,“cid”是客户 ID,“dp”是您页面的文档路径。

    这样,解析后的输出中就不会有会破坏 jQuery 代码的跟踪代码。

    如果您想将单个视图聚合到一个会话中,您需要在自己调用之间维护 cid。

    请注意,这与基于 Javascript 的跟踪不能很好地混合(即使您使用现有 ga cookie 中的客户端 ID,它也会在 GA 中启动一个新会话)。

    【讨论】:

    • +1 为我指明了正确的方向。带有服务器端代码的 Analytics 测量协议带来了解决方案。
    【解决方案2】:

    你不能像这样在页脚中加载它吗?

    $( document ).ready(function() {
        $("analytics-tracking").load('analyticstracking.php');
    });
    

    【讨论】:

    • 我想要深入了解的 php 部分不包含任何 html 代码,也不包含任何在解码 JSON 对象时插入 html 或 javascript 时的页眉、页脚和中断。
    • .done 用作查询成功后的第二个回调。您应该在获取 JSON 数据后直接执行渲染函数,而不是使用 .done 方法。检查api.jquery.com/jquery.getjson。特别是 var jqxhr = $.getJSON 部分。
    【解决方案3】:

    Eike 的回答为我指明了正确的方向,因此为他的回答 +1,但我不得不使用 cURL 而不是 fopen()。

    我的完整工作解决方案:

    <?php
    
        $curl_handle=curl_init();
        curl_setopt($curl_handle, CURLOPT_URL,'http://www.google-analytics.com/collect/v=1&tid=UA-xxxxxxx-1&cid=555&t=pageview&dp=%2Fgeoip.php');
        curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
        curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Geoip tracker');
        $query = curl_exec($curl_handle);
        curl_close($curl_handle);
    
        $arr = array('country' => 'United States', 'city' => 'New York');
    
        if(isset ($_GET['jsonp'])) {
            echo $_GET['jsonp'] . '(' . json_encode($arr) . ')';
        } 
        else {
            echo json_encode($arr);
        }
    ?>
    

    【讨论】:

      【解决方案4】:

      我猜你的谷歌分析部分没问题,jquery 中断,因为你返回 getJson 不是 json 值,在 if() 部分你返回类似:

      callback('country' => 'United States', 'city' => 'New York');

      不是一个有效的 json,else 部分很好,你应该在 2 部分中回显相同的部分。

      【讨论】:

      • if 部分返回 JSONP 回调,这是克服 XMLHttpRequest 同域策略的简单技巧。原始 JSON 或 JSONP 输出没有任何问题。
      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2011-05-03
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多