WordPress中如何设置cookie?

日期: 标签:phpWordPress教程
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我

     编写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
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者。

19 条留言

点此留言
  1. enoit enoit

    正好发现写主题的时候header()也不能用,可是WP到底提前发送了什么?

  2. 韩麦斯 韩麦斯

    这几天一直在网上找关于加密文章密码的cookie的问题。
    怎么样让访问者退出浏览器cookie失效。
    还有,只要输对密码看了一篇加密的文章后,其他相同密码的加密文章都能被看到。
    不知博主可否研究下。

    • Ludou

      @韩麦斯 这是WordPress的内在问题,暂时没法解决,你也可以将此问题提供给WordPress官方。

      • 小蝴蝶 小蝴蝶

        @Ludou 可以用远程删除cookie的思路吧~用php的setcookie ('example', '', time() – 1);或者js写一个函数操作document.cookie

    • 李木 李木

      @韩麦斯 还真没用过加密功能,若真是这样,还算个不大不小的漏洞呢

  3. 特种纸 特种纸

    标志下
    周末学习学习

  4. 侯永禄 侯永禄

    最近想自己做一个使用cookie的统计插件,每次有困难都能在你这里得到启发。

  5. 向日葵媒体设计

    有没办法调用用户最后访问记录?

    • Ludou

      @向日葵媒体设计 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 我试试哦,谢谢了

  6. 花生奶油

    非常郑重其事的请教你个问题 搜遍了网络也没有解决的办法。大概意思是:关于你的这篇文章https://www.ludou.org/creating-custom-write-panels-in-wordpress.html

    他插入字段是插入到wp_postmeta表中,而这个表是个纵向表,数据多的时候很不好。有没有办法让他插入到wp_posts这个表中?就打个比方:每发布一篇新文章都有一个自定义"img"字段,这个字段就根据文章的ID放在wp_posts表中?你是唯一的希望了,如果你也没办法解决,那就难了!

    • Ludou

      @花生奶油 参考文章:https://www.ludou.org/wordpress-add-post-column.html
      另外,请在对应的文章中留言!

  7. tesswave tesswave

    高手,想请教一个问题,为什么我的WP网站检测到的很多死链接都是分类连接的后面有个/feed/呢,能否帮忙解答一下,谢谢了。

  8. boce boce

    百度站长平台的“合理使用cookie”,也可以这么搞吗!

  9. Nat

    感谢博主 成功利用cookie实现了动态布局

  10. GaGa

    在Wordpress4.3.1 在WP安装后几个小时再次登录,使用后台的主题–自定义,出现“会话已过期,请重新登录,您不会被帶离此页”,输入登录信息后依然出现这个提示,是否也是Cookie问题?
    修改pluggable.php中的Cookie设置是否可以解决?
    和文中的修改方式有何不同?

    多谢!

  11. 你好

    额 我的cookie要是一个变量呢 我怎么把变量放到里面去呢,难道是调用set_newuser_cookie( $value )???小白,请指教。

  12. chancat chancat

    博主
    那我要是想设置Set-Cookie 但不想在服务器环境里设置的话wp要怎么改?

发表留言