WordPress 默认不支持使用 Cookie 以外的方式来保持用户登录,这是一个非常好的策略,可以保证 WordPress 站点的性能和页面打开速度。WordPress 专注于内容管理和发布,大多数情况下,使用 Cookie 保持用户登录就足够用了。但有时候,我们需要在两个或多个页面请求之间保存一些数据,这个时候,使用 Session 是非常简单和方便的,比如在使用 WordPress开发应用程序的时候,我们需要在用户提交表单后,提示结果给用户,也就是消息闪现( Flash )。
在 WordPress 初始化时启动 Session
在 WordPress 中启动 Session 其实非常简单,只需要把下面的代码加入主题的 functions.php 或插件中即可,下面的代码把启动 session 的函数挂载到了 WordPress 的初始化钩子上面,我们把该 Action 的优先级设置为 1,确保在其他功能启动之前,我们就已经启动 Session 了。
add_action( 'init', function ()
{
if ( ! session_id() ) {
session_start();
}
}, 1 );
在用户登录或注销时销毁 Session 数据
如本文刚开始所述,WordPress 没有使用 Session 保存用户登录数据,当然也不会在用户登录或注销时清理用户的 Session 数据。为了避免用户注销或登录其他账户时,用户的 Session 数据不会消失,我们需要在用户登录和注销时,为用户销毁 Session 数据。我们使用 WordPress 的 ‘wp-login’ 和 ‘wp-logout’ 这两个钩子来帮助用户在登录或注销时自动销毁 Session 数据。
add_action('wp_logout', 'destroy_session');
add_action('wp_login', 'destroy_session');
function destroy_session() {
session_destroy ();
}
使用 Session 保存和获取数据
添加了以上代码后,我们就可以使用 PHP 的 $_SESSION 变量来添加和获取 Session 数据了。
保存数据到 Session 中:
$_SESSION['message'] = "保存数据成功";
获取 Session 中的数据:
if(isset($_SESSION['message'])) {
$value = $_SESSION['message'];
} else {
$value = '';
}
把 Session 数据保存在 MySQL 数据库中,避免 Session 的一些问题
默认情况下,PHP 会把 Session 保存在临时文件中,多个请求都需要存取 Session 时,PHP 会因为文件锁而阻塞用户请求,带来性能上的问题。把 Session 数据保存在数据库中可以避免这个问题,有一个 Session 插件可以帮助我们实现这个转变,我们只需要安装启用这个插件可以了。
当然除了 MySQL 我们还可以把 Session 保存在 Redis 或 Memcached 中,方法也很简单,添加如下代码到 functions.php 中即可。
// 保存 Session 到 redis 中
ini_set("session.save_handler","redis");
ini_set("session.save_path","tcp://127.0.0.1:6379");
// 保存 Session 到 Memcache 中
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://10.1.1.1:11211");
综上所述,虽然 WordPress 默认没有使用 Session, 但是在 WordPress 中使用 Session 也时非常简单的,其实,一些大型的 WordPress插件都有使用 Session 来实现一些功能,比如流行的 WordPress 电子商务插件WooCommerce,有兴趣的朋友可以研究以下。