WP External Links の設定を見直す:グループサイト間のリンクの nofollow を外す

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

管理しているサイトの多くで、WP External Links というプラグインを使っています。

外部リンクを別タブで開くために入れていました。

設定を見直したところ、グループサイト間のリンクにも、nofollow が付いていることが分かりました。

この記事では、何がおきていたか、どう直したか、作業環境と本番で確かめた結果をまとめます。

WP External Links とは

WP External Links は、ページの中のリンクを見て、外部リンクに属性を自動で付けるプラグインです。

記事を 1 本ずつ直さなくても、サイト全体の外部リンクをそろえられます。

付けられるもの 意味
target="_blank" リンクを別のタブで開く
rel="nofollow" 検索エンジンに「このリンク先を推薦しているわけではない」と伝える
rel="noopener" 開いた先のページから、元のページを操作できないようにする
rel="noreferrer" リンク先に「どのページから来たか」(リファラー)を送らない
rel="external" 外部のサイトへのリンクであることを示す
title リンクにマウスを乗せたときに出る説明

見直す前の設定

見直す前は、どのサイトも同じ設定でした。

タブ 項目 設定
外部リンク 開き方 別タブ(_blank)
外部リンク follow / nofollow nofollow
外部リンク rel に足すもの noopener・noreferrer・external
外部リンク title {title}
例外 適用する場所 ページ全体(本文・コメント・ウィジェット・メニュー)
例外 サブドメインを内部とみなす オフ
例外 外部リンクから除外する URL 空
内部リンク・除外リンク 設定を使うか 使っていない

見つかったこと:グループサイト間のリンクも「外部」だった

グループサイトには、フッターに「運営サイト」の一覧のような、ほかのグループサイトへのリンクがあります。

ページの HTML を見ると、そのリンクにも nofollow が付いていました。

見直す前の HTML(ドメインは例です)
<!-- 見直す前:グループサイトへのリンクも、外部リンクとして扱われていた -->
<a href="https://example.net/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">…</a>
<a href="https://shop.example.com/" target="_blank" rel="nofollow external noopener noreferrer" data-wpel-link="external">…</a>

別のドメインのサイトだけでなく、同じドメインのサブドメインのサイトも、「外部」と見なされていました。

プラグインのソースを読むと、理由が分かります。

内部リンクかどうかの見分け方
// WP External Links 2.66 の includes/class-wpel-front.php(is_internal_url の一部)
// このサイトのドメインで始まる URL は内部
if ( 0 === strpos( $url, 'http://'.$clean_home_url )
  || 0 === strpos( $url, 'https://'.$clean_home_url )
  /* … www. 付きも同じ … */
) {
    return true;
}

// 「サブドメインを内部とみなす」がオンのときだけ、同じドメインのサブドメインも内部
if ( $this->opt( 'subdomains_as_internal_links' ) && false !== strpos( $url, $this->get_domain() ) ) {
    return true;
}

return false;
書き方 役目
strpos( $url, 'https://'.$clean_home_url ) === 0 リンクの URL が、このサイトのドメインで始まるときだけ内部
subdomains_as_internal_links 「サブドメインを内部とみなす」の設定。オフなので、サブドメインは外部になる
get_domain() このサイトのドメイン(例:example.com)。サブドメインを見分けるのに使う

「サブドメインを内部とみなす」をオンにしても、効くのは同じドメインのサブドメインだけです。

別のドメインのサイトは、外部のままです。

また、内部リンクとして扱うと、内部リンクの設定が使われます。

グループサイト間のリンクは、別のサイトなので別タブで開きたいです。

そこで、サブドメインの設定は使わず、「除外する URL」と「除外リンク」の設定で分けることにしました。

直したこと

1. 「外部リンクから除外する URL」に、グループサイトのドメインを入れる

「例外」のタブにある「外部リンクから除外する URL」に、グループサイトのドメインを 1 行に 1 つずつ入れました。

「例外」→「外部リンクから除外する URL」(例のドメインです)
example.com
example.net

どう比べているかは、ソースで確かめました。

除外する URL の比べ方
// 同じファイルの is_excluded_url(一部)
// 「外部リンクから除外する URL」を、改行やカンマで分けて 1 つずつ比べる
foreach ( $exclude_urls_arr as $exclude_url ) {
    if ( false !== strpos( $url, $exclude_url ) ) {
        return true;
    }
}

return false;
書き方 役目
$exclude_urls_arr 「外部リンクから除外する URL」に書いたものを、改行やカンマで分けた一覧
strpos( $url, $exclude_url ) リンクの URL の中に、その文字が含まれているかを見る
return true 1 つでも含まれていれば、除外リンクとして扱う

「含まれるか」で比べるので、example.com と書けば、https://shop.example.com/ のようなサブドメインも当てはまります。

その代わり、ほかのサイトの URL でも、途中にその文字があれば除外になります(例:?url=example.com のようなリンク)。

