WordPress 默認(rèn)不支持使用 Cookie 以外的方式來保持用戶登錄,這是一個(gè)非常好的策略,可以保證 WordPress 站點(diǎn)的性能和頁面打開速度。WordPress 專注于內(nèi)容管理和發(fā)布,大多數(shù)情況下,使用 Cookie 保持用戶登錄就足夠用了。但有時(shí)候,我們需要在兩個(gè)或多個(gè)頁面請求之間保存一些數(shù)據(jù),這個(gè)時(shí)候,使用 Session 是非常簡單和方便的,比如在使用 WordPress開發(fā)應(yīng)用程序的時(shí)候,我們需要在用戶提交表單后,提示結(jié)果給用戶,也就是消息閃現(xiàn)( Flash )。
在 WordPress 初始化時(shí)啟動 Session
在 WordPress 中啟動 Session 其實(shí)非常簡單,只需要把下面的代碼加入主題的 functions.php 或插件中即可,下面的代碼把啟動 session 的函數(shù)掛載到了 WordPress 的初始化鉤子上面,我們把該 Action 的優(yōu)先級設(shè)置為 1,確保在其他功能啟動之前,我們就已經(jīng)啟動 Session 了。
add_action( 'init', function ()
{
if ( ! session_id() ) {
session_start();
}
}, 1 );
在用戶登錄或注銷時(shí)銷毀 Session 數(shù)據(jù)
如本文剛開始所述,WordPress 沒有使用 Session 保存用戶登錄數(shù)據(jù),當(dāng)然也不會在用戶登錄或注銷時(shí)清理用戶的 Session 數(shù)據(jù)。為了避免用戶注銷或登錄其他賬戶時(shí),用戶的 Session 數(shù)據(jù)不會消失,我們需要在用戶登錄和注銷時(shí),為用戶銷毀 Session 數(shù)據(jù)。我們使用 WordPress 的 ‘wp-login’ 和 ‘wp-logout’ 這兩個(gè)鉤子來幫助用戶在登錄或注銷時(shí)自動銷毀 Session 數(shù)據(jù)。
add_action('wp_logout', 'destroy_session');
add_action('wp_login', 'destroy_session');
function destroy_session() {
session_destroy ();
}
使用 Session 保存和獲取數(shù)據(jù)
添加了以上代碼后,我們就可以使用 PHP 的 $_SESSION 變量來添加和獲取 Session 數(shù)據(jù)了。
保存數(shù)據(jù)到 Session 中:
$_SESSION['message'] = "保存數(shù)據(jù)成功";
獲取 Session 中的數(shù)據(jù):
if(isset($_SESSION['message'])) {
$value = $_SESSION['message'];
} else {
$value = '';
}
把 Session 數(shù)據(jù)保存在 MySQL 數(shù)據(jù)庫中,避免 Session 的一些問題
默認(rèn)情況下,PHP 會把 Session 保存在臨時(shí)文件中,多個(gè)請求都需要存取 Session 時(shí),PHP 會因?yàn)槲募i而阻塞用戶請求,帶來性能上的問題。把 Session 數(shù)據(jù)保存在數(shù)據(jù)庫中可以避免這個(gè)問題,有一個(gè) Session 插件可以幫助我們實(shí)現(xiàn)這個(gè)轉(zhuǎn)變,我們只需要安裝啟用這個(gè)插件可以了。
當(dāng)然除了 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 默認(rèn)沒有使用 Session, 但是在 WordPress 中使用 Session 也時(shí)非常簡單的,其實(shí),一些大型的 WordPress插件都有使用 Session 來實(shí)現(xiàn)一些功能,比如流行的 WordPress 電子商務(wù)插件WooCommerce,有興趣的朋友可以研究以下。


