前几天我在自力博客看到 hzlzh 写的《WordPress归档页面模板,按日期列出所有文章》,在本地测试了一下,代码量很少,但每次访问存档页面数据库查询量太大导致打开页面很慢,于是放弃。
昨天帮一朋友修改一私人模板,发现里面有个函数是生成所有文章列表,问其出处,朋友说不知道,这么好的代码为啥没共享出来呢?于是有了这篇文章。
特点:
1. 这个存档函数会在数据库生成一个表 SHe_archives_25216,用来保存在文章新发表/删除文章时生成的 html,这主要是加快访问速度,不用每次都要查询数据库生成归档。
2. 显示每月文章数
3. 显示每篇文章的评论数
效果:见我博客的存档页
说明:我另外加了jQuery滑动效果,jQ代码来自上面提到的 hzlzh,稍微修改。
下面是详细步骤
1. 把下面的 archives_list_SHe 函数代码扔进主题的 functions.php 里面 (2010.7.23 edit)
function archives_list_SHe() { global $wpdb,$month; $lastpost = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_date <'" . current_time('mysql') . "' AND post_status='publish' AND post_type='post' AND post_password='' ORDER BY post_date DESC LIMIT 1"); $output = get_option('SHe_archives_'.$lastpost); if(empty($output)){ $output = ''; $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE 'SHe_archives_%'"); $q = "SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month, count(ID) as posts FROM $wpdb->posts p WHERE post_date <'" . current_time('mysql') . "' AND post_status='publish' AND post_type='post' AND post_password='' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC"; $monthresults = $wpdb->get_results($q); if ($monthresults) { foreach ($monthresults as $monthresult) { $thismonth = zeroise($monthresult->month, 2); $thisyear = $monthresult->year; $q = "SELECT ID, post_date, post_title, comment_count FROM $wpdb->posts p WHERE post_date LIKE '$thisyear-$thismonth-%' AND post_date AND post_status='publish' AND post_type='post' AND post_password='' ORDER BY post_date DESC"; $postresults = $wpdb->get_results($q); if ($postresults) { $text = sprintf('%s %d', $month[zeroise($monthresult->month,2)], $monthresult->year); $postcount = count($postresults); $output .= '<ul class="archives-list"><li><span class="archives-yearmonth">' . $text . ' (' . count($postresults) . ' 篇文章)</span><ul class="archives-monthlisting">' . "\n"; foreach ($postresults as $postresult) { if ($postresult->post_date != '0000-00-00 00:00:00') { $url = get_permalink($postresult->ID); $arc_title = $postresult->post_title; if ($arc_title) $text = wptexturize(strip_tags($arc_title)); else $text = $postresult->ID; $title_text = 'View this post, "' . wp_specialchars($text, 1) . '"'; $output .= '<li>' . mysql2date('d日', $postresult->post_date) . ': ' . "<a href='$url' title='$title_text'>$text</a>"; $output .= ' (' . $postresult->comment_count . ')'; $output .= '</li>' . "\n"; } } } $output .= '</ul></li></ul>' . "\n"; } update_option('SHe_archives_'.$lastpost,$output); }else{ $output = '<div class="errorbox">Sorry, no posts matched your criteria.</div>' . "\n"; } } echo $output; }
2. 复制一份主题的 page.php 更名为 archives.php,然后在最顶端加入:
<?php /* Template Name: archives */ ?>
再然后找到类似 <?php content(); ?>,在其下面加入如下代码(2010.7.21 edit)
<a id="expand_collapse" href="#">全部展开/收缩</a> <div id="archives"><?php archives_list_SHe(); ?></div>
进wp后台添加一新页面,在右侧栏模板选择 archives
3. 如果你的主题本身加载了 jQuery 库,那么继续把下面的 jQ 代码加上去,就会有滑动伸缩效果了(2010.7.23 edit)
/* 存档页面 jQ伸缩 */ $('#expand_collapse,.archives-yearmonth').css({cursor:"s-resize"}); $('#archives ul li ul.archives-monthlisting').hide(); $('#archives ul li ul.archives-monthlisting:first').show(); $('#archives ul li span.archives-yearmonth').click(function(){$(this).next().slideToggle('fast');return false;}); //以下下是全局的操作 $('#expand_collapse').toggle( function(){ $('#archives ul li ul.archives-monthlisting').slideDown('fast'); }, function(){ $('#archives ul li ul.archives-monthlisting').slideUp('fast'); });
css 样式可以通过 #archives 来定义
从折腾WordPress就一直使用的存档页面插件 Clean Archives Reloaded 终于可以光荣退休了。
ok,折腾完。
2010.7.21 update:由于ie下有点问题,所以重新修改了一下代码,折腾过的再 CP 一次吧。
2010.7.23 update:ie6/7下还是有问题,所以又重新修改了一下代码,囧~这次完美了吧,折腾过的再 CP 一次吧 - -!
- 本文标题:代码实现WordPress归档页面模板[速度很快]
- 本文链接:https://zww.me/archives/25209
- 发布时间:2010年07月21日 10:18
- 版权声明:除非注明,文章均为 zwwooooo 原创,转载请以链接形式标明本文地址!
哎呀!真是太学习了啊。看了博主的文章以及那么多评论才发现原来是介个样子!!
博主有空能不能写一篇关于友情链接页面的呀?
@折子戏
那个有人写过了……我没再写了,不过既然你提起,我就扔一篇自己修改过的,过两天吧
英文主题乱码啊.
@Cnfn
英文主题要记得转换编码。
[...] 1,加上了文章归档功能,参考了zwwooooo的代码实现WordPress归档页面模板[速度很快]。 [...]
这个我已经拿走了
这个是输出全部文章1000篇的代码,
我想分类也这样输出1000篇。
想请教下,怎么修改。
@hsmw
用 get_posts() 函数或者用 query_posts() 函数,具体参考 WP codex:
http://codex.wordpress.org/Template_Tags/get_posts
http://codex.wordpress.org/Function_Reference/query_posts
@zwwooooo
老大我想问下 如果标题太长怎么办?有办法控制码》
求救啊
老大我想问下 如果标题太长怎么办?有办法控制码》
@我爱玩
给
里面的 $text 加 php 截取函数控制长度,具体的函数查询 php 常用函数
[...] 转载:http://zww.me/archives/25209 [...]
[...] 方法来源:http://zww.me/archives/25209 [...]
这个很实用哦,不知道是否会对SEO有理呢?
@朱定聪
这……我没去考虑过seo
请问如果主题里面有自定类型的文章,怎么能够用这种方式来归档呢?谢谢!
zwwooooo,看了你自己的存档示例,很不错,可以把你的这块CSS分享下吗,谢谢!
@leo_zhangj
不用分享,既然是我的主题,你大可以用firebug看
站长您好,不好意思打扰您了。我按照这篇文章的步骤,做好了“归档”页面,但是问题也出现了,这个“展开”按钮,就是弹不开全部日志,始终都是收缩得紧紧的,我都急死了。请帮忙看看,http://www.sweetbao.com/archive/
@mack
你的网站打不开
@zwwooooo
前几天网站出了点问题,现在可以正常访问了,麻烦在帮我看看!
@mack
你好像折腾好了。
[...] 参照了zwwooooo写的《代码实现WordPress归档页面模板》后,做好了“归档”页面,但是问题也出现了: [...]
想请教一下,如果归档想排除某一个分类,该如何操作呢?
2012年3月6日 星期二 10:55:18
@子非我
要加排除语句,具体嘛,最好参考我最新的那篇文章的方法,然后看看给 WP_Query() 函数加排除分类参数
弄了半天,只能把全部的文章列出来,滑动伸缩效果出不来,不知道你最后说的jQ 代码是添加在什么地方,老大指引下
@豆豆
jQ同js,先挂jQuery库(1.3.2版本以上即可),然后把我写的jQuery代码存成js文件挂在jQuery库后面(即jQ库先载入),具体嘛,搜一下就知道了。
@zwwooooo
是不是把你写的jQuery代码存成js文件,然后在header.php里面加载就可以了?
@豆豆
对,先加载jQuery库
[...] 代码参考:http://zww.me/archives/25209 [...]
[...] 不过找来找去,还是在http://zww.me找到了一篇《代码实现WordPress归档页面模板[速度很快]》这个文章,将如何实现进行了详细的说明。 [...]
大师,请问一下你这个网站顶部的导航时怎么实现的啊,好酷。不知道能不能传授一下。
@just.suny
顶部导航没啥,css写出来就行了
[...] archieves页面页面的制作参考这里,其中更详细的对PHP的一点都不懂得人的提醒参考这里。 [...]
[...] 方法来源:http://zww.me/archives/25209 [...]