wordpress按分类归档方法
Wordpress按分类归档方法实现
首先建立一个archives.php(和archive.php不同,名称也可以随意),存入themes目录下,如果需要和主题保持一式,粘贴page.php的代码到archives.php中,在开头添加如下代码:
<?php /* Template Name: Archives */ ?>
然后到后台页面中选择添加新页面,输入名称,别名输成archives(可以自定义),模板中选择Archives,内容留空即可。关键是用存档代码替换掉archives.php中的the_content()函数。重点说这个。
昨天晚上等球的时候没事干,就进入PhpMyAdmin查看一下wordpress的数据库。发现分类信息存于wp_terms和 wp_term_taxonomy两个表中。那么可以通过查询数据库得到分类目录的ID,这样别的都好说了。
先说说按分类目录实现存档页面的方法。总体思路还是附上图。然后一步一步说。
1. 对wp_terms和 wp_term_taxonomy两表进行数据库查询,我想得到的安段有term_id(分类目录或者标签的ID),name(分类目录或者标签的标 题),count(每个分类目录或者标签下文章的数量),而查询的条件是按wp_term_taxonomy表中的taxonomy字段值。
sql查询语句如下:
SELECT w.term_id,w.name,wt.count FROM wp_terms AS w, wp_term_taxonomy AS wt WHERE wt.taxonomy='category' AND wt.term_id=w.term_id AND w.term_id>1
其中w.ter_id>1是因为“未分类”的ID为1,而我不想显示这个分类,如果你删除了这个分类目录,那么可以取消这个查询条件。
得到的结果如下:
上面是在PhpMyAdmin中查询后的结果,在wordpress中调用wpdb类的实现代码:
<?php global $wpdb; $sql = "SELECT w.term_id,w.name,wt.count FROM $wpdb->terms AS w, $wpdb->term_taxonomy AS wt WHERE wt.taxonomy='category' AND wt.term_id=w.term_id AND w.term_id>1";//如上的sql查询 $cat=$wpdb->get_results($sql);//默认以对象形式返回结果。 ?>
数据库的查询完成。
2. $cat是查询后返回的结果,对其进行进行遍历。
<?php foreach ($cat as $term) : $id=$term->term_id; $name=$term->name; $count=$term->count; //...插入查询文章列表代码 ?> <?php endforeach; ?>
3. 得到三个变量后,在上面相应位置插入文章列表遍历代码。
<h3><?php echo $name."(".$count.")"; ?></h3> <!--分类目录标题及文章数-->
<?php
global $post;
$myposts = get_posts('numberposts=-1&category='.$id); //按条件查询文章
foreach($myposts as $post) :
$comm_count=$post->comment_count; ?><!--得到评论数-->
<li><a href="<?php the_permalink(); ?>"><?php the_title(); echo " (".$comm_count.")"; ?></a></li>//打印文章列表
<?php endforeach; ?>
关于get_posts()函数可以查询codex,我只说说这里的参数:numberposts是返回文章数,-1表示不限制;category表示显示某一分类目录ID的文章。
再加点html,总的代码如下:
<div> <?php global $wpdb; $sql = "SELECT w.term_id,w.name,wt.count FROM $wpdb->terms AS w, $wpdb->term_taxonomy AS wt WHERE wt.taxonomy='category' AND wt.term_id=w.term_id AND w.term_id>1"; $cat=$wpdb->get_results($sql); foreach ($cat as $term)> <?php $id=$term->term_id; $name=$term->name; $count=$term->count; ?> <h5><?php echo $name."(".$count.")"; ?></h5> <ul> <!--以列表方式输出文章--> <?php global $post; $myposts = get_posts('numberposts=-1&category='.$id); foreach($myposts as $post) : ?> <?php $comm_count=$post->comment_count;?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); echo " (".$comm_count.")"; ?></a></li> <?php endforeach; ?> </ul> <?php endforeach; ?> <!--此处可以加入jQuery代码--> </div>
将以上代码替换the_content()。
4. 然后设置一下CSS,使其与主题更和谐~(发现现在有点烦CSS,麻烦球的。)
5. 比较整洁的方式是只显示标题,当读者感兴趣的时候点击标题,显示相应文章列表。用jQuery实现。(其实开始我想过用wp_list_category()获取分类目录及链接,然后jQuery调用Ajax来实现以上的效果,想想原理挺简单,不过实现其来似乎颇废时间,改天有激情的时候尝试一下)
<script type="text/javascript">
jQuery(function($){
$('.archive ul').hide();
$('.archive h5').toggle(
function(){
$(this).next('ul').slideDown();//滑动效果
},
function(){
$(this).next('ul').slideUp();
});
});
</script>
最好不要直接在CSS中写成display:none;用jQuery脚本实现隐藏,是为了有些浏览器禁止或js加载不正常时仍能将文章列出。
按照前面的流程表实现了wordpress按分类目录归类的存档页面,并且加入了jQuery效果。总体效果是满意的,但是还存在以下已知或可能出现的问题:
- 对“未分类”目录的处理,如果有些文章是“未分类”的,那么按这个程序是不会显示,可以加入一个用count字段的判断来实现。
- 对多级分类目录的处理,我的站点中目前没有多级分类目录,所以也没有研究,有机会再解决。
- 对标签的处理,改变sql语句中的WHERE为以下代码,而且标签一般比较多,改变一下html显示即可(我的过几天弄上)
- sql的优化,当数据库越来越大之后,sql的优化有利于提高查询速度。
WHERE wt.taxonomy='post_tag' AND wt.term_id=w.term_id 原文


