在 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 中提交表单后会话丢失的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress 联系表 7 插件提交到特定页面

iframe 偶尔会丢失会话 cookie

WordPress 强大的表单 - 成功提交表单后更改标题

Wordpress:如何在表单 GET 提交后使用 Rewrite 将 URL 变量添加到 URL

在 wordpress 中编码时防止双重表单提交

Wordpress 表单不提交数据