最近不怎么折腾,安心学习,不过期间也接了点小活儿,给老外实现了个小功能,就是用cookie控制的随机文章。具体的说,就是在一段时间内你每次看到的随机文章都是不同的,并且是你没看过的随机文章。原理很简单,就是cookie来记录展示过的文章(记录ID),在显示随机文章时如果获取到了这个cookie里面包含这些已经展示的文章ID,那就不用出现这篇文章。同时给cookie设定一个期限,过期作废。

这个功能其实就是《记录你看过的文章》的另外一种运用,我觉得最有意思的是怎么控制主循环排除掉已经出现过的文章,方法可以看我的上一篇文章。还有cookie的数组保存和读取,用了serialize 这个php函数,没事google出来的,没学过php的人,见笑了。。。

这个具体效果还是看demo吧:

http://winysky.com/demo/?preview_theme=twentyten_mod

修改了一下wp3.0的默认主题,现在是每次只展示一篇随机文章,点击more会显示下一篇随机文章。但是,你不会再看到相同的文章了,除非你删除了cookie,默认cookie过期时间是1小时。(我觉得这很蛋疼。。。不知道为啥有这奇怪的要求,不过有报酬那就好,哈哈)

也把代码放出来,很长,不懂的直接表示路过就好了。。。有一些蹩脚的英文注释。

这是function里面的内容:

<?php
if ( ! function_exists( 'winy_ran_cookie' ) ) :
/**
 * This function control the cookies used in the randompost in index page
 *
 * @by winy 2010.11.19
 */
function winy_ran_cookie($savecookieid) {

	setcookie("randompostsviewed", '');//delete old ones
	$savecookiestr=serialize($savecookieid);//use serialize() to store the array
	setcookie("randompostsviewed",$savecookiestr,time()+3600*1,COOKIEPATH, COOKIE_DOMAIN);//keep for 1 hour by default 

}
endif;

这是修改的主循环部分:

<?php
if(isset($_COOKIE['randompostsviewed'])){
$savecookiestr = $_COOKIE['randompostsviewed'];
$savecookieid = unserialize($savecookiestr);//print_r($savecookieid);//for test
			}else{
		$savecookieid = array();
			}
	$savecookieid[] = get_option("sticky_posts");
				?>
 <?php $args = array('post_status' => 'publish','caller_get_posts'=>1,'post__not_in' => $savecookieid, 'orderby' => 'rand', 'posts_per_page' => 1);query_posts($args); ?>
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

				<?php if (!in_array($post->ID,$savecookieid,true)) {
				 $savecookieid[]= $post->ID;}
				winy_ran_cookie($savecookieid);
				//echo "<p>REQUEST:$wp_query->request</p>";//test query
			?>

...以下省略xhtml部分若干

<?php endwhile; else: ?>
 <p>Sorry, no posts matched your criteria.</p>
 <?php endif; ?>
<!--Randam part end -->

用了$savecookieid来保存显示过的文章,cookie是每次都要读取的。存储是把数组序列化再写入。另外,可能由于在后面输出cookie,functions.php头部需要加上ob_start();,不然会出warning。

至于那个ajax的动态载入,说实话偷懒,直接用了《无限分页效果》,先隐藏上面的文章,再在底部插入新的。效果还行,虽然还是效率不高,凑合用用,问题不大。

  1. qlj (2011.02.09 at 23:09) 17楼

    没看到限制数量...如果..吧文章都点过一遍....会不会.出错啊...COOKIES 貌似长度有限制..

    • winy() (2011.02.09 at 23:16)

      @qlj ,嗯,是的,忘记考虑了,得加个限制

评论分页: 1 2 3

发布评论

邮箱(必填)

换个背景