WordPress過濾文章插入鏈接rel屬性noopener noreferrer值
在保存文章的時候,WordPress會自動過濾文章內容中的鏈接,具有target屬性的鏈接會自動添加rel="noopener noreferrer",該屬性是為了預防跨站攻擊,站內鏈接似乎沒有必要添加,但我習慣站內鏈接也設置target屬性。
將以下代碼復制到主題文件functions.php
function bzg_targeted_link_rel($rel, $link_html) {$site_url = parse_url(site_url());preg_match('/href=[\'\"](https?:\/\/.*)[\'\"]/i', $link_html, $matchs);if(empty($matchs[1])) return '';$target_url = parse_url($matchs[1]);if($target_url['host'] == $site_url['host']) {return '';}return $rel;
}
add_filter('wp_targeted_link_rel', 'bzg_targeted_link_rel', 10, 2);
此時,保存文章不會對站內鏈接添加rel屬性了,對于之前已經發表的文章,需要在數據庫修改(操作前先備份一下數據庫):
UPDATE `wp_posts` SET `post_content` = replace (`post_content`,' rel="noopener noreferrer"','') WHERE `post_content` LIKE '% rel="noopener noreferrer"%'
這條SQL語句會替換掉所有鏈接中的rel屬性,包括站外鏈接,但站外鏈接應該添加上rel屬性,可以使用下面的正則表達式把站外鏈接提取出來:
$str = file_get_contents('beizigen.sql');
$str = stripslashes(preg_replace("/[\t\n\r]+/", "", $str));
preg_match_all('/<a.*href="(https?:\/\/(?!\www\.siyege\.com).*".*)>.*<\/a>/Ui', $str, $matchs, PREG_PATTERN_ORDER);
print_r($matchs[1]);
事實上我在執行SQL語句時沒有考慮到站外鏈接的情況而走了彎路,如果直接使用Notepad++之類的文本編輯器正則表達式替換,就不需要SQL語句替換和手動檢索站外鏈接了。
查找正則表達式如下:
<a.*?href=\\"(https?:\/\/\www\.siyege\.com.*?)\\".*?>
替換為:
<a href=\\\"\1\\\" target=\\\"_blank\\\">
建議單獨替換wp_posts表,可以在phpMyAdmin中只導出wp_posts表進行替換,為了安全起見,操作前先備份好數據。
附:之前對noopener noreferrer不太了解,擔心影響SEO,研究之后發現對具有target屬性的鏈接添加noopener noreferrer還是有必要的,看來白折騰了。