如何在没有插件的主题中实现一个$_SESSION替代?

时间:2021-03-18 作者:sariDon

我想向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会话是唯一的选择?

2 个回复
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了。

SO网友:sariDon

感谢您的回答@Jacob Peattie. 我已经用JavaScript的方式实现了它。代码如下:

function pop_message()
{
    var popshow= sessionStorage.getItem("pxpop");
    if((popshow==null) || (popshow==\'\'))
        popshow=false;
    if(($(".open_initpop").length >0) && (popshow==false))
    {
        $(".open_initpop").dialog({\'autoOpen\': true, \'modal\':true, \'width\':500, \'dialogClass\': \'initpop_dlg\', \'hide\': {\'effect\': "clip", \'duration\': 250}, \'buttons\':{\'close\': function(){
          $(this).dialog( "close" );}}});
        sessionStorage.setItem("pxpop", true);
    }
}
只需调用函数pop_message() 在里面$(document).ready

相关推荐

Large Session Tokens

我们在共享服务器上有一个Wordpress站点,最近由于磁盘空间不足而崩溃,因为我们的MySQL二进制日志在几分钟内就填满了驱动器。在查看了其中的内容后,我们追踪到该站点中的一个用户,该用户在usermeta 元键为的表session_tokens. 我为该用户单击了“随处注销”选项,删除了这些记录,但今天同样的问题开始出现,他的所有令牌都回来了。有什么想法吗?我真的不知道从哪里开始,也不知道他是如何积累了这么多代币的。我写了一个Wordpress计划的任务,应该每小时删除过期的门票,但由于他的帐户什么都