前面已经分享过一篇 《制作一个按标签首字母分类的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分组的全部标签。因为如果网站标签太多的话,页面就会拉的很长,所以我想制作单个标签分组页面。非常感谢你的指点