织梦a标签自动添加target_blank
需求场景与原因分析
用户在编辑文章时,常常插入外部链接或 PDF、图片资源链接。默认情况下织梦生成的 <a href="..."> 不会带 target 属性,点击后会在当前窗口跳转,导致用户离开本站,增加跳出率、缩短停留时间。
为外链或所有正文链接自动添加 target="_blank",可以让链接在新标签页打开,既能保留原页面浏览,也方便用户继续阅读其他内容。这是内容站常用的体验优化手段。
实现思路
与“自动添加 nofollow”类似,核心是在内容输出前用正则匹配 <a> 标签,判断是否已有 target 属性,没有则追加 target="_blank"。两种实现路径:
路径 A:修改 arc.archives.class.php(影响生成静态页)
适合全站统一处理,生成后 HTML 永久生效,访问时无额外开销。
路径 B:模板层 function 自定义函数(动态调用)
不改核心文件,仅模板调用时生效,灵活但每次访问都要执行正则。
完整实现代码
方案 A:核心文件改造
打开 /include/arc.archives.class.php,在 Archives 类中添加方法:
function AddTargetBlank($content) {
// 已有 target 属性的 a 标签跳过
$pattern='/<a(?![^>]*\btarget=)([^>]*)>/i';
return preg_replace_callback($pattern, function($m) {
return '<a' . $m[1] . ' target="_blank">';
}, $content);
}
在 MakeHtml 输出 body 处调用:
$this->Fields['body']=$this->AddTargetBlank($this->Fields['body']);
方案 B:模板函数(推荐)
将函数写入 /include/extend.func.php:
function AutoTargetBlank($content) {
return preg_replace_callback(
'/<a(?![^>]*\btarget=)([^>]*)>/i',
function($m) { return '<a'.$m[1].' target="_blank">'; },
$content
);
}
模板调用:
{dede:field.body function="AutoTargetBlank(@me)"/}
组合 nofollow 的写法
实践中常将 target="_blank" 与 rel="nofollow noopener" 一起加。合并函数:
function AutoTargetAndNofollow($content) {
$host=preg_replace('#^https?://#', '', $GLOBALS['cfg_basehost']);
$pattern='/<a(.*?)href=["\'](https?:\/\/(?!' . preg_quote($host, '/') . ')[^"\']+)["\'](.*?)>/i';
return preg_replace_callback($pattern, function($m) {
$attrs=$m[1] . $m[3];
if (!preg_match('/\btarget=/i', $attrs)) {
$attrs .=' target="_blank"';
}
if (preg_match('/rel=["\'][^"\']*["\']/i', $attrs)) {
$attrs=preg_replace('/rel=["\']([^"\']*)["\']/i',
'rel="$1 nofollow noopener"', $attrs);
} else {
$attrs .=' rel="nofollow noopener"';
}
return '<a' . $attrs . 'href="' . $m[2] . '">';
}, $content);
}
注意事项
1.
target="_blank" 存在 window.opener 安全风险(钓鱼攻击),务必同时加 rel="noopener noreferrer",尤其对老浏览器用户。2. 站内导航链接(如面包屑、相关文章)一般不需要新窗口打开,函数中应只处理 body 字段,避免误伤。
3. 富文本编辑器(如 CKEditor、ueditor)保存时可能已带 target 属性,函数中使用负向先行断言
(?![^>]*\btarget=) 跳过已设置的标签,避免重复。4. 移动端浏览器新标签打开体验较差,可结合 UA 判断是否启用该规则。
行动建议
建议优先采用方案 B 模板函数方式,便于随主题切换。上线前用站长工具抓取几个典型页面,检查 a 标签是否正确添加 target 与 rel 属性。同时结合百度统计的“退出页”数据观察跳出率变化,验证优化效果。对于内容编辑团队,可在编辑器配置中默认勾选“新窗口打开”,从源头减少对自动处理函数的依赖。