編寫 WordPress 外掛和主題的時候,經常需要用到 cookie,比如存取使用者狀態等,我之前編寫的外掛 Ludou Simple Vote 就用 cookie 來記錄使用者投票時間,以實現簡單的防止重複投票功能。
但是如果你在 WordPress 主題檔案中直接使用 php 的 setcookie() 來傳送 cookie,那是完全不行的。 setcookie() 檔案中有一條內容:必須在任何其他輸出傳送前對 cookie 進行賦值,我懷疑 WordPress 初始化的時候已經傳送了其他輸出,才導致 setcookie 失效。於是深入搜尋了 Google,從一篇老外的文章中獲得了以下方法:
1 、在主題檔案 functions.php 中新增以下程式碼,以設定 cookie:
/**
* 函式名稱,setcookie 的相關引數等可以自行修改
*/
function set_newuser_cookie() {
if (!isset($_COOKIE['sitename_newvisitor'])) {
setcookie('sitename_newvisitor', 1, time()+1209600, COOKIEPATH, COOKIE_DOMAIN, false);
}
}
add_action( 'init', 'set_newuser_cookie');
// 上面一行程式碼也可以改成下面一行程式碼
// add_action('after_setup_theme', 'set_newuser_cookie');
2 、然後在需要呼叫 cookie 值的地方讀取 cookie
if (isset($_COOKIE['sitename_newvisitor'])) {
echo 'Welcome back!';
}
else {
echo 'Hello new visitor!';
}
注意事項:
1 、在 WordPress 中,任何 PHP 時間函式,例如 time() 返回的時間不正確,這些時間函式返回的都是 UTC+0 時區的時間,如果你想獲得你在 WordPress 後臺 – 設定 – 常規中設定的時區時間,可以使用以下幾個 WordPress 的時間函式:
date_i18n('Y-m-d h:i:s'); // 返回當地時間
current_time('timestamp'); // 返回當地時間的 Unix 時間戳
current_time('mysql'); // 返回適用於 MySQL 的時間格式
time() + get_option('gmt_offset') * 3600; // 手工獲得當地時間的 Unix 時間戳
所以,傳送 cookie 的時候,你可以將 time() 改成 date_i18n('U') 或 current_time('timestamp')
2 、 cookie 的失效時間也是需要注意的一個問題,伺服器端的時間和客戶端的時間可能會不一樣,所以會導致 cookie 失效時間可能跟你設想的不
太一樣,所以如果你透過以上方法傳送了 cookie,但是死活都獲取不到值,那麼你可以試試將 cookie 的失效時間設定長點。
好了,WordPress 中設定 Cookies 的方法就介紹到此,你可以透過以上程式碼舉一反三,用於你的 WordPress 外掛和主題開發。