WordPress中如何设置cookie?
编写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插件和主题开发。
参考文章:
http://wptheming.com/2011/04/set-a-cookie-in-wordpress/
http://beamnote.com/2011/time-of-wordpress.html
-- 完 --
本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/set-a-cookie-in-wordpress.html
正好发现写主题的时候header()也不能用,可是WP到底提前发送了什么?
这几天一直在网上找关于加密文章密码的cookie的问题。
怎么样让访问者退出浏览器cookie失效。
还有,只要输对密码看了一篇加密的文章后,其他相同密码的加密文章都能被看到。
不知博主可否研究下。
@韩麦斯 这是WordPress的内在问题,暂时没法解决,你也可以将此问题提供给WordPress官方。
@Ludou 可以用远程删除cookie的思路吧~用php的setcookie ('example', '', time() – 1);或者js写一个函数操作document.cookie
@韩麦斯 还真没用过加密功能,若真是这样,还算个不大不小的漏洞呢
标志下
周末学习学习
最近想自己做一个使用cookie的统计插件,每次有困难都能在你这里得到启发。
有没办法调用用户最后访问记录?
@向日葵媒体设计 1、插件http://wordpress.org/extend/plugins/simple-login-log/
2、代码,在functions.php中添加以下php代码:
function codecto_last_login($user_login, $user) {
update_usermeta($user->ID, 'last_login', date_i18n('Y-m-d H:i:s'));
}
add_action('wp_login','codecto_last_login', 10, 2);
然后在需要的地方调用即可
echo get_user_meta( $user_ID, 'last_login', true); // $user_ID自行获取
@Ludou 我试试哦,谢谢了
非常郑重其事的请教你个问题 搜遍了网络也没有解决的办法。大概意思是:关于你的这篇文章https://www.ludou.org/creating-custom-write-panels-in-wordpress.html
他插入字段是插入到wp_postmeta表中,而这个表是个纵向表,数据多的时候很不好。有没有办法让他插入到wp_posts这个表中?就打个比方:每发布一篇新文章都有一个自定义"img"字段,这个字段就根据文章的ID放在wp_posts表中?你是唯一的希望了,如果你也没办法解决,那就难了!
@花生奶油 参考文章:https://www.ludou.org/wordpress-add-post-column.html
另外,请在对应的文章中留言!
高手,想请教一个问题,为什么我的WP网站检测到的很多死链接都是分类连接的后面有个/feed/呢,能否帮忙解答一下,谢谢了。
@tesswave 检测工具的问题
百度站长平台的“合理使用cookie”,也可以这么搞吗!
感谢博主 成功利用cookie实现了动态布局
在Wordpress4.3.1 在WP安装后几个小时再次登录,使用后台的主题–自定义,出现“会话已过期,请重新登录,您不会被帶离此页”,输入登录信息后依然出现这个提示,是否也是Cookie问题?
修改pluggable.php中的Cookie设置是否可以解决?
和文中的修改方式有何不同?
多谢!
额 我的cookie要是一个变量呢 我怎么把变量放到里面去呢,难道是调用set_newuser_cookie( $value )???小白,请指教。
博主
那我要是想设置Set-Cookie 但不想在服务器环境里设置的话wp要怎么改?