WordPressのPHPで外部リンクを自動でtarget="_blank"...にする方法

WordPressサイトで外部リンクを自動で別タブで開く処理をphp側で実装するコードです。

下記のコードをWordPressのテーマ内のfunctions.phpに追加することで実装できます。

function LinkTarget($content) {
    // 外部リンクの正規表現パターン
    $pattern = '/<a([^>]*)href=[\'"]([^\'"]+)[\'"]([^>]*)>/i';

    // コンテンツ内のすべてのaタグを検索
    $content = preg_replace_callback($pattern, function ($matches) {
        // href属性の値を取得
        $href = $matches[2];

        // mailto: や tel: など、除外するリンクのパターン
        $exclude_patterns = array('/^mailto:/i', '/^tel:/i');

        // href属性が除外パターンにマッチする場合は元のaタグを返す
        foreach ($exclude_patterns as $pattern) {
            if (preg_match($pattern, $href)) {
                return $matches[0];
            }
        }

        if (filter_var($href, FILTER_VALIDATE_URL) && !preg_match('/^' . preg_quote(home_url(), '/') . '/', $href)) {
            return '<a' . $matches[1] . 'href="' . $href . '" target="_blank" rel="noopener noreferrer"' . $matches[3] . '>';
        } else {
            // 外部リンクでない場合、元のaタグを返す
            return $matches[0];
        }
    }, $content);

    return $content;
}
add_action('template_redirect', function () {
    ob_start('LinkTarget');
});
add_filter('the_content', 'LinkTarget');