在新窗口中打开外部链接

时间:2010-12-31 作者:Filuren

是否可以进行某种更改或添加一个插件,使我可以在新窗口中打开每个“外部”链接?

举个例子:如果我的博客名为http//timmy。我想链接到http//tom。com/,它将打开一个新窗口,而不是相同的窗口,但我想从http//timmy链接。com/to http//timmy。com/某处/在同一窗口中。

因此,我希望所有从我的网站到另一个网站的外部链接都在一个新的窗口/选项卡中,但我希望所有从我的网站到我网站上其他地方的内部链接都在同一个窗口/选项卡中。

这可能吗?

4 个回复
SO网友:curtismchale

是的,可以用javascript完成。

var $j = jQuery.noConflict();

$j(document).ready(function() { //external attribute
    $j("a:not([@href*=http://YOURSITE.com/])").not("[href^=#]")
    .addClass("external")
    .attr({ target: "_blank" });
});

SO网友:Rarst

虽然你们在技术方面得到了如何做到这一点的答案,但我想在可用性方面插话——你们真的不应该这么做。

除了某些特定情况(例如,非基于web的文档)之外,打开新的浏览器窗口/选项卡以获取链接被认为是非常糟糕的做法(而且已经很长时间了)。

虽然这似乎是一种有效地保持网站开放的策略,但很可能会激怒那些并不明确想要新标签,但无论如何都得到了它的用户,因为你决定为他们提供新标签。

SO网友:hakre

嗯,没有必要重新发明轮子:External Links Plugin For WordPress, 我真的可以推荐它。

SO网友:MikeSchinkel

你好@ninjaboi21:

我知道@curtismchale给了你一个jQuery解决方案,应该可以很好地工作。如果你想要一个PHP解决方案,这里有一个应该也适合你。

基本上,解决方案分为两部分;首先是使用PHP的ob_start() 函数,这很容易,然后在回调函数中解析输出,这是比较复杂的。我使用了一种不那么优雅的暴力方法;我相信有更好的方法,但暴力方法是像我这样不那么聪明的人所使用的。:)也许其他人会带来一些更优雅的东西。

这是代码;把这个放在你的主题中functions.php 文件,您应该准备好:

add_action(\'init\',\'buffer_output_for_links\');
function buffer_output_for_links() {
  if (!is_admin())  // No need to do in the admin
    ob_start(\'decorate_links\');
}
function decorate_links($content) {
  $wpurl = get_bloginfo(\'wpurl\');
  $parts = explode(\'<a\',$content);
  for($index = 1; $index<count($parts); $index++) {
    // Break apart on \'>\' to isolate anchor attributes
    $part = explode(\'>\',$parts[$index]);
    // Remove all target="_blank"
    $part[0] = preg_replace("#\\\\s*target\\\\s*=\\\\s*[\\"\'].*?[\'\\"]\\\\s*#",\' \',$part[0]);
    // Add target="_blank" to all
    $part[0] = preg_replace(\'#href\\s*=\\s*#\',\'target="_blank" href=\',$part[0]);
    // Remove target="_blank" from only this domain
    $part[0] = preg_replace("#target=\\"_blank\\" href=([\'\\"]){$wpurl}#","href=\\\\1{$wpurl}",$part[0]);
    // End this part by reassembling on the \'>\'
    $parts[$index] = implode(\'>\',$part);
  }
  // Finally reassembling it all on the \'<a\' leaving a space for good measure
  $content = implode(\'<a \',$parts);
  return $content;
}
-迈克·辛克尔

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?