WordPress 按分类显示友情链接

Jun 28th, 2009 Add Comment

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

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

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

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

<?php wp_list_bookmarks(); ?>

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

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

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

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

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

<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' 的分类的所有链接:

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

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

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

<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 如下:

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 我们可以将所有链接分类的名字找出来, 然后做一个循环处理, 把链接按照分类查找出来, 并置于页面中.

<?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. http://1.gravatar.com/avatar/b9637e1a3adbb3b28867fabce6dc50a4?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  2. http://1.gravatar.com/avatar/91bbf8059498383cae31d37c871ad92e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  3. http://1.gravatar.com/avatar/9409fa3475e70120d9476445891a32f4?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  4. http://1.gravatar.com/avatar/32d5d1cb73f3dcbccf717ee726bc0b3e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  5. http://0.gravatar.com/avatar/cd1c25fbb3bb97048de800539d483be7?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  6. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

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

    @micogle
    現在 OKAY 了.

    @xiaorsz
    那還用說, 哈哈~

  7. http://0.gravatar.com/avatar/c419cb20777cc932e6edbc4aecf3400d?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  8. http://1.gravatar.com/avatar/d88d51bff01156274357b8af7faf7eb1?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  9. http://0.gravatar.com/avatar/2e8995d161ddcb182e804c41a4bc77ed?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  10. http://1.gravatar.com/avatar/76bb62007e2509da14a0da354c0c2158?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  11. http://1.gravatar.com/avatar/71d2a8b4562ebb5c0c5c3fed31a7a2b9?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  12. http://1.gravatar.com/avatar/7bc5fce5add04db5805f7631fe2782b5?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  13. http://0.gravatar.com/avatar/8bc5a10d6cd90aec2d2e24b53042856f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    又要发布新版本了?

  14. http://0.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  15. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

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

  16. http://0.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  17. http://0.gravatar.com/avatar/682ec731fc37a5f457f8503785404fcc?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  18. http://1.gravatar.com/avatar/70a2291293cd289ae0573b6cdb7d791e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  19. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @苏洋
    不至于吧, 哈哈~

    @zozoozo
    好热啊

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

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

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

    @Showfom
    你太凶狠了.

    @Jacse
    预计下周发布.

  20. http://0.gravatar.com/avatar/2b1300fe49e3155b8cf1b6c1f983fd02?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  21. http://0.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  22. http://0.gravatar.com/avatar/000213724aa17215099bb73d238eedfe?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    could you please translate it to english?

  23. http://0.gravatar.com/avatar/682ec731fc37a5f457f8503785404fcc?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  24. http://1.gravatar.com/avatar/95c2ca68b1bde3f48fd02b5fd8d1b0dd?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  25. http://1.gravatar.com/avatar/76bb62007e2509da14a0da354c0c2158?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  26. http://1.gravatar.com/avatar/70a2291293cd289ae0573b6cdb7d791e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  27. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  28. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  29. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

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

    @爱月
    求其所爱.

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

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

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

    @feicun
    你牛!

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

  30. http://0.gravatar.com/avatar/277c2420fd2b9da4cc552060c5f8083b?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    欢迎MG12。Nav 回归。 :grin:

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

  31. http://1.gravatar.com/avatar/bda14a36924bc709532651d7d3cc1643?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  32. http://0.gravatar.com/avatar/e9d95c5c076080f42e99c679d2cf1de3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  33. http://1.gravatar.com/avatar/b19a2eda07d44c4a9e83c8e99046be75?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  34. http://0.gravatar.com/avatar/23f735497eb40acdc2c99ca4f3de63b3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  35. http://0.gravatar.com/avatar/ee96af3312681bc85af88ec9ebb2d835?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  36. http://0.gravatar.com/avatar/a2d74a6c3b2fc761e99fbc0354022fdb?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  37. http://0.gravatar.com/avatar/c4f34886ef5967ac537c27b0bd6f6a3f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  38. http://1.gravatar.com/avatar/ffa60157af668384f5325116efd02385?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  39. http://0.gravatar.com/avatar/4c99f519d8e5f05a1218201c1b146fee?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  40. http://0.gravatar.com/avatar/0a33d397dd7aaaa62a7854bf601bd128?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  41. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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

  42. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

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