WordPress会话不断刷新



我正试图使用以下代码在我的wordpress网站上创建一个访问者计数器:

add_action( 'init', 'session_counter' );
function session_counter() {
$date = date('d/m/Y');
$session_data = get_option( 'session_counter');
$session_data['01/12/2020'] = 0;
$session_counter = 0;
$session_data_output = '';
$i = 0;
if (!session_id()) {
session_start();
if($_SESSION['hasVisited'] != '1'){
if(isset($session_data[$date])){
$session_counter = $session_data[$date];
}
$session_data[$date] = $session_counter + 1;
update_option( 'session_counter', $session_data);
foreach($session_data as $k => $v){
if($i > 0){
$session_data_output .= "n";
}
$session_data_output .= $k." - ".$v;
$i++;
}
$session_counter_txt = fopen("counter.txt", "w");
fwrite($session_counter_txt, $session_data_output);
fclose($session_counter_txt);
}
$_SESSION['hasVisited'] = '1';
}
}

上面的代码将每天的访客总数存储在数据库中,然后以可读格式存储在文本文件中。

设置访问者计数器的目的是查看有多少人在同意GDPR弹出窗口之前访问了该网站,因为谷歌分析只有在获得同意后才能启用。该网站使用CookieYes GDPR弹出窗口,其中也记录了同意。

一切都很好,除非我将文本文件与谷歌分析和Cookie进行比较是的,我看到文本文件中的计数明显高于谷歌分析。例如,文本文件将显示11764的总天数,而谷歌分析将显示598的总天数。

经过进一步调查,我注意到同一位网站访问者在文本文件中的记录次数比在谷歌分析中的记录要少,这让我相信,当同一位访问者浏览网站时,网站会话会不断刷新。

我一直认为,如果我清除浏览器历史记录或关闭浏览器,会话会被刷新,那么为什么会话会为同一用户不断刷新呢。

我不想通过IP地址记录会话,因为我想出于GDPR的目的保持IP匿名。

我的代码中存储会话的方式是否有问题?如何防止为同一用户刷新会话?我只想在访问者关闭浏览器后销毁会话。

在用session_id()查询会话的ID之前,必须调用session_start(),否则它将始终返回一个空字符串。

会话可能无法启动。检查session_start()的返回值。

如果会话成功启动,此函数将返回true,否则返回false。

此外,确实没有必要检查session_id()的空性,因为如果成功,session_start((将启动新会话或恢复现有会话。因此,检验$_SESSION['hasVisited']的存在性就足够了。

基于Zoli Szabó的回答,我已将代码更新为以下内容:

add_action( 'init', 'session_counter' );
function session_counter() {
session_start();
$date = date('d/m/Y');
$session_data = get_option( 'session_counter');
$session_data['01/12/2020'] = 0;
$session_counter = 0;
$session_data_output = '';
$i = 0;
if($_SESSION['hasVisited'] != '1'){
if(isset($session_data[$date])){
$session_counter = $session_data[$date];
}
$session_data[$date] = $session_counter + 1;
update_option( 'session_counter', $session_data);
foreach($session_data as $k => $v){
if($i > 0){
$session_data_output .= "n";
}
$session_data_output .= $k." - ".$v;
$i++;
}
$session_counter_txt = fopen("counter.txt", "w");
fwrite($session_counter_txt, $session_data_output);
fclose($session_counter_txt);
}
$_SESSION['hasVisited'] = '1';
}

我将整天测试它,看看我是否得到了一致的结果,但到目前为止还很好。

更新

我尝试过这个解决方案,现在会话计数每刷新一个页面就会更新一次。

最新更新