make_clickable()

2025.03.14

WordPressでは投稿本文のURLを自動的にリンク表示する機能があります。
この機能は制作するサイトによって有効にしたり無効にしたり設定を行うと思いますが、有効にした際に生成されるリンクタグにちょっと一手間。

デフォルトの状態ではリンクをクリックするとページ遷移するわけですが、同一サイト内のリンクならそのままページ遷移して、外部サイトへのリンクの場合には新しいタブ等でリンク先を表示したいときの設定です。
functions.phpなどに記述すれば外部サイトは新規タブ等でリンク先を表示します。

// the_contentに対してmake_clickable()を適用 Priorityは10でも問題ないかと思いますので適時調整してください。
add_filter('the_content', 'make_clickable', 20);

// make_clickable()でリンクに変更されたタグにtarget="_blank"を追加して新しいタブでリンクを表示するように設定
add_filter('the_content', function ($content) {
    $trim_width = 60; // リンクテキスト(URL)の長さ 適時調整
    $trim_marker = '…'; // 長いリンクテキスト(URL)の場合のtrim_markerの指定 適時調整 …等
    $content = preg_replace_callback_array([
        '||' => function ($matches) {
            if (stripos($matches[0], home_url()) !== false) {
                $matches[0] = str_replace(' rel="nofollow">', '>', $matches[0]);
            } else {
                $matches[0] = str_replace(' rel="nofollow">', ' rel="nofollow" target="_blank">', $matches[0]);
            }
            return $matches[0];
        },
        '|(]*>)(.+?)()|' => function ($matches) use ($trim_width, $trim_marker) {
            $link_text = mb_strimwidth($matches[2], 0, $trim_width, $trim_marker);
            $link = $matches[1] . rawurldecode($link_text) . $matches[3];
            return $link;
        },
    ], $content);
    return $content;
}, 21); // 2行目でPriorityが10の場合(あるいは記述しない場合)はPriorityの指定はなくても問題ないかと思います。(明示的に2行目より大きい数字にする方が親切)

リンクテキスト(URL)が長い時の対応はCSSで設定したり、投稿時に直接リンクタグを設定する等で対応するのもよろしいかと。

参考 https://developer.wordpress.org/reference/functions/make_clickable/