我想向Wordpress网站的第一次访问者显示一个弹出窗口。我尝试使用$_SESSION
. 在页脚中有类似的内容。php:
<?php
if(!isset($_SESSION[\'pxpop\']))
$_SESSION[\'pxpop\']= true;
if(($_SESSION[\'pxpop\']) && (!is_user_logged_in()))
{
?>
<div class="open_initpop">
<?php if(is_active_sidebar(\'msg-pop\')): ?>
<?php dynamic_sidebar(\'msg-pop\'); ?>
<?php endif; ?>
</div>
<?php
$_SESSION[\'pxpop\']= false;
}
?>
使用
session_start();
在
init
函数的挂钩。php。
但这是行不通的。$_SESSION[\'pxpop\']
残余true
在每个页面上加载。因此,弹出窗口将在每个页面上打开。
带一点r&;我发现由于一些“无状态”问题,wordpress不使用会话。网站健康部分还指出:
"E;由session\\u start()函数调用创建的PHP会话可能会干扰REST API和环回请求。在发出任何HTTP请求之前,应通过session\\u write\\u close()关闭活动会话"E;
然后我尝试实施$_COOKIE
太(在init
吊钩)组件:
<?php
function pop_event()
{
if(!isset($_COOKIE[\'pxpop\']))
{
setcookie(\'pxpop\', true, 0);
//$_COOKIE[\'pxpop\']= true;
}
if(($_COOKIE[\'pxpop\']) && (!is_user_logged_in()))
{
?>
<div class="open_initpop">
<?php if(is_active_sidebar(\'msg-pop\')): ?>
<?php dynamic_sidebar(\'msg-pop\'); ?>
<?php endif; ?>
</div>
<?php
//unset($_COOKIE[\'pxpop\']);
//$_COOKIE[\'pxpop\']= false;
setcookie(\'pxpop\', false, 0);
}
}
?>
但这不太管用。。。
我的方法有什么问题?在没有实际使用的情况下,在Wordpress(如PHP会话)中传递值的正确方法是什么?或者使用$\\u会话是唯一的选择?
SO网友:Jacob Peattie
你可以用一块饼干,就像你尝试过的那样。问题是,您的逻辑是不断添加cookie。这是因为setcookie(\'pxpop\', false, 0);
正在从用户中删除cookie,因此您最终会陷入循环。这是您的代码逻辑:
IF user does not have a cookie
give the user a cookie
END IF
IF user has a cookie
display popup
take the cookie
END IF
因此,您可以看到为什么每次加载时都不会发生任何变化,因为用户从来不会使用cookie访问页面。
您要做的是:
IF user does not have cookie
display popup
give user the cookie
END IF
此外,您的cookie设置为在浏览器会话结束时过期,因此无论如何都不会持续很长时间。
解决这两个问题的方式如下:
<?php
function pop_event() {
if ( ! isset( $_COOKIE[\'pxpop\'] ) ) {
if ( is_active_sidebar( \'msg-pop\' ) ) {
?>
<div class="open_initpop">
<?php dynamic_sidebar(\'msg-pop\'); ?>
</div>
<?php
setcookie( \'pxpop\', true, YEAR_IN_SECONDS );
}
}
}
请记住,此解决方案不会与许多缓存解决方案兼容。我的建议是完全在客户端实现这一点,因为您可能已经在弹出窗口中使用JavaScript了。