最近不怎么折腾,安心学习,不过期间也接了点小活儿,给老外实现了个小功能,就是用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的动态载入,说实话偷懒,直接用了《无限分页效果》,先隐藏上面的文章,再在底部插入新的。效果还行,虽然还是效率不高,凑合用用,问题不大。
没看到限制数量...如果..吧文章都点过一遍....会不会.出错啊...COOKIES 貌似长度有限制..
@qlj ,嗯,是的,忘记考虑了,得加个限制