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> |
既然一个可以显示, 是不是所有分类都可以这样显示出来?
当然可以, 现在要想办法把所有链接分类找出来. 为此, 我们可以先看一下数据库中分类的存储结构:
可以看出, 我们只需要在 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 主题的处理方法的好处是简单, 方便, 但缺乏灵活性. 对于后一种方法, 需要有些许代码能力才能实现, 但并不是很难. 在决定要使用什么方法前请权衡时间, 能力, 需求等多方面的因素, 不可能尽善尽美, 适合自己就是最好的. 请不要发信请求我帮你修改, 我会在所有主题的下个版本中加入这个功能.

占座,看看里面有什么学问
照你的思路,如果别人想显示两个分类的链接的话,还需要自动复制一个linkbox才够人性化。如此复杂的运算会令模板变得很复杂。我认为告诉别人用category=id来显示分类链接就可以了。
用wp_list_bookmarks()函数, categorize=1的时候是可以按分类显示链接的, 每一个分类都是一个li, 再嵌套着ul. 不太明白为什么后面用到了sql.
对于一个新生不久的博客~还是不要把友链放到单独的页面吧~
我一直是使用wp_list_bookmarks函数来实现连接按分类显示的,很方便的函数啊,为啥用sql呢?
友情链接有分类的就需要。
这类对标准系统或者功能的修订最讨厌的就是升级了,从最早的Discuz论坛到VBB到DedeCMS到Wordpress,Hack用的多每次就特头疼,就是用了版本工具也没什么大的帮助,谁记得住这么多逻辑啊,呵呵。。不过支持你的皮肤带上这个功能,这毕竟是个有用的特色。
有不錯的外掛可以解決交換連結過多的問題
這套很不錯用!WP-MulticolLinks
开发个zblog的吧
我就是直接新建了一个普通页面,然后把友情链接在写上去。虽然也自制过一个links.php,但是从来没用过,因为用着不爽又懒的改……
请问,这个网站http://www.wpshare.cn/使用的你的主题,在哪能下载到,谢谢。
学习了
欢迎MG12。Nav 回归。
@idealei
mg的主题都在:http://www.neoease.com/themes/
@bolo
是复杂了点, 但效率是差不多的. 对于不懂程序的人是有点麻烦, 但是对于懂程序的人, 这是极其简单的. 不懂程序的人也不会随便去改代码. 我就写出来, 就当作是熟悉 WordPress 的源代码吧. 呵呵~
@motta
@Leeiio
categorize 默认就是等于 1 的, 我说过了, 后面处理是为了有更强的可定制性. 如: 我想在一些连接上添加 onclick 事件什么的, 就可以实现了. 但是 WordPress 提供的方法做不到.
@爱月
求其所爱.
@dust2k
有道理, 升级是比较麻烦. 所有有些可以抽出来的我都做成插件了.
@拆組達人
汗... WP-MulticolLinks 就是我开发的. 不过它不能显示所有分类. 我很就没升级它了, 看来该更新一下了. 哈~
@仁心博客
我最初接触 Web 就是学的确 ASP 和 ADO, 现在全忘了. 不想玩 Visual Studio 那一套.
@feicun
你牛!
@idealei
@九子 正解! 谢谢九子回答.
@mg12
想到一个新问题,你以前说到主题预览的时候不能访问数据库,这样才能通过官方审核,你这样一来,能通过审核吗?
@bolo
肯定可以, 因为我有默认设置. 就算没有设定信息也能用, 只是不能定制而已.
好久没来看...我现在深刻的了解了前端是如此的麻烦..Code还好说.浏览器兼容这个不是问题不该出现的问题搞的浪费了无数精力。
ps.重新封装WP的函数,感觉快搞成WP新发行版了..如果发行的话.
好冷啊
已经把采访问题发给你了,mg12
那个...怎么把lavalamp去掉了?
could you please translate it to english?
友情链接我一直直接在主题文件里修改……
很好,希望尽快推出新版本的主题,这个功能蛮喜欢的。
@苏洋
不至于吧, 哈哈~
@zozoozo
好热啊
@kerby
收到, 等会我回信给你.
@Hermit
囧... 难道我还要写个逆操作的教程? 如果你对代码不敏感, 建议重新下载主题, 呵呵~
@kraloyun
Thanks for your attention, I will do that when I get free time.
@Showfom
你太凶狠了.
@Jacse
预计下周发布.
@仁心博客
其实两者语法类似,关键字,保留字不同罢了,自己看看那里调用link显示,稍微加个参数,过程里多个参数判断即可,
@Hermit
mg12理解错了...我是问neoease为什么去掉,不是问怎么去掉.....
@mg12
为了最大化减少php查询次数,所以 哦哈哈
@Hermit
因为发现很多人直接引用我的 JS 文件 (无奈啊~), 干脆就不玩了.
@Showfom
这样经常改主题很郁闷... (我会经常换链接, 哈哈~)
@mg12
换主题才郁闷……没换的话就一直这么用 哦哈哈
又要发布新版本了?
这个方法有点复杂,其实不用这么麻烦,不如来我这看看,
请问怎么才能格式化显示博客文章的代码,是用的插件吗?要怎样用啊??
我真是命苦 要用代理来上你的网站 天哪。。。。
問一個弱弱的問題,請問一下側欄廣告出租代碼 是什麼? 試了幾次都跑位~~
請高手指導一下.
@zozoozo
我也是啊,为什么要用代理才能访问呢~~~
很久没来,MG12的博客是越来越强大了噢!!
@zozoozo
我換 IP 了, 好日子來臨了.
哈哈~
@ucax
這個有時間我寫教程吧, 最近太忙了.
@micogle
現在 OKAY 了.
@xiaorsz
那還用說, 哈哈~
哈哈
这个很有用,改天仔细研究下!
楼主,如何简单的获取某个链接分类到某个页面呢 ?