【问题标题】:session_start() prevents saving in Wordpress editorsession_start() 防止在 Wordpress 编辑器中保存
【发布时间】:2020-09-22 08:31:32
【问题描述】:

我的自定义 Wordpress 插件中有以下代码:

add_action('init', 'wwp_StartSession', 1);

function wwp_StartSession() {
    if(!session_id()) {
       session_start();
    }
}

当我在 Wordpress 编辑器中编辑它时,它可以被保存。但是,如果我想在更多编辑后再次保存,我会收到以下错误:

Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP.

当我删除线时

sesion_start();

我可以再次保存。

我已经在 Google 上搜索了很长时间,有人说 if(!session_id()) 应该可以解决问题,但似乎没有。

希望有人对此有任何想法。

【问题讨论】:

  • 检查标头是否已经发送....stackoverflow.com/questions/10612163/…
  • 我以高优先级连接到“init”。另外,如果标头已经发送...我将无法在第一次保存它吗?
  • 我为发送的标头添加了检查以进行验证,但仍然出现错误。可以保存一次,但之后就不行了。
  • if(!session_id()) { if(!headers_sent()) { session_start(); } }

标签: php wordpress session


【解决方案1】:

最后我发现了:)。我在这里找到了答案:https://core.trac.wordpress.org/ticket/47320

现在这是我的代码:

class Session {
    public static function startSession() {
         // This loads variables to $_SESSION for reading
         if(!session_id()) {
            session_start();
            session_write_close(); // Other plugins can restart a session again via session_start()
        }
    }

    public static function endSession() {
        session_destroy ();
    }

    public static function storeData($key, $value) {
        session_start();
    
        $_SESSION[$key] = $value;
    
        session_write_close();
    }
}

startSession 与 init 挂钩 endSession 与 wp_login 和 wp_logout 挂钩 在我需要保存数据的地方调用 storeData

【讨论】:

  • 这对我不起作用,仍然让循环返回登录屏幕,就像 session_start 不存在一样。
  • 抱歉回复晚了。也许您已经找到了解决方案?保存帖子或页面时发生的问题。我不确定我是否完全理解您的问题,但您说您返回登录屏幕。由于我的解决方案与 wp_login 和 wp_logout 挂钩,因此您的问题可能是由于登录或注销时启动了新会话。 (这实际上是防止会话劫持的一件好事)。也许这可以帮助您朝着正确的方向前进。
  • 您好,是的,我确实设法解决了问题,这是由于其他插件中的几个 session_start 调用造成的。
【解决方案2】:

它仍然表现得很奇怪。如果我这样做:

public function startSession() {
    if(!is_admin() && !session_id()) {
        echo 'not session id';
        session_start();
    } 
}

然后它确实保存在后端....但是我没有可用的会话变量...即使打印了 echo 语句,所以 session_start() 被调用。

如果我省略了 !is_admin() 部分,我可以使用会话....但是我又遇到了后端问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多