サブドメインまでまとめて当てたかったので、ドメインの名前だけを書きました。

2. 「除外リンク」の設定を使い、follow にして「既存の値を上書き」にチェックを入れる

「例外」のタブで「除外リンクの独自設定(追加タブ)」を選ぶと、「除外リンク」のタブが出ます。

そのタブで、次のように設定しました。

項目 設定 理由
除外リンクの設定 チェック(使う) チェックがないと、除外リンクには何も付かない
除外リンクを開く 別タブ(_blank) 別のサイトなので、外部リンクと同じく別タブで開く
follow / nofollow follow グループサイト間のリンクは、推薦してよいリンク
既存の値を上書きします(follow / nofollow) チェック もとの HTML に書いてある nofollow を消すため(下で説明)
noopener を追加 チェック 別タブで開くときの安全のため
noreferrer を追加 チェックなし リンク先のアクセス解析に、どこから来たかが出るように

「既存の値を上書き」のチェックが大事です。

ソースでは、follow と nofollow を次のように付けています。

follow / nofollow の付け方
// 同じファイルの apply_link_settings(follow / nofollow の部分)
$follow = $this->opt( 'rel_follow', $type );
$follow_overwrite = $this->opt( 'rel_follow_overwrite', $type );
$has_follow = $link->has_attr_value( 'rel', 'follow' ) || $link->has_attr_value( 'rel', 'nofollow' );

if ( $follow && ( ! $has_follow || $follow_overwrite ) ) {
    if ( $has_follow ) {
        $link->remove_from_attr( 'rel', 'follow' );
        $link->remove_from_attr( 'rel', 'nofollow' );
    }
    $link->add_to_attr( 'rel', $follow );
}

// noopener・noreferrer は、チェックがあれば足すだけ(消す処理はない)
if ( $this->opt( 'rel_noopener', $type ) ) {
    $link->add_to_attr( 'rel', 'noopener' );
}
if ( $this->opt( 'rel_noreferrer', $type ) ) {
    $link->add_to_attr( 'rel', 'noreferrer' );
}
書き方 役目
$has_follow もとの HTML の rel に、follow か nofollow がもう書いてあるか
! $has_follow || $follow_overwrite まだ書いていないとき、または「上書き」にチェックがあるときだけ、設定の値を付ける
remove_from_attr 上書きのときは、もとの follow / nofollow を消してから付ける
add_to_attr rel に値を足す。noopener・noreferrer は足すだけで、消す処理はない

つまり、チェックを入れないと、もとの HTML に rel="nofollow" と書いてあるリンクは、nofollow のまま残ります。

フッターの一覧のように、テーマやウィジェットの HTML に nofollow が書いてある所があったので、チェックを入れました。

3. 外部リンクの noreferrer を外す(noopener は残す)

「外部リンク」のタブで、noreferrer のチェックを外しました。

noopener のチェックは残しています。

属性 見直した後 理由
noopener 残す 開いた先のページから元のページを操作されないようにする。安全はこれで守れる
noreferrer 外す 付いていると、リンク先のアクセス解析に「どこから来たか」が出ない
nofollow 残す ほかのサイトへのリンクは、これまでどおり nofollow

MDN によると、noreferrer は noopener と同じ働きも持っています。

noopener を残しておけば、noreferrer を外しても、別タブで開いたページから元のページは操作されません。

リファラーが送られても、ほかのサイトに渡るのは、ふつうはこちらのドメインまでです(ブラウザーの既定の決まりで、別のサイトには URL のパスまでは送らないため)。

アフィリエイトのリンクも、nofollow のままにしました。

Google 検索セントラルの「リンクの属性」の説明では、広告や有料のリンクには sponsored をすすめていますが、nofollow でもよいとされています。

確かめた結果

作業環境で、上書きのあり・なしを比べる

このサイトの作業環境(PHP 8.3・WP External Links 2.66)で確かめました。

WP External Links の 3 つの設定(除外リンク・例外・外部リンク)の DB の値をメモしてから、試しの設定に変えました。

そのうえで、試しのスクリプトで、試しのリンク 5 本をプラグインのフィルターに通しました。

試しのスクリプト(形の例)
<?php
// 試しのスクリプト(作業環境だけ):試しのリンクを WP External Links のフィルターに通す
define( 'WP_USE_THEMES', false );
require '(作業環境の WordPress)/wp-load.php';

$links = array(
    '<a href="https://example.net/">A</a>',
    '<a href="https://example.net/page/" rel="nofollow">B</a>',
    '<a href="https://shop.example.com/">C</a>',
    '<a href="https://other-site.org/">D</a>',
    '<a href="https://other-site.org/item" rel="nofollow noopener noreferrer" target="_blank">E</a>',
);
foreach ( $links as $html ) {
    // 「ページ全体に適用」のときは final_output というフィルターで書き換えている
    echo apply_filters( 'final_output', $html ), "\n";
}
書き方 役目
wp-load.php 作業環境の WordPress を、プラグインごと読み込む
apply_filters( 'final_output', … ) 「ページ全体に適用」のときにプラグインが使うフィルターに、試しのリンクを通す

