SEO, W3c 和新窗口打开链接

Wordpress 对 W3c 标准支持比较到位,唯独编写文章页面插入链接的按钮不够与时俱进,仍然在 target="_blank"。

如果和我一样屈服于 SEO 和 W3c,经常写文章有需要插入 external 或者 external nofollow 链接,那么肯定免不了改造一下 Wordpress 的 TinyMCE 编辑器。

首先定位路径:

wp-includes/js/tinymce/themes/advanced/js/link.js
wp-includes/js/tinymce/langs/wp-langs.php

打开 link.js 进行编辑。找到 141 行:

lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self');
lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank');

修改为:

lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), 'external');
lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), 'external nofollow');

编辑 wp-langs.php,279行起:

link_target:"' . mce_escape( __('Target') ) . '",
link_target_same:"' . mce_escape( __('Open link in the same window') ) . '",
link_target_blank:"' . mce_escape( __('Open link in a new window') ) . '",

改为:

link_target:"' . mce_escape( __('Rel') ) . '",
link_target_same:"' . mce_escape( __('external') ) . '",
link_target_blank:"' . mce_escape( __('external nofollow') ) . '",

同时搭配 jQuery 以及下面一句话(放在 header.php 内,jQuery 框架之后):

<script type="text/javascript">
/* <![CDATA[ */
$("a[rel='external'],a[rel='external nofollow']").click(function(){window.open(this.href);return false})
/* ]]> */
</script>

经过改造,快速在文章中插入 external nofollow 或者 external 链接、控制这两种属性的链接在新窗口打开、符合 W3c 标准都实现了,一举三得。

我不推荐一些同学用 jQuery 选择器进行全局式的新窗口打开或者原窗口打开方法。原因如下:

1. 无法满足细分要求。jQuery 选择器可以保证所有内链原窗口打开,也可以保证所有外链在新窗口打开,但是如果我想一个内链在新窗口打开怎么办?用我的方案,写文章时插入一个 external 链接就好了。

2. JS 添加的 nofollow 属性无意义。搜索引擎不读取 js,而 nofollow 就是给搜索引擎看的,用 JS 添加 nofollow 显然多此一举。我的方案便可以让你快速插入 external nofollow 链接,至于打开新窗口的任务就交给 jQuery 处理了。

3. JS 添加任何 rel 属性都有问题。一个链接只能同时具备一个 rel 属性(external nofollow 例外),全局布置 JS 添加属性会损坏某些已有属性的功能,造成冲突和混乱。例如文章标题原本就具有 rel="bookmark"。

综上所述,想同时兼顾 SEO/W3c/新窗口打开页面/无冲突,最好的办法就是不用 jQuery 选择器添加 rel 属性。我们已经改造过 Wordpress 文章编辑器的插入链接功能了。所以,不麻烦吧!?

P.S 更改文件后若发现没有变化,请清空 Google Gears 缓存的后台文件。

相关阅读:

Wordpress SEO 搜索引擎优化

Tag(s): , ,
  • QQ书签
  • Del.icio.us
  • 百度收藏
  • Google
  • 饭否
  • FriendFeed
