这里不是说的的使用缓存插件之类的东西,是关于如何利用wordpress自带的缓存体系。很多时候,比如输出最新评论、相关文章、读者墙等地方,基本是不需要实时更新的,然而每次打开页面就会去数据库里查询一次。用伪静态化当然可以解决这些问题,不过对于流量不大的博客就没必要了。wordpress自带有缓存体系,关键的函数你可以在wp-includes/cache.php或 Codex里查找到所有的函数。

你可以使用下列函数来实现添加缓存。

wp_cache_add($key, $data, $flag = ”, $expire = 0)

相反的,要删除缓存数据可以通过下面的方法实现。

wp_cache_delete($id, $flag = ”)

提取缓存数据:

wp_cache_get($id, $flag = ”)

替换缓存数据:

wp_cache_replace($key, $data, $flag = ”, $expire = 0)

 

举个例子,如果想输出最新评论,可以先从缓存里读取需要输出的HTML,如果没有,请求一次,成功后加入缓存,当然时间可以控制。

我知道有很多最新评论,相关文章免插件输出的方法,原理都一样,可以自行改改,贴个我用的:

<?php

/**
 * get recent comments
 * @param unknown_type $args
 * @return unknown_type
 */
function WinyskyRecentcomments($args='number=5&status=approve'){

	$cacheID = md5($args);
    //有缓存就直接输出
	if($output = wp_cache_get('recentComments_'.$cacheID, 'Winysky')){
		echo $output;
		return;
	}

	//$rcms = get_comments($args);
global $wpdb;

	$my_email = "'" . get_bloginfo ('admin_email') . "'";
//自动获取博主邮箱
$rcms = $wpdb->get_results("
SELECT ID, post_title, comment_ID, comment_author, comment_author_email, comment_content
FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts
ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID)
WHERE comment_approved = '1'
AND comment_type = ''
AND post_password = ''
AND comment_author_email != $my_email

ORDER BY comment_date_gmt
DESC LIMIT 10

");

	//print_r($rcms);return;
	if(empty($rcms)){
		_e('没有数据');
		return;
	}
	//历遍数据
	$output = '';
	foreach( $rcms as $rcm ){
			$author = $rcm->comment_author;
			//if($author =='admin'){continue;}
      		$content = WinyskyStriptags( $rcm->comment_content);
		$the_title = get_the_title($rcm->comment_post_ID);
		$s_excerpt = convert_smilies( WinyskySubstr( $content, 200 ) );
		$contents = '<span class=\'recentcommentslink_author\'>' . $author . '</span> <span class=\'recentcommentslink_on\'>on</span> <span class=\'recentcommentslink_title\'>' . $the_title . '</span><div class=\'recentcommentslink_excerpt\'>' . get_avatar($rcm->comment_author_email, 64). $s_excerpt . '</div>';

			$output .=  '<li><div id="C_' . $rcm->comment_ID . '_d" style="display:none">' . $contents . '</div>' . '<a id="C_' . $rcm->comment_ID . '" class="recentcommentslink" href="' . get_permalink($rcm->comment_post_ID) . '#comment-' . $rcm->comment_ID . '" >' . get_avatar($rcm->comment_author_email, 32) . '</a></li>';

	}
	//输出后加入缓存
	wp_cache_add('recentComments_'.$cacheID. $output, 'Winysky');
	echo $output;
}

ps:顺便show下独特的最新评论样式,左侧的头像鼠标移上去看看,:-D

  1. 海天 (2010.07.11 at 20:58) 9楼

    貌似效果很不错啊
    可是我的主题 最新文章什么的 是这样形式的:

    我不知道怎么改 汗

    • winy() (2010.07.11 at 21:58)

      @海天 呃,php标签会被过滤的,若要贴代码, 将"<" 改成 "<" 即可,

  2. 海天 (2010.07.15 at 17:12) 10楼

    博主 我用你的邮件系统给你发邮件了
    请查收

  3. liveasx (2010.07.23 at 12:54) 11楼

    :mrgreen: 您正在使用古老的 Internet Explorer 浏览网页, 该浏览器不符合W3C国际标准, 本站网页可能显示不正常,或部分功能无法使用

  4. 严重浪漫 (2010.10.05 at 14:51) 12楼

    用了这个,就不需要WP Super Cache、cos-html-cache 之类的插件了吧?

    • winy() (2010.10.05 at 14:53)

      @严重浪漫 ,原理差不多,但插件还是比较方便,自带的当然更好

  5. 冯志强 (2010.11.29 at 14:19) 13楼

    这个不错,必须支持下

  6. zwwooooo (2011.03.24 at 20:14) 14楼

    咳咳,貌似这句有错误……

    //输出后加入缓存
    wp_cache_add('recentComments_'.$cacheID. $output, 'Winysky');

    • winy() (2011.03.24 at 20:42)

      @zwwooooo ,看得真仔细...应该是wp_cache_add('recentComments_'.$cacheID,$output, 'Winysky');

    • zwwooooo (2011.03.24 at 20:45)

      @winy ,因为我自己折腾的没有成功,特来看看你的代码,所以很细心。我的问题是:我们的代码差不多,但我的没有效果,copy你的,也没有效果,纳闷……

    • winy() (2011.03.24 at 20:51)

      @zwwooooo ,config.php里面添加define('WP_CACHE', true);没?
      我是看的官方文档,其实我也没具体测试效果,因为我这里流量小负担不大。如果你用了其它缓存插件,基本上这个就没效果了。因为这些插件有类似的方法

    • zwwooooo (2011.03.24 at 20:53)

      @winy ,这个是打开的,但是就是没有效果,很郁闷,不鸟了,干脆装个缓存插件吧,哈哈

评论分页: 1 2

发布评论

邮箱(必填)

换个背景