WordPressでは、投稿本文やウィジェットに含まれるリンクをそのまま出力すると、外部リンクも同一ウィンドウで開いてしまうため、ユーザーがサイトから離脱する原因になりがちです。
そこでこの記事では、投稿本文内の外部リンクにのみ target=”_blank” と rel=”noopener noreferrer” を自動的に付与する方法をご紹介します。
なぜ rel=”noopener noreferrer” が必要なのか?
- target=”_blank” を使うと、新しいタブでリンクが開きますが、セキュリティ上の理由から rel=”noopener noreferrer” の追加が推奨されます。
- 特に noopener は、新しいタブで開いたページが元のページのウィンドウオブジェクトにアクセスするのを防止します。
the_content フィルターを使って外部リンクを加工
以下のコードを functions.php に追加します。
function add_target_blank_to_external_links($content) {
// サイトのドメインを取得(www あり・なしの両方に対応)
$site_url = parse_url(home_url(), PHP_URL_HOST);
// 正規表現でaタグを検出
return preg_replace_callback(
'/<a\s[^>]*href=["\'](.*?)["\'][^>]*>/i',
function ($matches) use ($site_url) {
$url = $matches[1];
// 外部リンクか判定(内部ドメインを含まない)
if (strpos($url, $site_url) === false && strpos($url, 'http') === 0) {
// すでに属性が付与されている場合はそのまま
$tag = $matches[0];
if (strpos($tag, 'target=') === false) {
$tag = str_replace('<a', '<a target="_blank"', $tag);
}
if (strpos($tag, 'rel=') === false) {
$tag = str_replace('<a', '<a rel="noopener noreferrer"', $tag);
}
return $tag;
}
// 内部リンクの場合は変更しない
return $matches[0];
},
$content
);
}
add_filter('the_content', 'add_target_blank_to_external_links');
処理内容のポイント
- 正規表現で <a href=””> タグをすべて検出
- home_url() で現在のサイトドメインを取得し、内部リンクかどうかを判定
- 外部リンクにだけ target=”_blank” と rel=”noopener noreferrer” を追加
- すでに target や rel がある場合は追加しないことで二重付与を防止
注意点
- HTMLが不正な場合や特殊な形式のリンク(JavaScriptリンクなど)には対応しません。
- 他のフィルター(プラグインやテーマ)が the_content を加工している場合、競合する可能性があります。
- 外部リンクの中に特定のドメイン(例:パートナーサイト)は除外したい、という要望がある場合は条件をさらに追加可能です。
まとめ
外部リンクに target=”_blank” と rel=”noopener noreferrer” を自動付与することで、ユーザーの離脱防止とセキュリティ向上の両立が実現できます。わざわざ手動で書き換えたり、エディタで意識しなくてもよくなるため、運用の効率化にも大きく貢献します。