前面已经分享过一篇 《制作一个按标签首字母分类的WordPress标签页》的文章,但是,前面介绍的版本中,获得所有标签的时候使用了SQL语句,而今天发现 WordPress 有自带获得标签的函数,于是对上面的版本进行了一个小小的升级,并且,在相应的标签分类字母下不存在标签时,分类标签字母不添加链接(上个版本中,比如分类字母D下无标签,也会给D加链接,这次也进行了改进),最重要的是,对数据进行了缓存,不用每次打开页面都查询所有标签然后按首字母分类。
此篇文章就不贴所有代码了,只写下升级方法。
第一步、把原来的 specs_show_tags
函数替换成下面的
function specs_show_tags() { if(!$output = get_option('specs_tags_list')){ $categories = get_terms( 'post_tag', array( 'orderby' => 'count', 'hide_empty' => 1 ) ); $r = array(); foreach($categories as $v){ for($i = 65; $i <= 90; $i++){ if(strtoupper(Chinese_to_PY::getPY($v->name,'one')) == chr($i)){ $r[chr($i)][] = $v; } } for($i=48;$i<=57;$i++){ if(strtoupper(Chinese_to_PY::getPY($v->name,'one')) == chr($i)){ $r[chr($i)][] = $v; } } } ksort($r); $output = "<ul class='list-inline' id='tag_letter'>"; for($i=65;$i<=90;$i++){ $tagi = $r[chr($i)]; if(is_array($tagi)){ $output .= "<li><a href='#".chr($i)."'>".chr($i)."</a></li>"; }else{ $output .= "<li>".chr($i)."</li>"; } } for($i=48;$i<=57;$i++){ $tagi = $r[chr($i)]; if(is_array($tagi)){ $output .= "<li><a href='#".chr($i)."'>".chr($i)."</a></li>"; }else{ $output .= "<li>".chr($i)."</li>"; } } $output .= "</ul>"; $output .= "<ul id='all_tags' class='list-unstyled'>"; for($i=65;$i<=90;$i++){ $tagi = $r[chr($i)]; if(is_array($tagi)){ $output .= "<li id='".chr($i)."'><h4 class='tag_name'>".chr($i)."</h4>"; foreach($tagi as $tag){ $output .= "<a href='".get_tag_link($tag->term_id)."'>".$tag->name."(".$tag->count.")</a>"; } } } for($i=48;$i<=57;$i++){ $tagi = $r[chr($i)]; if(is_array($tagi)){ $output .= "<li id='".chr($i)."'><h4 class='tag_name'>".chr($i)."</h4>"; foreach($tagi as $tag){ $output .= "<a href='".get_tag_link($tag->term_id)."'>".$tag->name."(".$tag->count.")</a>"; } } } $output .= "</ul>"; update_option('specs_tags_list', $output); } echo $output; }
第二步、添加在发布/更新文章时清空换成的函数,放在 specs_show_tags
函数后面即可
function clear_tags_cache() { update_option('specs_tags_list', ''); // 清空 specs_archives_list } add_action('save_post', 'clear_tags_cache'); // 新发表文章/修改文章时
好了,完成之后刷新一下原来的标签页看看吧,是不是比之前的快了一些?
附:效果
月月鸟 2015/01/21 00:41
似乎“谢”没办法获得首字母
Specs 2015/01/21 09:19
@ 嗯,我试了下,确实不能,刚才也试了些其他比较复杂的字,也获得不了~~ 但是目前能找到的获得首字母的也就这个方法了~
Eubur 2015/04/06 09:54
啊哈我也是河北的,学习一下这个方法
Dreamer 2016/01/02 23:15
我最上面的字母和数字是一个一行,怎么能像你的那样一行有多个索引?或者直接把最上面的索引去掉啊?求赐教呀!
Specs 2016/01/02 23:16
@ 设置下样式就可以了~
Dreamer 2016/01/04 15:40
@ 弄好了,谢谢~
mysprout 2016/02/29 15:54
可以 把css代码也贴出来吗?
Specs 2016/02/29 20:33
@ 我用的BootStrap的样式~
宝宝5914 2018/02/25 12:17
您好,请教一个问题,代码都测试成功了,但是我想把数字和其它字符开头的分为一个组(除开中文和A-Z)比如:2 / # / ~ / * / + / 这类的分到一个组如何能够实现,感谢!
老虎 2018/10/12 01:54
原因我想了一下,部分生僻字不在GB2312库里。而在GBK里。GBK可能有部分区块是在-20319~-10254以外的。
蚂蚁 2020/10/29 10:20
非常感谢
蚂蚁 2020/10/29 11:41
@ 大佬,非常感谢你这个标签页代码,我想咨询个问题:如何获取单个分组的全部标签?例如A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z、0、1、2、3、4、5、6、7、8、9中的A分组的全部标签。因为如果网站标签太多的话,页面就会拉的很长,所以我想制作单个标签分组页面。非常感谢你的指点