• 主题更新一下,修复了头像挂掉的问题

  • 后羿更新网站文章可能不会那么闲了

  • 不得不说,美国贴吧的界面真是难看到死

  • 看到网上新闻美国的贴吧将成为中国公司

  • 推送试试

  • 睡觉之前测试一下

  • 发现了一个非常不错的插件

  • 经过确认,微软的必应搜索在中国被屏蔽

  • 给主题增加一个阿里云的代码库

  • 正式通知一下,有赞支付已经停止业务了

WordPress操作缓存和cookie示例方法

WordPress 云落 2年前 (2017-08-30) 1918次浏览 4个评论
文章目录[隐藏]

这几天因为一些问题,零食学习 WordPress 的缓存以及 cookie,临时抱佛脚,我直接抱了露兜和水煮鱼的大脚,找到了想要的,都说好东西,索性直接摘抄了,混合匀兑一下,自己这里记录下,留作记录,下次来复习。

WordPress操作缓存和cookie示例方法

WordPress Transients API

WordPress Transients API 缓存的数据存储在哪里

这个取决你的服务器设置,如果你的服务器开启 Memcache 这类对象缓存,那么缓存的数据就存在 Memcached 的内存中。如果没有开启的话,则存储到 WordPress 数据库的 Options 表中。

WordPress Transients API 的函数

上面说到服务器没有开启的时候,数据是存储到 Options 表中的,所以它接口函数和 WordPress 的 Option API (get_option, add_option, update_option, delete_option))基本一样,唯一区别就是 Transients API 有一个过期时间。所以 WordPress Transients API 有类似的以下三个函数:

    set_transient() // 保存一个临时数据到缓存中

    get_transient() // 从缓存中获取一个临时数据

    delete_transient() // 从缓存中删除一个临时数据
如果你使用函数 get_transient 去获取一个临时变量,它已经过期或者不存在,则返回 false。另外 Transients API 不会将数据库的 Options 表充满,因为临时变量一旦过期,下次获取的时候就会自动被删除。

代码示例

//获取标签云集
function Bing_page_tags(){
    if( ( $cache = get_transient( 'page_tags_list' ) ) !== false ) return $cache;//如果有 Transients 缓存则直接返回
    //如果没有缓存则开始生成 HTML 代码
    $code = '';
    if( $tags = get_tags( 'orderby=count&order=DESC' ) ){
        foreach( $tags as $tag ){
            $code .= '<li class="tag-box">';
                $post = current( get_posts( array(
                    'tag_id'         => $tag->term_id,
                    'posts_per_page' => 1
                ) ) );
                $code .= "<p class='tag-name'>$tag->name</p>";
                $code .= sprintf( '<a href="%s">%s</a>', esc_url( get_permalink( $post ) ), get_the_title( $post ) );
            $code .= '</li>';
        }
        $code .= "<ul id='tags_list'>$code</ul>";
    }
    //建立 Transients 缓存并返回代码
    set_transient( 'page_tags_list', $code, DAY_IN_SECONDS );//缓存有效 24 小时
    return $code;
}

上面的代码用来生成标签云集的 HTML 代码,并且缓存 24 小时(DAY_IN_SECONDS 为时间常量,表示 24 小时的秒数),如果存在缓存则直接返回,不用再次生成,避免大量 SQL 查询。

但这期间修改标签或文章却无法立即显示,所以还需要在特定事件清除缓存:

//清除标签云缓存
function clear_page_tags_cache(){
    delete_transient( 'page_tags_list' );//删除 Transients 缓存
}
add_action( 'save_post', 'clear_page_tags_cache' );//创建和编辑文章
add_action( 'deleted_post', 'clear_page_tags_cache' );//删除文章
add_action( 'created_post_tag', 'clear_page_tags_cache' );//创建标签
add_action( 'edited_post_tag', 'clear_page_tags_cache' );//编辑标签
add_action( 'delete_post_tag', 'clear_page_tags_cache' );//删除标签

使用 WordPress 对象缓存

global $post;
$related_posts_data = wp_get_related_posts();
wp_cache_set($post->ID,$related_posts_data,'related_posts',3600);
global $post;
$related_posts_data = wp_cache_get($post->ID,'related_posts');
if(false === $related_posts_data){
	$related_posts_data = wp_get_related_posts();
	wp_cache_set($post->ID,$related_posts_data,'related_posts',3600);
}
echo $related_posts_data;
wp_cacache_delete($post->ID,'related_posts');

WordPress 中如何设置 cookie

编写 WordPress 插件和主题的时候,经常需要用到 cookie,比如存取用户状态等,我之前编写的插件 Ludou Simple Vote 就用 cookie 来记录用户投票时间,以实现简单的防止重复投票功能。
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!';
}
文章代码转载自露兜,水煮鱼

测试下

验证码:
请关注极客公园官方微信公众号,关注并订阅云落极客公园获取验证码。在微信里搜索云落极客公园或者微信扫描二维码都可以关注极客公园官方微信公众号。


-- 完 --
WordPress操作缓存和cookie示例方法
扫码订阅,第一时间获得更新
微信扫码二维码,订阅我们网站的动态,另外不定时发送 WordPress 小技巧,你可以随时退订,欢迎订阅哦~

极客公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:WordPress操作缓存和cookie示例方法

极客公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:WordPress操作缓存和cookie示例方法
喜欢 (3)
云落
关于作者:
无折腾,不生活,我是一个WordPress菜鸟,一个玩淘宝的卖家,欢迎你认识我,我是云落!
发表我的评论
取消评论
表情 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(4)个小伙伴在吐槽
  1. 大神,我用那个对象缓存,当时生成了可以用wp_cache_get()获取到,但是执行完这次以后再去取就变成false了,这是什么原因
    阿龙2019-07-16 17:02 回复 Windows 7 | Chrome 74.0.3729.169
  2. 这个公众号验证码的,有使用缓存吗?
    小兜2018-12-05 21:57 回复 Windows 10 | Chrome 70.0.3538.110
    • 云落
      公众号验证码是直接作为选项输入的,是使用的cookie记录的
      云落2018-12-05 21:58 回复 Windows 10 | Chrome 70.0.3538.110
  3. 云落大佬,佩服
    青春2017-08-30 23:03 回复 Windows 7 | Firefox浏览器 55.0