2016-07-06 65 views
1

我已经在php中编写了一个API,该脚本被一个运行在google标签管理器中的脚本调用。不保留在wordpress中的会话变量

为脚本的使用是一个唯一的电话号码在网站

上加用PHP会话ID cookie来提供每个访问者在测试过程中我所管理的用户跟踪。这让我查询数据库,看看他们是否已经分配了一个号码,如果他们有,那么我需要分配一个号码。

在测试中,这项工作完美无瑕,但是当在wordpress平台中实现cookie时没有设置。因此,每次调用脚本时(在页面更改时),我都会收到一个新号码。

方法1 对客户端设置cookie并且得到使用$ _COOKIE [ '的myCookie']

方法2 创建一个会话,检查会话ID的脚本被称为有史以来时间。会话ID每次都改变......没

方法3 尝试使用GA访问者ID(CID)来跟踪用户,这也产生不同数量的每

我已经尝试了一次一些解决方案来解决这个问题,但目前我不能停止behievour。

脚本目前配置为使用GA CID,看起来像这样

<?php 
header("Access-Control-Allow-Origin: *"); 

error_reporting(-1); 
ini_set('display_errors', 'On'); 

$servername = ""; 
$username = ""; 
$password = ""; 
$dbname = ""; 

$cookie_name = "TestCookie"; 
$numID; 

$site_id = ""; 
$domain_name = $_POST['url']; 


if(isset($domain_name)) { 
      $conn_siteID = new mysqli($servername, $username, $password, $dbname); 

      $sql_siteID = "Select * from SiteList where ReferrerURL = '" . $domain_name . "'"; 

      $result = $conn_siteID->query($sql_siteID); 

      if ($conn_siteID->connect_error) { 
       die("Connection failed: " . $conn_siteID->connect_error); 
      }   

      if ($result->num_rows > 0) { 
       while($row = $result->fetch_assoc()) { 
        $site_id = $row["id"]; 
       } 
      } else { 

      } 
      $conn_siteID->close(); 
} 

$cid = gaParseCookie(); 
echo $cid; 

if(!empty($cid)) { 
      //Cookie doesnt exist give them a new number 

      $conn = new mysqli($servername, $username, $password, $dbname); 
      if ($conn->connect_error) { 
       die("Connection failed: " . $conn->connect_error); 
      } 


      $sql = "Select * from NumPool where cid='". $cid . "' order by lastshown asc limit 1"; 
      $result = $conn->query($sql); 

      if ($result->num_rows > 0) { 
       while($row = $result->fetch_assoc()) { 
        //return current number 
        echo $row["number"]; 
        $numID = $row["id"]; 

        $conn4 = new mysqli($servername, $username, $password, $dbname); 
        $sql = "Update NumPool set lastshown='" . date("Y-m-d H:i:s") . "', cid='". $cid ."' where id='" . $numID . "'"; 
        $result = $conn4->query($sql); 
        $conn4->close(); 
       } 
      } else { 
       //return new number 
        $conn3 = new mysqli($servername, $username, $password, $dbname); 

        if ($conn3->connect_error) { 
         die("Connection failed: " . $conn3->connect_error); 
        } 

        $sql = "Select * from NumPool where siteid='". $site_id . "' order by lastshown asc limit 1"; 
        $result = $conn3->query($sql); 

        if ($result->num_rows > 0) { 
         while($row = $result->fetch_assoc()) { 
          echo $row["number"]; 
          $numID = $row["id"]; 

          $conn4 = new mysqli($servername, $username, $password, $dbname); 
          $sql = "Update NumPool set lastshown='" . date("Y-m-d H:i:s") . "', cid='". $cid ."' where id='" . $numID . "'"; 
          $result = $conn4->query($sql); 
          $conn4->close(); 
         } 
        } else { 

        } 

        $conn3->close(); 

      } 
      $conn->close(); 

} 


// Handle the parsing of the _ga cookie or setting it to a unique identifier 

