前面已经分享过一篇 《制作一个按标签首字母分类的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'); // 新发表文章/修改文章时
好了,完成之后刷新一下原来的标签页看看吧,是不是比之前的快了一些?
附:效果
苏映雪 2014/07/09 13:18
这功能不错
Specs 2014/07/09 14:49
@ 以前看别人的里面发现的,但是网上没找到教程,就自己研究了下~~
屠龙 2014/07/10 18:30
看起来自己需要好好练一下
Specs 2014/07/10 20:41
@ 额练什么呢
微历史 2014/07/10 18:38
这个真的不错,对SEO优化有用,收藏先
Specs 2014/07/10 20:40
@ 是吗?不太懂SEO。。。
分享好东西 2014/07/12 11:25
我那边虽然不是我自己做的(大发),但是比你这个好看哎。。
Specs 2014/07/12 21:20
@ 样式弄弄就行吧
快乐分享 2015/01/15 22:46
@ 共享下你的代码呗
helsing 2015/05/27 15:58
@ 求一份代码,万分感谢: [email protected]
电脑爱好者 2014/08/08 15:44
用上了,很不错,不过有个小bug拼音为H开头的汉字,都跑到I里面去了,我看了看你的也是这样,仔细看了看源码里面没有分H
Specs 2014/08/08 15:52
@ 不是的,是因为我那个导航条浮动在上面,把你滑倒到的标签位置挡住了,所以感觉想是到了下一条~
电脑爱好者 2014/08/08 15:55
@ 不是说这个呢,你看看的里面,“互联网理财”“幻灯片”这些应该是在H里面的吧,结果是在I里面了…
Specs 2014/08/08 15:56
@ 咦,好像是唉。我看看怎么回事~~
电脑爱好者 2014/08/08 15:58
@ 源码里没有判断H,直接漏掉了,判断了G之后就是I
Specs 2014/08/08 16:05
@ 嗯嗯,谢谢指出,那个函数里应该把 I 换成 H,因为没有汉字是以拼音 I 开头的~~
feiyang 2014/08/14 17:46
只显示字母和数字 ,标签不显示是什么情况?
Specs 2014/08/14 19:52
@ 额 那字母和数字那里有链接吗
feiyang 2014/08/15 11:24
@ 有链接
Specs 2014/08/15 11:27
@ 你添加了前一篇里的那些代码了吗
feiyang 2014/08/15 12:40
@ 添加了,就是只显示字母和数字
Specs 2014/08/15 12:41
@ 不应该啊 测试都没问题的
feiyang 2014/08/15 12:42
@ 好无语的说
Specs 2014/08/15 12:43
@ 我自己把这些代码复制出来,再测试,是没问题的~~
Specs 2014/08/15 12:46
@ 样式得自己调下,但是标签应该是可以出来的啊
feiyang 2014/08/15 12:48
@ 标签出来就好办了啊
Specs 2014/08/15 12:49
@ 你换个其他主题,把代码放进去看看~
feiyang 2014/08/15 12:51
@ 这个我倒没试过,一会试试
ysam 2014/08/19 21:36
不错,折腾一下午,终于正常了。。Thanks~
Specs 2014/08/20 19:14
@ 可以用就好~~样式自己调下就行~
启点 2014/09/22 08:51
怎么限制每个字母下的标签数量?
fengzhengfeng 2014/12/31 12:00
你好,感谢分享,这个是整个网站全部标签列表页,如果想做1、一个或多个指定分类下的标签列表页2、包含一个或多个特定标签的标签列表页请问该怎么改代码呢?
Specs 2014/12/31 13:33
@ 这个是可以的,你搜下get_terms函数,参数里面就有,1用include,2的那个用search就行应该
fengzhengfeng 2015/01/04 11:00
@ 1、第一步、把原来的 specs_show_category 函数替换成下面的“这里的specs_show_category 函数”是不是打错了?应该是specs_show_tags吧?2、看了一下get_terms函数,但是不知道里面有哪个参数可以指定分类,include指的是$type = 'include'吗?因为是新手,所以对这些不是很了解,也不知道应该更改源代码哪几行。主要就是有一个分类,想给这个分类做一个按标签首字母排序的标签列表页,不知道博主是否可以详细指点一下呢?
Specs 2015/01/04 12:01
@ 不是直接有个参数就是include吗
快乐分享 2015/01/17 16:57
靠,数据库 options里面没有数据啊,有新的标签也不更新啊。
Specs 2015/01/17 17:28
@ 测试没问题