在 wordpress 中提交表单后会话丢失
Posted
技术标签:
【中文标题】在 wordpress 中提交表单后会话丢失【英文标题】:Session lost after form submit in wordpress 【发布时间】:2017-08-27 20:04:17 【问题描述】:表单提交后我设置的会话丢失了。
我已经建立了会话类来设置新的会话,取消设置等等。在wordpress模板的function.php中。
函数.php
if (!session_id())
session_start();
include get_template_directory() . "/custom/session.php";
Session.php
class session
function __construct()
function set_flashdata($name, $value)
$_SESSION[$name] = $value;
function flashdata($name)
if (isset($_SESSION[$name]))
$str = $_SESSION[$name];
return $str;
else
return FALSE;
function userdata($name)
if (isset($_SESSION[$name]))
return $_SESSION[$name];
else
return FALSE;
function set_userdata($name, $value)
$_SESSION[$name] = $value;
function unset_userdata($name)
if (isset($_SESSION[$name]))
unset($_SESSION[$name]);
我尝试将会话设置为:
<?php
$sess = new session();
$sess->set_userdata('sess_name',"some value");
?>
<form action="get_permalink(212);">
//input buttons
</form>
提交表单后,它会转到永久链接(212)。然后我试了一下。
<?php
$sess = new session();
$value = $sess->userdata('sess_name');
var_dump($value); //returns false. That means session is lost after form submit. Why?
?>
【问题讨论】:
你用的是什么主机?一些主机在使用 PHP 会话和 WordPress 时遇到问题。也许检查这个插件:wordpress.org/plugins/wp-native-php-sessions 【参考方案1】:您需要将会话开始/恢复移动到会话的构造函数中。
像这样:
class session
function __construct()
if (! session_id())
session_start();
还有一点要提一下,每次您执行new Session
时,您都会得到一个具有相同功能的对象,该对象使用相同的全局变量$_SESSION
。
您不需要多个$session
对象,现在是查看Singleton pattern
的好时机。
【讨论】:
在参考单例模式并将我的会话类的设计模式更改为单例之后。我的问题得到了解决。但它是如何解决我的错误的。我没有得到。是因为类的单个对象吗? 嗨@user254153(很高兴叫你名字)。问题总是由于没有开始/恢复相同的会话。修复算法是确保您每次都在启动/恢复会话以查询 Session 对象,因此我给出的示例将会话启动/恢复移动到 __constructor。单例模式在这里非常有效,因为您希望全局访问 Session 对象而不创建多个实例。 没错。在单例之后,我不必每次调用会话时都创建一个新对象。【参考方案2】:您必须为每个请求始终调用 session_start()。
session_start()的任务是:
创建一个新会话 重新启动现有会话这意味着,如果您创建了一个会话,并且您不调用方法 session_start(),那么变量 $_SESSION 将不会被执行。
除了:如果您在 php.ini 中将选项 session.auto_start 设置为 1,则在这种情况下不需要调用 session_start( ) 因为变量 $_SESSION 是隐式实现的。
【讨论】:
【参考方案3】:您需要使用 wordpress 全局变量来判断是否设置了会话:
global $session;
if (!session_id())
session_start();
include get_template_directory() . "/custom/session.php";
【讨论】:
为什么要使用 $session。 wordpress 有很多全局变量,所以可以在 wp 代码的任何地方使用。 wp_session 变量仍然存在同样的问题 您需要在构造函数中的 session.php 上使用 session_start(),例如 function __construct() session_start(); 【参考方案4】:这可能是由于www。在您的网站域的开头。确保两个页面使用相同的结构。
很久以前,当表单将数据发送到安全地址 (https://) 时,我也遇到了同样的问题
我希望这两个项目可以帮助你。
【讨论】:
【参考方案5】:在我看来,session_start()
没有设置在 get_permalink(212;)
所指的页面的开头。
我对 WP 本身几乎没有经验,所以我可能会误解 get_permalink()
的功能
【讨论】:
【参考方案6】:我同意@rock3t 的回答是在类的构造函数中初始化会话,但是每次启动一个类对象时,它都会去检查会话!
相反,如果您没问题,访问会话的最简单方法是在调用 wp-settings 之前在您的 wp-config.php 文件中添加以下行em>
if (!session_id())
session_start();
这将全局设置/初始化会话,您无需在类的构造函数中设置/检查 session_start。
谢谢。
【讨论】:
以上是关于在 wordpress 中提交表单后会话丢失的主要内容,如果未能解决你的问题,请参考以下文章