function gaParseCookie() { 
    if (isset($_COOKIE['_ga'])) { 
    list($version,$domainDepth, $cid1, $cid2) = preg_split('[\.]', $_COOKIE["_ga"],4); 
    $contents = array('version' => $version, 'domainDepth' => $domainDepth, 'cid' => $cid1.'.'.$cid2); 
    $cid = $contents['cid']; 
    } 
    else $cid = gaGenUUID(); 

    return $cid; 
} 

// Generate UUID v4 function - needed to generate a CID when one isn't available 
function gaGenUUID() { 
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', 
    // 32 bits for "time_low" 
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), 

    // 16 bits for "time_mid" 
    mt_rand(0, 0xffff), 

    // 16 bits for "time_hi_and_version", 
    // four most significant bits holds version number 4 
    mt_rand(0, 0x0fff) | 0x4000, 

    // 16 bits, 8 bits for "clk_seq_hi_res", 

    // 8 bits for "clk_seq_low", 
    // two most significant bits holds zero and one for variant DCE1.1 
    mt_rand(0, 0x3fff) | 0x8000, 

    // 48 bits for "node" 
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) 
); 
} 
?> 
+0

如果在每次请求的会话ID更改,然后你的会话cookie设置是错误的(丢失会话cookie - >每次获得新的+空会话),或其他地方正在搞乱会话名称/编号 –

+0

你的函数'gaParseCookie()'看起来总是返回一些东西。所以当你用'if(!empty($ cid)){''检查这个值总是返回true。它看起来(从你的评论)你然后给他们一个新的号码。 – Cfreak

+0

感谢您的意见球员,不幸的是既不帮助我解决这个问题。我正在改变策略,并直接在页面上注入脚本,而不是管理服务器端。生病后发布我的解决方案 –

回答

0

我无法通过服务器端的PHP实现解决上述。我选择注入页面加载一个脚本来执行的操作的客户端在GTM实现

跟踪代码

<script type="text/javascript"> 
    (function() { 
    var ra = document.createElement('script'); 
    ra.type = 'text/javascript'; 
    ra.src = ('https:'==document.location.protocol?'https://':'http://') 
    +'www.test.co.uk/app/getcd.js'; 
    var s = document.getElementsByTagName('script')[0]; 
    s.parentNode.insertBefore(ra, s); 
    }()); 
</script> 

脚本执行

var cookieName = ""; 
var cookieValue = getCookie(cookieName); 
var accountId = getAccount(); 


if (cookieValue == "") { 
    cookieValue = guid(); 
    setCookie(cookieName, cookieValue, 30); 
} 

// request number using cookieValue 
var url = "etcd.php"; 
var params = "url=" + document.domain + "&userid=" + cookieValue + "&gaAccountID='" + accountId; 


    if (window.XMLHttpRequest) { 
    // code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } else { // code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) { 

    var numberfields = document.querySelectorAll('.complete'); 
    for(var i = 0; i < numberfields.length; i++) { 
     if (xmlhttp.responseText !== "") { 
      numberfields[i].innerHTML=xmlhttp.responseText; 
     } 
} 

    } 
    } 
    xmlhttp.open("POST",url,true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.send(params); 





function setCookie(cname, cvalue, exdays) { 
    var d = new Date(); 
    d.setTime(d.getTime() + (exdays*24*60*60*1000)); 
    var expires = "expires="+d.toUTCString(); 
    document.cookie = cname + "=" + cvalue + "; " + expires; 
} 

function getCookie(cname) { 
    var name = cname + "="; 
    var ca = document.cookie.split(';'); 
    for(var i = 0; i < ca.length; i++) { 
     var c = ca[i]; 
     while (c.charAt(0) == ' ') { 
      c = c.substring(1); 
     } 
     if (c.indexOf(name) == 0) { 
      return c.substring(name.length, c.length); 
     } 
    } 
    return ""; 
} 

function guid() { 
    function s4() { 
    return Math.floor((1 + Math.random()) * 0x10000) 
     .toString(16) 
     .substring(1); 
    } 
    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + 
    s4() + '-' + s4() + s4() + s4(); 
}