首页 » 开源/框架 » 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'); // 新发表文章/修改文章时

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

附:效果

本文共 49 个回复

  • 苏映雪 2014/07/09 13:18

    这功能不错

    • Specs 2014/07/09 14:49

      @ 苏映雪 以前看别人的里面发现的,但是网上没找到教程,就自己研究了下~~

  • 屠龙 2014/07/10 18:30

    看起来自己需要好好练一下

  • 微历史 2014/07/10 18:38

    这个真的不错,对SEO优化有用,收藏先

  • 分享好东西 2014/07/12 11:25

    我那边虽然不是我自己做的(大发),但是比你这个好看哎。。

  • 电脑爱好者 2014/08/08 15:44

    用上了,很不错,不过有个小bug拼音为H开头的汉字,都跑到I里面去了,我看了看你的也是这样,仔细看了看源码里面没有分H

    • Specs 2014/08/08 15:52

      @ 电脑爱好者 不是的,是因为我那个导航条浮动在上面,把你滑倒到的标签位置挡住了,所以感觉想是到了下一条~

      • 电脑爱好者 2014/08/08 15:55

        @ Specs 不是说这个呢,你看看的里面,“互联网理财”“幻灯片”这些应该是在H里面的吧,结果是在I里面了…

        • Specs 2014/08/08 15:56

          @ 电脑爱好者 咦,好像是唉。我看看怎么回事~~

          • 电脑爱好者 2014/08/08 15:58

            @ Specs 源码里没有判断H,直接漏掉了,判断了G之后就是I

            • Specs 2014/08/08 16:05

              @ 电脑爱好者 嗯嗯,谢谢指出,那个函数里应该把 I 换成 H,因为没有汉字是以拼音 I 开头的~~

  • feiyang 2014/08/14 17:46

    只显示字母和数字 ,标签不显示是什么情况? :???:

  • ysam 2014/08/19 21:36

    不错,折腾一下午,终于正常了。。Thanks~

  • 启点 2014/09/22 08:51

    怎么限制每个字母下的标签数量?

  • fengzhengfeng 2014/12/31 12:00

    你好,感谢分享,这个是整个网站全部标签列表页,如果想做1、一个或多个指定分类下的标签列表页2、包含一个或多个特定标签的标签列表页请问该怎么改代码呢?

    • Specs 2014/12/31 13:33

      @ fengzhengfeng 这个是可以的,你搜下get_terms函数,参数里面就有,1用include,2的那个用search就行应该

      • fengzhengfeng 2015/01/04 11:00

        @ Specs 1、第一步、把原来的 specs_show_category 函数替换成下面的“这里的specs_show_category 函数”是不是打错了?应该是specs_show_tags吧?2、看了一下get_terms函数,但是不知道里面有哪个参数可以指定分类,include指的是$type = 'include'吗?因为是新手,所以对这些不是很了解,也不知道应该更改源代码哪几行。主要就是有一个分类,想给这个分类做一个按标签首字母排序的标签列表页,不知道博主是否可以详细指点一下呢?

  • 快乐分享 2015/01/17 16:57

    靠,数据库 options里面没有数据啊,有新的标签也不更新啊。

12

发表评论