【WordPress】外部リンクだけに target=”_blank” と rel 属性を自動追加する方法

【WordPress】外部リンクだけに target="_blank" と rel 属性を自動追加する方法 WordPress

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” を自動付与することで、ユーザーの離脱防止とセキュリティ向上の両立が実現できます。わざわざ手動で書き換えたり、エディタで意識しなくてもよくなるため、運用の効率化にも大きく貢献します。