Shawn Published@22:29 / 2008-11-28 / Trackback / Skip
35 Comments Contributed by Visitors
  1. rebuttonSivan / 22:42@2008-11-28 1
    Sivan

    改编辑器这个看明白了。不知道那个jQuery的语句应该添加在哪里 :idea:
    过去的文章全是target="_blank"新窗口链接,包括友情链接之类。修改起来,还是个大工程呢。

  2. rebuttonJor / 22:46@2008-11-28 2
    Jor

    沙发没了,就板凳吧。我就用自带的好了,这么复杂……

  3. rebuttonJor / 22:47@2008-11-28 3
    Jor

    我现在天天要更新版本,恩,等稳定后再试试。 :smile:

  4. rebuttonShawn / 22:47@2008-11-28 4
    Shawn

    @Sivan: 可以直接以 <script type="text/javascript">....</script> 包裹,也可以保存成一个文件引用。
    以往的工程的确很大,因为是编辑器添加的,所以都保存在数据库里面了。用 js 移除或者添加都是治标不治本的方法。最好是编辑数据库,全部替换 target="_blank" 为 rel="external"

  5. rebuttonShawn / 22:49@2008-11-28 5
    Shawn

    @Jor: 这篇文章不适合你,只适合使用 Wordpress 稳定版本的同学。

  6. rebuttonJor / 22:49@2008-11-28 6
    Jor

    @Shawn: 我恨你…… :???:

  7. rebuttonSivan / 22:50@2008-11-28 7
    Sivan

    :idea: 呃。原来这么简单,怎么你说的,我就看不懂呢……
    嗯,以前的文章和链接就那么弄啦。等我研究一下,添加链接也可以自动换成rel="external"的样式吧。

  8. rebuttonfqch / 22:51@2008-11-28 8
    fqch

    说的很详细~慢慢消化先 :cool:

  9. rebuttonShawn / 22:52@2008-11-28 9
    Shawn

    @Sivan: 我每次说的都不详细。。。所以好多人看不懂。。。。下次改。

  10. rebuttonleehow / 22:55@2008-11-28 10
    leehow

    瞬间就到如此地步。

  11. rebuttonjk / 23:31@2008-11-28 11
    jk

    试试!

  12. rebuttonMao / 23:35@2008-11-28 12
    Mao

    符合W3c 标准有什么好处?只针对这几个代码

  13. rebuttonShawn / 23:36@2008-11-28 13
    Shawn

    @Mao: 符合 W3c 只是一种心理安慰,关键是同样还能实现 SEO 方面的权重控制。

  14. rebuttonMao / 23:41@2008-11-28 14
    Mao

    @Shawn: 我现在用插件直接将外连的链接添加nofollow了..缺憾的是,无法排除自己域名的链接

  15. rebuttonnetputer / 23:41@2008-11-28 15
    netputer

    记得可以用jQ直接几句话设置的..

  16. rebuttonMao / 23:44@2008-11-28 16
    Mao

    啊..leehow的小黑猫表情在爱软出现下载了....

  17. rebuttoni.robot / 23:57@2008-11-28 17
    i.robot

    对很多标准都没有概念,shawn能不能给个链接,我有空也学习一下w3c标准 :grin:

  18. rebuttonShawn / 0:17@2008-11-29 18
    Shawn

    @netputer: jQuery 设置的对 SEO 无效。

  19. rebuttonShawn / 0:25@2008-11-29 19
    Shawn

    @Mao: 这个方法的主要目的是同时实现:符合W3c标准、正确部署SEO、在新窗口打开三件事情。如果只实现某种目的方法就很多了。你是指给评论部分添加 external nofollow 吗?那个不需要插件的。本身就是自动添加,除非主题做了特殊的设置,然后又忘记添加这个属性。
    Leehow 的黑猫本来就是我在网上搜集然后统一大小的,所以网上有一点都不奇怪啊。。。

  20. rebuttonShawn / 0:28@2008-11-29 20
    Shawn

    @i.robot: 可以看看这里

  21. rebuttonAndor / 0:38@2008-11-29 21
    Andor

    1. 不敢轻易修改 WordPress 源文件
    2. js 小白
    3. 不关心 SEO
    4. 继续使用 target

  22. rebuttonAlan / 0:42@2008-11-29 22
    Alan

    我要开始 rel=external nofollow 了 :evil:

  23. rebutton胡想 / 1:45@2008-11-29 23
    胡想

    想请问一下,由于我都是用 Live Writer 写文章,那是否意味着只要将 JQuery 那一段代码放在 header.php 内就行了,而不必修改 WP 的 TinyMCE?

  24. rebuttonMao / 1:53@2008-11-29 24
    Mao

    @Shawn: 我是将文章的链接添加nofollow的.不是评论

  25. rebuttonShawn / 1:55@2008-11-29 25
    Shawn

    @胡想: 是的,不过你用 Live Writer 编辑文章的时候得在需要的链接上手动输入 rel="external" 或者 rel="external nofollow"

  26. rebutton胡想 / 2:41@2008-11-29 26
    胡想

    @Shawn: 明白了,总算可以解决外链的问题了 :grin:

  27. rebuttonk2max / 7:06@2008-11-29 27
    k2max

    这个实用 ..

  28. rebuttonShawn / 12:14@2008-11-29 28
    Shawn

    @Andor: 我晕死,AK 出什么毛病了吗,又拦截错了。。。我打算不升级了,所以随便改。

  29. rebuttonSivan / 12:50@2008-11-29 29
    Sivan

    试了一下没成功。看了看源码,header里没有调用jQuery的代码=。=把你给的加在最后也没效果。

  30. rebuttonShawn / 12:51@2008-11-29 30
    Shawn

    @Sivan: 因为你没调用 jQuery 嘛。。。

  31. rebuttonSivan / 12:53@2008-11-29 31
    Sivan

    @Shawn: 是不是现在header写上调用http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js这个,然后在后面跟上你的代码

  32. rebuttonShawn / 12:53@2008-11-29 32
    Shawn

    @Sivan: 是的

  33. rebuttonaunsen / 13:46@2008-11-29 33
    aunsen

    看来也不适合我... :shock:

  34. rebutton胡想 / 14:02@2008-11-29 34
    胡想

    我试了也没成功,我在 head 调用了 http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js 也在这之后加入了 shawn 给的代码,然后在链接内加了 rel="external",可是还是不会打开新窗口... :cry:

  35. rebuttonElton Disney / 16:02@2008-11-29 35
    Elton Disney

    W3C的要求太多了,不玩它

  36. rebuttonShawn / 20:18@2008-11-29 36
    Shawn

    @胡想: 怎么你们都会去调用这个?正确的 Goolge jQuery 调用地址是
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/
    libs/jquery/1.2.6/jquery.min.js"></script>

    然后下面放:
    <script type="text/javascript">
    $(document).ready(function(){$("a[rel='external'],a[rel='external nofollow']").click(function(){window.open(this.href);return false})})
    </script>

  37. rebutton胡想 / 23:01@2008-11-29 37
    胡想

    @Shawn: 哈哈哈!我是看楼上 Sivan 的,原来是调用错了哦,刚刚试了下,可以了,超级感谢 Shawn :razz:

  38. rebuttonYacca / 9:45@2008-11-30 38
    Yacca

    我用wlw的人...-.-

  39. rebuttonLeeiio / 2:47@2008-12-02 39
    Leeiio

    看來得批量修改替換修改數據庫裡面的全部_blank。。

  40. rebutton浮黑 / 22:32@2008-12-13 40
    浮黑

    还是没看懂……

  41. rebuttonZoll / 20:03@2008-12-14 41
    Zoll

    按照大哥的方法修改 得出来的结果是 target="external" 或者 target="external nofollow".. 有什么办法解决没有。。

  42. rebuttonShawn / 21:23@2008-12-14 42
    Shawn

    @Zoll: 我太马虎了,又忘了一个地方。你下载这个文件
    http://ishawn.net/wp-includes/js/tinymce/themes/advanced/js/link.js
    覆盖原来的,就可以了。

  43. rebuttonZoll / 21:33@2008-12-14 43
    Zoll

    :grin: 恩 我试试看
    还想请教一个问题 关于侧边栏的Blogroll 它的 rel 属性怎么定义。。在后台好像不能自己定义,这能选择 friend 啊 neighborhood 啊什么的。。自己填external 好像实现不了。。

  44. rebuttonShawn / 21:38@2008-12-14 44
    Shawn

    @Zoll: 看看这里

  45. rebuttonZoll / 21:45@2008-12-14 45
    Zoll

    呵呵 终于知道怎么这么多人叫你肖恩大师啦~ 谢谢大师 呵呵
    不过我建议 这篇文章提供的修改 还可增加一个步骤 就是操作界面的显示
    自己刚才发现的 在 wp-langs.php 一个目录下有个wp-langs-en.js 里面好像有吧界面上显示的Target, Open in a new window什么的改成自己想要的话。这样可能可以避免操作失误吧~
    见笑了。。

  46. rebuttonShawn / 22:01@2008-12-14 46
    Shawn

    @Zoll: 。。大师那是他们忽悠人的。
    修改这个是我很久以前弄的,实在记不起来到底改了哪些地方,我开始以为只改这两个文件,结果不是。一会儿我改改:)

  47. rebuttonpopdo / 13:55@2009-01-05 47
    popdo

    已经用上了。相当不错的方法。 :grin:

  48. rebuttonsmallshell / 2:58@2009-01-24 48
    smallshell

    我曾经追求w3c验证通过,后来觉得没必要。据我所知,目前的浏览器基本都不支持xhtml,都是按html方式解析。
    xhtml的好处在于:以xml方式处理数据。如果浏览器真的支持xhtml,那就不允许一点的错误,而且Content-type应该是application/xhtml+xml。
    我觉得,html 4.01不错,选择strict/transitional,比选择html/xhtml有意义。呵呵,你的blog用了xhtml 1.1。
    其实,我也是追求完美。
    最后说下,你的blog样式的确很不错,因为这点,收藏了!

  49. rebuttonShawn / 6:36@2009-01-24 49
    Shawn

    @smallshell: 谢谢评论。
    我指出一个问题,你把 Doctype 和 HTTP header 中的 Content-Type 混淆了。前者声明标准版本,后者只决定浏览器识别格式。二者之间有些关联,但不是全部,xhtml 的意义主要在于标签的严密和CSS的解释。至于 application/xhtml+xml ,我想你是忽略了 '+xml' 这部分。

  50. rebuttonsmallshell / 17:25@2009-01-24 50
    smallshell

    http://www.w3.org/TR/xhtml-media-types/#summary
    这篇文章,说了这个问题。

  51. rebuttonShawn / 22:08@2009-01-24 51
    Shawn

    @smallshell: 看来你还是没明白。选择 xhtml 1.1 的原因是它要求更严谨的标签结构和对CSS的支持继承性,和你列出的文章所讲的内容无关。文章是02年的,到现在1.1已经相当成熟,其中w3c已做出了很多妥协,浏览器也改进相当之多。如果存在你提到的问题,我将 xhtml 1.1 的声明以 text/html 解析的时候会收到警告效验。事实上没有。

  52. rebuttonbolo / 21:20@2009-06-15 52
    bolo

    代码好像复杂了点

Leave Comments Here...

必填

必填&保密

随您

支持Ctrl+Enter快捷提交

  • 已部署"白忙活" Anti-Spam 系统,猪肉 Spammer 请注意查看源代码链接处。
  • 本站不会泄露您的邮件地址,敬请放心。
  • 支持常用 HTML 代码调用,插入 PHP 代码需注意:< = &lt;> = &gt;
  • 仅当某人针对您的评论做出回应时,您才会收到由本站发出的通知信件。
  • 如您希望以相同方式通知某位网友,请点击 Reply 按钮,或自行输入 @对方名字:
  • 鼠标移至评论列表中的 @someone: 区域即可自动显示 someone 的评论内容。
1 Trackbacks/Pingbacks
  • 神无 » Blog Archive » [转载]定义页面中的链接样式 (Pingback, 2009-03-16)
    [...] 第一句是给所有rel属性包含external的链接添加一个小图标。如果你的页面还在用target=”_blank”属性,最好自己修改为rel=”external”这样。修改教程请见Shawn的教程。不然请用这样的代码 [...]

Shawn Blog

Shawn的个人博客(Blog),分享Wordpress技巧和Firefox浏览器心得,关注Web 2.0应用发展,记录对虚拟主机的使用评价。