【问题标题】:Wordpress session managementWordPress 会话管理
【发布时间】:2024-05-02 12:55:02
【问题描述】:

我正在使用 Wordpress 建立一个网站,我想利用它的会话。但我没有找到任何插件,甚至没有文档。在我开始破解之前有什么建议或参考吗?

注意:我问的是 WP 是否以及如何使用标准 PHP 会话本身,而不是如何添加 PHP 会话,例如使用 session_start()。显然,WP 维护的任何状态都是通过其他方式完成的。因此,如果我想使用 PHP 会话,我需要完全自己添加和维护它,使用线程中的技术。

谢谢大家!

【问题讨论】:

标签: wordpress session-management


【解决方案1】:

修改 WP Core 文件以使用会话是一个非常糟糕的主意。我发现的最好方法是从init 动作挂钩调用session_start()

function kana_init_session() {
  session_start();
}

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

您可以将它放在您主题的functions.php 文件中。

详细文章可以在这里找到:http://www.kanasolution.com/2011/01/session-variable-in-wordpress/

【讨论】:

    【解决方案2】:

    WordPress 似乎没有调用session_start(),因为它想成为无状态的 如果定义了register_globals,它会自动销毁你的$_SESSION

    【讨论】:

    • 谢谢 - 从中​​我了解到您可以在 wp_config 中自己调用 session_start(),它不会被更新覆盖。但比这更好的是,我使用 wp_config 来实例化一个“上下文”类的单例实例,我用它来保存我正在添加的一堆东西(包括例如扩展的用户身份验证表等),它可以调用会话开始()。您的参考资料为我澄清了这一点。 (现在我需要用他的补丁维护 wp_settings 以保留 $_SESSION,或者使用合并的“$input”数组。或者让“Context”维护和更新会话变量。)当他们这样做时我讨厌它。
    • 链接已失效,但在回程机器web.archive.org/web/20161021035452/http://…
    【解决方案3】:

    考虑使用WordPress Transient API

    使用 Transient API 存储的值对所有用户可见,而不仅仅是当前用户,取决于用于检索瞬态的唯一标识符,您可以为每个用户分配一个唯一标识符,本质上导致瞬态的行为非常像会话。

    进一步考虑:

    【讨论】:

      【解决方案4】:

      对于我需要做的事情,最好的答案是:

      1. 要允许 wordpress 的 cookie 跨子域持续存在,请安装 Root Cookie plugin
      2. sub1.domain.com 有wordpress; sub2.domain.com 是另一个站点。从另一个站点 (sub2),我读取了 cookie 以识别用户是谁以及用户是否已登录。

      我的cookies如下:

      [wordpress_909bb230b32f5f0473202684d863b2e0] => mshaffer|1255298821|d0249fced9c323835c5bf7e84ad3ffea
      [wordpress_logged_in_909bb230b32f5f0473202684d863b2e0] => mshaffer|1255298821|56e9c19541ecb596a1fa0995da935700
      

      使用 PHP,我可以遍历 cookie,解析 key=>value 对。这些 cookie 让我知道 [mshaffer] 有一个 cookie 存储在 wordpress 上,并且被验证为 logged_in。 cookie 的到期时间为1255298821

      sub2中,可以查询wordpress的数据库,获取用户信息:

      SELECT * FROM `wp_users` WHERE user_login = 'mshaffer' ... 从此查询中获取 user_iduser_email

      SELECT * FROM `wp_usermeta` WHERE user_id = '$user_id' ... 从 wp 中获取大量其他数据

      有了这些信息,我可以添加到我的 sub2 会话变量/cookie 中,然后对数据做我想做的事。我可以识别我是否已登录,以及我的用户名......这让我可以获取许多不同的数据。我现在可以在我的 sub2.domain.com 中使用 WordPress 身份验证并进行相应的重定向。

      蒙特

      {x:

      【讨论】:

      • 请记住,您不能相信 cookie 是真实的。我可以用我希望的任何用户名向您的网站发送 cookie。长十六进制字符串(我认为)是一个加密校验和,您需要对其进行解析以确保 cookie 是由 WordPress 设置的。
      • 当然 Tamlyn,您可以在 cookie 中添加额外的盐/胡椒,并在比较时进行额外检查。
      【解决方案5】:

      Wordpress 似乎没有使用任何会话。

      最好的方法是使用它提供的动作钩子。

      【讨论】:

      • 你完全不正确,Anraiki。 Wordpress 确实使用会话。而且.. 另外,如果您想使用自己的自定义会话值,请按照以下方式操作:您需要在 wp-config.php 的顶部添加以下行 if (!session_id()) { session_start();然后在header.php session_start(); 的顶部添加以下行
      • WordPress 使用 cookie,而不是会话
      • WordPress 默认不使用会话。
      【解决方案6】:

      您是否检查过这里的解决方案,这可能适用于这里并且很简单

      http://thedigilife.com/wordpress-how-to-set-session-custom-variable-while-login/

      【讨论】:

        【解决方案7】:

        在这种情况下,用session_start() 挂钩wp_loaded 上的函数似乎可行。

        【讨论】:

          【解决方案8】:

          将此代码放在 wp-config.php 的第一行:

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

          将此代码放在主题的 header.php 第一行:

          session_start();
          

          然后它将维护所有会话变量。

          【讨论】:

          • 这很好,但不要两者都做。将它放在 wp-config.php 中是一个问题,因为它总是会创建一个会话,并且会使用资源。即使是机器人点击也会创建一个会话——每次点击一个会话,因为它们不做 cookie。这是很多会话!
          【解决方案9】:

          如果您想使用自己的会话值,Wordpress 确实支持它

          您需要在wp-config.php顶部添加以下行

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

          然后在header.php的顶部添加以下行

          session_start();
          

          【讨论】:

          • 如果您正在编写插件,编辑 wo-config.php 并不是很好。如果插件需要它,请将 session_start() 挂接到 init 或 wp_loaded 中。值得注意的是,您可以像这样编辑 wp-config.php 并不意味着 WordPress 实际上支持它 - 毕竟,您正在编写所有代码。这里也有一个严重的问题——放置 session_start() 意味着每次点击,甚至是机器人,都会在你的会话文件夹中创建一个新会话。如果您获得大量流量,这可能会填满并导致各种问题,因此最好仅在需要时/在需要的地方创建会话。