我尝试实现一个功能,通知用户网页上的更改。我尝试使用会话来实现这一点,但效果不太好。例如:
用户可以参加活动。要做到这一点,他必须注册。因此,当时他的注册状态为“暂停”。在后端,我可以接受他的注册并将状态更改为“已接受”。现在,我希望用户在其仪表板上看到一个通知,表示他已被接受。
为此,我使用他的最后登录日期。我检查他的状态更改日期是否在上次登录日期之后。registration\\u通知的值存储在wp\\u会话变量中。这项工作没有问题。如果用户打开包含其注册列表的页面,则会重置此wp\\U会话变量。问题来了:
如果现在更改同一用户的第二次注册状态,则不会显示通知。
我的代码:
获取通知的函数:
if(!isset(wp_session[\'event\'])){
wp_session[\'event\']= $wpdb->get_var(SELECT COUNT..... change_date > last_login_date);
}
显示通知:
if(wp_session[\'event\']!=-1){ echo wp_session[\'event\']}
在概述页面上更改会话:
wp_session[\'event\']=-1;
我需要更改代码,以便在用户已经在线时识别通知量是否有变化。但我想不出怎样才能做到最好。
提前谢谢。
SO网友:Tom J Nowell
PHP仅在您请求页面时运行。当请求结束时,一切都消失了。它不像节点应用程序那样,同一个程序处理所有请求和变量,只需定义它们就可以跨页面持久化,因此使用$wp_session
变量将仅对该请求执行操作。
如果您导航到另一个页面,它必须从头开始重新加载WordPress,并重新整理所有内容。这就是代码无法工作的原因,也是所有PHP程序的工作方式。
如果要持久化某些内容,必须将其存储在某个位置,例如数据库、文件系统或对象缓存。这就是诸如登录用户的用户元之类的东西的用途。
有1个例外,PHP会话使用$_SESSION
变量,但WordPress不使用它们,需要进行一些设置。此外,它们与Varnish、Supercache等页面缓存解决方案不兼容。此外,并非所有主机都支持它。例如,PHP会话无法在WP引擎上正常工作。
其他注意事项:
PHP中的变量以开头$
但你的不是因为某种原因。我本以为PHP会出现致命错误在使用全局变量之前,需要声明全局变量。您正在执行SQL查询,然后将结果转储到一个没有错误处理的变量中,这是一种安全风险。您正在显示该查询的结果,而没有任何格式或转义,这也是一种安全风险。您需要在;
, 您的show notification示例不会执行此操作,并且会生成语法错误wp_session
从未在任何地方创建,因此最初它是完全未定义的。这将在运行时生成警告和通知,以填充PHP错误日志