
在文章裡放了外部連結,常會聽到「要加 nofollow,不然權重會流失」。這篇把連結的 rel 屬性講清楚:什麼時候要加、該加哪一個,以及哪些舊觀念已經不適用。
(原本另外兩篇〈用代碼自動讓 wordpress 的文章連結加入 nofollow 屬性〉、〈用代碼重寫 wordpress 留言評論者的連結網址〉的內容,已經整合到這裡。)
rel 屬性是什麼?
rel 是寫在連結上的屬性,用來告訴搜尋引擎「我跟這個連結是什麼關係」:
<a href="https://example.com/" rel="nofollow">範例網站</a>對訪客來說,有沒有加 rel,點起來完全一樣;影響的只有搜尋引擎怎麼看待這個連結。
nofollow、ugc、sponsored 的差別
rel="sponsored":付費或有利益交換的連結,例如廣告、業配文、聯盟行銷(分潤)連結、廠商贊助。Google 要求這類連結要標示出來,沒標示可能被視為操縱排名的連結。rel="ugc":UGC 是 User Generated Content(使用者產生的內容),用在留言、論壇發文、訪客投稿裡的連結。rel="nofollow":不想替這個連結背書,又不屬於上面兩種時使用,例如提到某個網站,但你不確定它是否可靠。
幾個值可以一起用,中間用空格隔開,例如 rel="ugc nofollow"、rel="sponsored nofollow"。Google 現在把這幾個屬性當作「提示」參考,而不是一律不理會這個連結。官方說明可以看 Google 的外連連結標示說明。
外部連結不需要全部加 nofollow
這篇文章舊版的程式碼,會把文章裡所有外部連結自動加上 nofollow,理由是「比較容易被搜尋引擎收錄」。這個說法並不正確:
- 連到可信、相關的網站(官方文件、政府網站、引用的資料來源),對讀者有幫助,本來就是正常的網頁行為,不會讓你的網站被扣分。
- 刻意替所有外部連結加上
nofollow想「留住權重」,並不會讓自己的網頁排名變好,也不會加快收錄。
所以比較好的做法是:一般的外部連結正常連,只替需要標示的連結加上對應的屬性。
WordPress 已經幫你處理的部分
- 留言裡的連結:留言內容裡的外部連結,以及留言者填寫的「網站」欄位連結,WordPress 預設就會自動加上
nofollow與ugc,不需要另外寫程式。 - 在新分頁開啟:在編輯器勾選「在新分頁中開啟」時,WordPress 會自動加上
noopener之類的值,這是安全性設定,跟 SEO 無關。
舊版「留言連結改走跳轉網址」為什麼不要用
原本另一篇文章的做法,是把留言裡的連結改成「你的網址/?r=外部網址」,點下去再由你的網站轉過去。這個做法有嚴重的問題:
- 開放式重新導向(Open Redirect)漏洞:任何人都可以做出「你的網址/?r=詐騙網站」這種連結,看起來是你的網域,點下去卻被帶到詐騙網站。你的網域信譽會受損,也可能被防毒軟體或瀏覽器標示為危險網站。
- 沒有必要:WordPress 本來就已經替留言連結加好
ugc與nofollow,不需要再繞一圈。
如果你以前加過這段程式碼,建議直接移除。
留言表單不想要「網站」欄位?
很多垃圾留言就是為了在「網站」欄位留下連結。如果你的讀者本來就很少填這一欄,可以直接把它拿掉:
add_filter( 'comment_form_default_fields', function ( $fields ) {
unset( $fields['url'] );
return $fields;
} );防垃圾留言的其他做法,請看WordPress 防垃圾留言總整理。
在文章裡怎麼替連結加上 rel
- 區塊編輯器:選取該段落,點區塊工具列的「⋮」選單,切換成 HTML 編輯,在
<a>標籤裡加上rel="sponsored"之類的屬性,再切換回來。 - SEO 外掛:有些 SEO 外掛(例如 Rank Math、Yoast SEO)會在編輯器的連結設定裡,多出 nofollow、sponsored 的勾選項目,不用碰 HTML。
程式碼:替指定網域自動加上 sponsored
如果你的文章裡有很多聯盟行銷、合作廠商的連結,一篇一篇改太麻煩,可以用程式碼替指定的網域自動加上 sponsored。
舊版程式碼是用正規表達式直接改 HTML,遇到屬性順序不同、單引號或特殊寫法就容易出錯。下面改用 WordPress 6.2 之後內建的 WP_HTML_Tag_Processor,它會正確解析 HTML 標籤,比較不會把文章改壞。加到子主題的 functions.php,或用 Code Snippets 外掛新增:
function ahwei_add_link_rel( $content ) {
if ( false === stripos( $content, '<a' ) ) {
return $content;
}
// 這些網域的連結加上 sponsored(聯盟行銷、廣告合作等),不用寫 https:// 和 www.
$sponsored_domains = array( 'shop.example.com', 'affiliate.example.net' );
// true = 其他所有外部連結也加上 nofollow;一般網站建議維持 false
$nofollow_all_external = false;
$site = preg_replace( '/^www\./i', '', (string) wp_parse_url( home_url(), PHP_URL_HOST ) );
$tags = new WP_HTML_Tag_Processor( $content );
while ( $tags->next_tag( 'a' ) ) {
$href = $tags->get_attribute( 'href' );
$host = is_string( $href ) ? wp_parse_url( $href, PHP_URL_HOST ) : null;
if ( ! $host ) {
continue; // 站內相對網址、#錨點、mailto 等不處理
}
$host = preg_replace( '/^www\./i', '', strtolower( $host ) );
if ( $host === $site ) {
continue; // 自己網站的連結不處理
}
$add = array();
foreach ( $sponsored_domains as $domain ) {
if ( $host === $domain || str_ends_with( $host, '.' . $domain ) ) {
$add[] = 'sponsored';
break;
}
}
if ( $nofollow_all_external ) {
$add[] = 'nofollow';
}
if ( ! $add ) {
continue;
}
$rel = $tags->get_attribute( 'rel' );
$rel = is_string( $rel ) ? preg_split( '/\s+/', strtolower( trim( $rel ) ), -1, PREG_SPLIT_NO_EMPTY ) : array();
$tags->set_attribute( 'rel', implode( ' ', array_unique( array_merge( $rel, $add ) ) ) );
}
return $tags->get_updated_html();
}
add_filter( 'the_content', 'ahwei_add_link_rel', 20 );說明:
$sponsored_domains填要標示的網域,用小寫、不用加https://和www.,這個網域底下的子網域也會一起套用。- 原本連結上已經有的
rel值(例如noopener)會保留,只會把新的值加上去。 $nofollow_all_external預設是false。除非網站的外部連結大多無法把關(例如開放很多人投稿),否則不建議打開。- 這段只處理文章內容(
the_content),不會改到選單、頁尾的連結。 - 加好之後,打開一篇文章,在連結上按右鍵選「檢查」,就能看到
rel有沒有正確加上。
延伸閱讀
- WordPress 內部連結怎麼做?SEO 觀念與自動關鍵字連結的正確寫法
- WordPress 文章 SEO 怎麼做?標題、網址、內文、圖片與提交搜尋引擎的重點整理
- WordPress 防垃圾留言總整理:外掛、留言設定、蜜罐與字數限制
連結該怎麼標示,是 SEO 裡很容易被誤解的一塊。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供 SEO 搜尋引擎優化與 Google 關鍵字廣告服務,歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。