首页 » 开源/框架 » WordPress » 正文

制作一个按标签首字母分类的WordPress标签页(升级版)

前面已经分享过一篇 《制作一个按标签首字母分类的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'); // 新发表文章/修改文章时

好了,完成之后刷新一下原来的标签页看看吧,是不是比之前的快了一些?

附:效果

本文共 47 个回复

  • 月月鸟 2015/01/21 00:41

    似乎“谢”没办法获得首字母

    • Specs 2015/01/21 09:19

      @ 月月鸟 嗯,我试了下,确实不能,刚才也试了些其他比较复杂的字,也获得不了~~ :eek: 但是目前能找到的获得首字母的也就这个方法了~

  • Eubur 2015/04/06 09:54

    啊哈我也是河北的,学习一下这个方法

  • Dreamer 2016/01/02 23:15

    我最上面的字母和数字是一个一行,怎么能像你的那样一行有多个索引?或者直接把最上面的索引去掉啊?求赐教呀! :grin:

  • mysprout 2016/02/29 15:54

    可以 把css代码也贴出来吗?

  • 宝宝5914 2018/02/25 12:17

    您好,请教一个问题,代码都测试成功了,但是我想把数字和其它字符开头的分为一个组(除开中文和A-Z)比如:2 / # / ~ / * / + / 这类的分到一个组如何能够实现,感谢!

  • 老虎 2018/10/12 01:54

    原因我想了一下,部分生僻字不在GB2312库里。而在GBK里。GBK可能有部分区块是在-20319~-10254以外的。 :grin:

12

发表评论