WordPress 按分类显示友情链接

友情链接仍是网站推广的一个重要手段, 网站之间频繁的链接交换活动使得Links 页面似乎已经成为了每个博客的必须的组成部分. WordPress 系统的 default 主题也自带了这个页面模板 (links.php).

我的主题同样带有页面模板, 但为了界面美观和简化处理, 我并没有将这些链接按分类来进行显示. 后来我觉得按分类处理还是有必要的, 不久前我开始在自己博客上做了些相关实验, 貌似网友们也比较喜欢将链接按分类进行显示.

那怎样才能按分类来显示友情链接呢?

咱们先了解一下获取链接列表的方法.
请打开 default 主题的 links.php 文件, 它的内容很简单, 调用链接列表的代码如下:

1
<?php wp_list_bookmarks(); ?>

这句代码将调出所有链接, 并按分类显示出来, 是一个嵌套的列表结构. 关于 wp_list_bookmarks 方法可以参看 wp-includes/bookmark-template.php 的源代码和 Codex 的使用说明.

既然实现如此简单方便, 为什么不使用这个代码来做呢?

因为代码结构不易进行加工, 所以我将所有链接不分类进行处理, 代码如下:

1
<?php wp_list_bookmarks('title_li=&categorize=0&orderby=rand'); ?>

这段代码的意思是: 没有标题, 不进行分类, 链接位置随机安排.
在 iNove 中整个链接框的实现代码如下:

1
2
3
4
5
<div class="boxcaption"><h3><?php _e('Blogroll', 'inove'); ?></h3></div>
<div class="box linkcat">
	<ul><?php wp_list_bookmarks('title_li=&categorize=0&orderby=rand'); ?></ul>
	<div class="fixed"></div>
</div>

那是否可以按照自己的意愿来显示其中一个分类呢?

是可以的! 我们可以通过以下代码只获取属于名字为 'firend' 的分类的所有链接:

1
<?php $bookmarks = get_bookmarks('category_name=firend'); ?>

关于 get_bookmarks 方法可以参看 wp-includes/bookmark.php 的源代码和 Codex 的使用说明.

那么我们可以通过下面的代码来显示名字为 'firend' 的分类的链接, 取代显示所有链接.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="boxcaption"><h3>firend</h3></div>
<div class="box linkcat">
	<ul>
	<?php
		$bookmarks = get_bookmarks('category_name=firend');
		if ( !empty($bookmarks) ) {
			foreach ($bookmarks as $bookmark) {
				echo '<li><a href="' . $bookmark->link_url . '" title="' . $bookmark->link_description . '">' . $bookmark->link_name . '</a></li>';
			}
		}
	?>
	</ul>
	<div class="fixed"></div>
</div>

既然一个可以显示, 是不是所有分类都可以这样显示出来?

当然可以, 现在要想办法把所有链接分类找出来. 为此, 我们可以先看一下数据库中分类的存储结构:

WordPress Taxonomy

可以看出, 我们只需要在 terms 表中出去相应数据元组对应的 name 属性就 OK 了. 所以这里需要通过 term_id 和 terms_taxonomy 表联一下, 并且将 taxonomy 的值限定为 'link_category'. SQL 如下:

1
2
3
4
5
SELECT T1.name AS name
FROM   $wpdb->terms T1,
       $wpdb->term_taxonomy T2
WHERE  T1.term_id = T2.term_id
AND    T2.taxonomy = 'link_category'

通过以上 SQL 我们可以将所有链接分类的名字找出来, 然后做一个循环处理, 把链接按照分类查找出来, 并置于页面中.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$linkcats = $wpdb->get_results("SELECT T1.name AS name FROM $wpdb->terms T1, $wpdb->term_taxonomy T2 WHERE T1.term_id = T2.term_id AND T2.taxonomy = 'link_category'");
if($linkcats) : foreach($linkcats as $linkcat) : ?>
	<div class="boxcaption"><h3><?php echo $linkcat->name; ?></h3></div>
	<div class="box linkcat">
		<ul>
			<?php
				$bookmarks = get_bookmarks('orderby=rand&category_name=' . $linkcat->name);
				if ( !empty($bookmarks) ) {
					foreach ($bookmarks as $bookmark) {
						echo '<li><a href="' . $bookmark->link_url . '" title="' . $bookmark->link_description . '">' . $bookmark->link_name . '</a></li>';
					}
				}
			?>
		</ul>
		<div class="fixed"></div>
	</div>
