【问题标题】:How to use session without using $_SESSION in wordpress如何在 wordpress 中使用会话而不使用 $_SESSION
【发布时间】:2022-01-21 01:52:57
【问题描述】:

我正在尝试在不使用 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 天我一直在寻找解决方案,但没有找到任何可行的解决方案。

您能否建议我如何实现这一目标。

提前致谢!

【问题讨论】:

  • 使用init钩子并在session_start()为我工作之前检查session_status() === PHP_SESSION_NONE。如果它不适合您,错误详情是什么?
  • WP_Session 类来自WP Session manager plugin。它不是 WordPress 核心类。所以,你需要有这个插件才能访问这个类。

标签: php wordpress session


【解决方案1】:

使用 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 即可设置瞬态。例如上面的代码。 set_transient() 中的第三个参数是以秒为单位的过期时间。

暂时警告!

但是,临时性不适合像会话这样的访问者。您必须正确设置并检查您获得的瞬态和设置是否适合某个人。

WP 引擎

来自他们的support page

这带来的最大问题是由于唯一的会话 ID。唯一 ID 有效地破坏了缓存并导致每个会话都未缓存。这会给您的网站带来严重的性能问题。

您可以切换到使用 PHP cookie 或禁用 WP Engine 缓存。这是answered here

【讨论】:

  • 感谢您的详细回复。它清除了一切,给了我一个方向。现在我正在使用 PHP cookie 来实现目标。它工作正常。只是想确认一下,PHP Cookie 会不会有什么问题?
  • @DevD 来自许多问题herehereand here。他们像普通的 PHP 一样使用普通的读写 cookie。您可能需要通过 WordPress 研究更多关于 cookie 常量的信息。
猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 2013-10-08
  • 2013-01-29
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
相关资源
最近更新 更多