这几天因为一些问题,零食学习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() // 从缓存中删除一个临时数据
代码示例
//获取标签云集 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);
wp_cache_get()
会返回 false,如果这样,你就要去数据库中重新获取这些信息。否则就返回在缓存中的信息。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_cache_delete
进行清理: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!'; }
测试下
[secret wx=1]粉色粉色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色粉色防守色防守打法[/secret]
-- 完 --
大神,我用那个对象缓存,当时生成了可以用wp_cache_get()获取到,但是执行完这次以后再去取就变成false了,这是什么原因
这个公众号验证码的,有使用缓存吗?
@小兜 公众号验证码是直接作为选项输入的,是使用的cookie记录的
云落大佬,佩服