出た rel は、次のとおりです(どれも target="_blank" 付き)。

試しのリンク 見直す前 上書きのチェックなし 上書きのチェックあり noreferrer も外した後
A:グループサイト(rel なし) nofollow external noopener noreferrer follow noopener noopener follow noopener follow
B:グループサイト(もとの HTML に nofollow) nofollow external noopener noreferrer nofollow noopener noopener follow noopener follow
C:グループサイトのサブドメイン nofollow external noopener noreferrer follow noopener noopener follow noopener follow
D:ほかのサイト(rel なし) nofollow external noopener noreferrer nofollow external noopener noreferrer nofollow external noopener noreferrer nofollow external noopener
E:ほかのサイト(もとの HTML に nofollow noopener noreferrer) nofollow noopener noreferrer external 同じ 同じ nofollow noopener noreferrer external(noreferrer は残る)

rel の中の並び(follow noopener と noopener follow)は、付けた順のちがいで、意味は同じです。

上書きのチェックがないと、B のリンクは nofollow のままでした。

チェックを入れると、B も follow になりました。

A〜C は data-wpel-link="exclude"(除外リンク)、D・E は data-wpel-link="external"(外部リンク)になりました。

試したあと、3 つの設定をメモした値に戻し、DB の値が試す前と同じであること、同じリンクを通した結果も試す前と同じであることを確かめました。

本番で、ページの HTML を外から見る

本番の設定を直したあと、このサイトのトップページを外から取得して(2026-10-12)、リンクの属性を数えました。

リンク 出た属性 本数
グループサイトへのリンク rel="noopener follow"・target="_blank"・data-wpel-link="exclude" 6 本
ほかのサイトへのリンク rel="nofollow external noopener" 19 本
ほかのサイトへのリンク(もとの HTML に noreferrer があるもの) rel="nofollow external noopener noreferrer" 1 本

グループサイトへのリンクは follow になり、ほかのサイトへのリンクは nofollow のまま、noreferrer がなくなりました。

つまずいたこと

設定を保存しても、すぐには変わらなかった

設定を保存したあと、ページを見ても、前の属性のままでした。

そのサイトは、オブジェクトキャッシュ(APCu)を使っていて、古い設定がキャッシュに残っていたためです。

ログインしたままトップページを開いてキャッシュを消すと、新しい設定で出るようになりました(そのサイトでは、ログインしたまま表のページを開くとキャッシュが消える作りにしています)。

オブジェクトキャッシュを使っているサイトでは、設定を変えたあとにキャッシュを消してから確かめます。

ほかのプラグインが付けた noreferrer は残る

Amazon の商品リンクのプラグインなど、はじめから rel="nofollow noopener noreferrer" を付けてリンクを出すプラグインがあります。

WP External Links は、もとからある rel の値を消さず、足すだけです(上のソースのとおり、上書きできるのは follow / nofollow だけです)。

そのため、こうしたリンクには noreferrer が残ります。

外したいときは、そのプラグインの設定や出力のほうを見る必要があります(今回は試していません)。

フッターを別のサイトから取ってくるサイトは、取り直すまで前のまま

フッターの一覧を別のサイトから取ってきて、1 日保存しておく作りのサイトがあります。

そうしたサイトでは、保存した HTML を取り直すまで、前の属性のままでした。

確かめるときは、保存の期限が切れたあとか、保存を消したあとに見ます。

まとめ

  • WP External Links は、このサイトのドメインで始まる URL だけを内部と見なす。別のドメインやサブドメインのサイトへのリンクは外部になり、nofollow が付く
  • グループサイト間のリンクは、「外部リンクから除外する URL」にドメインを入れ、「除外リンク」のタブで follow にする
  • 除外する URL は「その文字が URL に含まれるか」で比べる。ドメインだけを書けばサブドメインも当たるが、ほかの URL の途中に入っていても当たる
  • 「既存の値を上書き」にチェックを入れないと、もとの HTML に書いてある nofollow は残る
  • noreferrer を外しても、noopener を残せば安全は守れる。リンク先のアクセス解析に、どこから来たかが出るようになる
  • ほかのプラグインがもとから付けた noreferrer は残る。オブジェクトキャッシュや、取ってきて保存した HTML があると、すぐには変わらない

参考

関連機能

  1. ACF 6.2.7 で HTML がエスケープされるようになった:script タグなどを前と同じに出す方法

  2. WordPress 予約投稿の失敗を解決 Scheduled Post Trigger

  3. WordPress 不正アクセス・攻撃の対象となっているかを簡単に確認する方法

サイドバー

よく使うカスタマイズ

最近の記事

  1. Fstyle Final Output Replacer のルールの一覧(generator タグを消す 2 つのルール)

Profile

PAGE TOP