php 如何在WordPress中使用会话而不使用$_SESSION

lx0bsm1f  于 2023-05-21  发布在  PHP
关注(0)|答案(1)|浏览(156)

我试图创建一个会话,而不使用php $_SESSION变量,并没有让用户登录在网站上。我创建了一个表单,一旦访问者/访客用户提交表单,我想将他的数据存储在会话变量中。我发现在wordpress中使用$_SESSION不是一个好的做法。我看了一些教程,发现使用WP_Session。这似乎也不适合我。
下面是我使用的代码:

global $wp_session;
$wp_session['visitorInfo'] = 'some_text_here';

当我在另一个页面上请求它时,它什么也不给我(空白)。即使我尝试打印$wp_session变量,它也会给予我空白。我也尝试了$wp_session = WP_Session::get_instance();,但它返回了Class WP_Session not found错误,可能是因为我正在调用这个方法的类中使用命名空间。
我也试着

add_action('init',array($this,'start_session'));
public function start_session(){
  if (!session_id()) { session_start();}
}

但它不起作用。
我的网站托管在wpengine上,它不允许创建自定义cookie。我试图弄清楚如何WordPress创建他们的会话时,用户登录到网站。我一直在寻找解决方案,从过去2天,但没有找到任何工作的解决方案。
你能建议我如何才能做到这一点。
多多提前感谢!

xxslljrj

xxslljrj1#

使用init钩子session_start()在没有WP引擎的普通服务器上工作正常。
示例代码:

<?php
/**
 * Plugin Name: Session plugin.
 */

add_action('init', 'sesp_init');
function sesp_init()
{
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    $_SESSION['hello'] = 'world';
}

add_action('template_redirect', 'sesp_template');
function sesp_template()
{
    echo 'hello ' . $_SESSION['hello'].'<br>';
}

首页上写着“Hello World”。

WP_Session

WP_Session类不是WordPress的核心类。除了WP_Session_Token,我在WordPress核心文件中的任何地方都找不到这个类,但这不是用于会话的。
WP_Session来自WP Session Manager plugin(参考this question)。您必须安装该插件才能访问WP_Session。否则将发生此错误。
未找到类WP_Session

使用Transients

从文件上。
WordPress Transients API,它提供了一种在数据库中临时存储缓存数据的简单和标准化的方法
所以,如果session_start()不能正常工作,并且你不想安装其他插件,你可以使用它作为替代。
示例代码:

add_action('init', 'sesp_init');
function sesp_init()
{
    set_transient('sesp_hello', 'moon', 60*5);// 5 minutes.
}

add_action('template_redirect', 'sesp_template');
function sesp_template()
{
    echo 'hello ' . get_transient('sesp_hello') . ' (use transient).<br>';
}

您不需要挂钩到init来设置transient。上面的代码就是一个例子。set_transient()中的第三个参数是以秒为单位的过期时间。

transient 警告!

然而, transient 不像会话那样用于一个访问者。你必须设置和检查正确的 transient 你得到和设置是匹配的一个人。

WP引擎

support page
这带来的最大问题是由于唯一的会话ID。唯一ID有效地破坏了缓存,并导致每个会话变为未缓存。这将导致您的网站出现严重的性能问题。
您可以切换到使用PHP cookie或禁用WP引擎缓存。这是answered here

相关问题