<?php endforeach; endif; ?>

使用 default 主题的处理方法的好处是简单, 方便, 但缺乏灵活性. 对于后一种方法, 需要有些许代码能力才能实现, 但并不是很难. 在决定要使用什么方法前请权衡时间, 能力, 需求等多方面的因素, 不可能尽善尽美, 适合自己就是最好的. 请不要发信请求我帮你修改, 我会在所有主题的下个版本中加入这个功能.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 按分类显示友情链接
  1. bolo | #1
    2009-06-28 17:00

    占座,看看里面有什么学问

  2. bolo | #2
    2009-06-28 17:08

    照你的思路,如果别人想显示两个分类的链接的话,还需要自动复制一个linkbox才够人性化。如此复杂的运算会令模板变得很复杂。我认为告诉别人用category=id来显示分类链接就可以了。

  3. motta | #3
    2009-06-28 17:19

    用wp_list_bookmarks()函数, categorize=1的时候是可以按分类显示链接的, 每一个分类都是一个li, 再嵌套着ul. 不太明白为什么后面用到了sql.

  4. 爱月 | #4
    2009-06-28 17:20

    对于一个新生不久的博客~还是不要把友链放到单独的页面吧~

  5. Leeiio | #5
    2009-06-28 17:34

    我一直是使用wp_list_bookmarks函数来实现连接按分类显示的,很方便的函数啊,为啥用sql呢?

  6. zwwooooo | #6
    2009-06-28 21:06

    友情链接有分类的就需要。

  7. dust2k | #7
    2009-06-29 00:22

    这类对标准系统或者功能的修订最讨厌的就是升级了,从最早的Discuz论坛到VBB到DedeCMS到WordPress,Hack用的多每次就特头疼,就是用了版本工具也没什么大的帮助,谁记得住这么多逻辑啊,呵呵。。不过支持你的皮肤带上这个功能,这毕竟是个有用的特色。

  8. 拆組達人 | #8
    2009-06-29 10:05

    有不錯的外掛可以解決交換連結過多的問題
    這套很不錯用!WP-MulticolLinks

  9. 仁心博客 | #9
    2009-06-29 13:56

    开发个zblog的吧

  10. feicun | #10
    2009-06-29 18:09

    我就是直接新建了一个普通页面,然后把友情链接在写上去。虽然也自制过一个links.php,但是从来没用过,因为用着不爽又懒的改……

  11. idealei | #11
    2009-06-29 22:15

    请问,这个网站http://www.wpshare.cn/使用的你的主题,在哪能下载到,谢谢。

  12. Tracy | #12
    2009-06-29 23:19

    学习了

  13. 九子 | #13
    2009-06-30 01:10

    欢迎MG12。Nav 回归。 :grin:

    @idealei
    mg的主题都在:http://www.neoease.com/themes/

  14. mg12 | #14
    2009-06-30 11:28

    @bolo
    是复杂了点, 但效率是差不多的. 对于不懂程序的人是有点麻烦, 但是对于懂程序的人, 这是极其简单的. 不懂程序的人也不会随便去改代码. 我就写出来, 就当作是熟悉 WordPress 的源代码吧. 呵呵~

    @motta
    @Leeiio
    categorize 默认就是等于 1 的, 我说过了, 后面处理是为了有更强的可定制性. 如: 我想在一些连接上添加 onclick 事件什么的, 就可以实现了. 但是 WordPress 提供的方法做不到.

    @爱月
    求其所爱.

    @dust2k
    有道理, 升级是比较麻烦. 所有有些可以抽出来的我都做成插件了.

    @拆組達人
    汗... WP-MulticolLinks 就是我开发的. 不过它不能显示所有分类. 我很就没升级它了, 看来该更新一下了. 哈~

    @仁心博客
    我最初接触 Web 就是学的确 ASP 和 ADO, 现在全忘了. 不想玩 Visual Studio 那一套.

    @feicun
    你牛!

    @idealei
    @九子 正解! 谢谢九子回答.

  15. bolo | #15
    2009-06-30 11:57

    @mg12
    想到一个新问题,你以前说到主题预览的时候不能访问数据库,这样才能通过官方审核,你这样一来,能通过审核吗?

  16. mg12 | #16
    2009-06-30 12:04

    @bolo
    肯定可以, 因为我有默认设置. 就算没有设定信息也能用, 只是不能定制而已.

  17. 苏洋 | #17
    2009-06-30 13:31

    好久没来看...我现在深刻的了解了前端是如此的麻烦..Code还好说.浏览器兼容这个不是问题不该出现的问题搞的浪费了无数精力。
    ps.重新封装WP的函数,感觉快搞成WP新发行版了..如果发行的话. ;-)

  18. zozoozo | #18
    2009-06-30 13:57

    好冷啊

  19. kerby | #19
    2009-06-30 17:06

    已经把采访问题发给你了,mg12 :lol:

  20. Hermit | #20
    2009-06-30 20:04

    那个...怎么把lavalamp去掉了?

  21. kraloyun | #21
    2009-07-01 08:58

    could you please translate it to english?

  22. Showfom | #22
    2009-07-01 09:25

    友情链接我一直直接在主题文件里修改……

  23. Jacse | #23
    2009-07-01 14:17

    很好,希望尽快推出新版本的主题,这个功能蛮喜欢的。

  24. mg12 | #24
    2009-07-02 00:25

    @苏洋
    不至于吧, 哈哈~

    @zozoozo
    好热啊

    @kerby
    收到, 等会我回信给你.

    @Hermit
    囧... 难道我还要写个逆操作的教程? 如果你对代码不敏感, 建议重新下载主题, 呵呵~

    @kraloyun
    Thanks for your attention, I will do that when I get free time.

    @Showfom
    你太凶狠了.

    @Jacse
    预计下周发布.

  25. 苏洋 | #25
    2009-07-02 04:24

    @仁心博客
    其实两者语法类似,关键字,保留字不同罢了,自己看看那里调用link显示,稍微加个参数,过程里多个参数判断即可,

  26. Hermit | #26
    2009-07-02 09:36

    @Hermit
    mg12理解错了...我是问neoease为什么去掉,不是问怎么去掉.....

  27. Showfom | #27
    2009-07-02 10:51

    @mg12
    为了最大化减少php查询次数,所以 哦哈哈

  28. mg12 | #28
    2009-07-02 11:17

    @Hermit
    因为发现很多人直接引用我的 JS 文件 (无奈啊~), 干脆就不玩了.

    @Showfom
    这样经常改主题很郁闷... (我会经常换链接, 哈哈~)

  29. Showfom | #29
    2009-07-02 11:18

    @mg12
    换主题才郁闷……没换的话就一直这么用 哦哈哈

  30. HK | #30
    2009-07-02 21:58

    又要发布新版本了?

  31. shine | #31
    2009-07-03 10:41

    这个方法有点复杂,其实不用这么麻烦,不如来我这看看,

  32. 网城骑士 | #32
    2009-07-03 10:51

    请问怎么才能格式化显示博客文章的代码,是用的插件吗?要怎样用啊??

  33. zozoozo | #33
    2009-07-07 08:28

    我真是命苦 要用代理来上你的网站 天哪。。。。

  34. ucax | #34
    2009-07-07 12:10

    問一個弱弱的問題,請問一下側欄廣告出租代碼 是什麼? 試了幾次都跑位~~ :cry:
    請高手指導一下.

  35. micogle | #35
    2009-07-07 13:41

    @zozoozo
    我也是啊,为什么要用代理才能访问呢~~~

  36. xiaorsz | #36
    2009-07-11 14:32

    很久没来,MG12的博客是越来越强大了噢!!

  37. mg12 | #37
    2009-07-11 19:44

    @zozoozo
    我換 IP 了, 好日子來臨了.
    哈哈~

    @ucax
    這個有時間我寫教程吧, 最近太忙了.

    @micogle
    現在 OKAY 了.

    @xiaorsz
    那還用說, 哈哈~

  38. dropshippingwatch | #38
    2009-08-18 22:31

    哈哈

  39. kevin | #39
    2009-10-22 19:42

    这个很有用,改天仔细研究下!

  40. zx | #40
    2010-01-29 23:58

    楼主,如何简单的获取某个链接分类到某个页面呢 ?

  41. Alex | #41
    2010-04-24 17:07

    Good post!

  42. msn | #42
    2010-07-25 21:21

    我最初接触 Web 就是学的确 ASP 和 ADO, 现在全忘了. 不想玩 Visual Studio 那一套.

  1. No trackbacks yet.

Twitter Email feed
RSS feed