WordPress 外部リンクを新しいウィンドウ/新しいタブで、内部リンクを現在のウィンドウで開く

SEOのためには、内部リンクと外部リンクを適切に使用することが望ましい。外部リンクを新しいウィンドウまたは新しいタブで開くようにしたい場合があります。手動で外部リンクを新しいウィンドウ/新しいタブで開くように設定できますが、Rank Mathなどのプラグインを使用するか、簡単なコードを使用してすべての外部リンクを新しいウィンドウまたは新しいタブで実行することもできます。 WordPress 外部リンクを強制的に新しいウィンドウ/新しいタブで開くようにする方法と、内部リンクを現在のウィンドウ/タブで開くようにする方法について説明します。

SEOのためには、外部リンクを新しいウィンドウで開くようにすることが望ましいですが、Google AdSense 収益が重要な場合は、すべてのリンクを現在のウィンドウで開くように設定することを検討できます。

WordPress 外部リンクを新しいウィンドウ/新しいタブで、内部リンクを現在のウィンドウで開く

[この記事はずっと前に書かれていましたが、 WordPress 情報を反映して全面的に修正され再発行されました。 ]

WordPress ブロックエディタで新しいタブでリンクを開くを設定する

WordPressの基本的なエディタである Gutenbergで文章を書いている場合は、テキストを選択して Ctrl + K ショートカットを押してリンクを追加し、エディタでリンクをもう一度クリックし、編集アイコン(鉛筆のアイコン)をクリックします。

WordPress リンク設定

高級をクリックすると、 新しいタブで開く オプションが表示されます。

WordPress ブロックエディタの新しいタブで開く設定

Rank Math などSEOプラグインを使用する場合 Open in New Tab(新しいタブで開く)を有効にするだけです。以下は、Rank Mathプラグインを使用している場合はリンクを設定し、もう一度リンクを選択して編集アイコンをタップします 高級を選択したときの画面です。

Rank Math 新しいタブで開く設定

Yoast SEOプラグインも同様に、新しいタブで開くオプションとnofollow、sponsoredプロパティを選択するオプションが表示されます。

Yoast SEO 新しいタブで開く設定

SEOプラグインを使用すると、nofollow、sponsoredなどのrel属性を選択できます。 SEOプラグインがインストールされていない場合、過去にこれらのプロパティを選択することはできませんでしたが、 WordPress バージョンでは、 nofollow プロパティは選択可能なようです。

リンクするテキストをマウスで選択し、 リンクを追加 アイコンをクリックするか、 Ctrl + K ショートカットを押してリンクを追加することができます。

すべての外部リンクを新しいウィンドウ/新しいタブで開く

さまざまな方法で、すべての外部リンクを新しいウィンドウで強制的に開くことができます。 Rank MathなどのSEOプラグインを使用している場合は、SEOプラグインにSEO用の外部リンクを新しいウィンドウで開くようにするオプションがあります(以下の「SEOプラグインの使用」セクションを参照)。

プラグインの使用方法を好まない場合は、次のJavaScriptコードでテストしてください。

<script>
document.addEventListener("DOMContentLoaded", function() {
	var links = document.querySelectorAll("a");
	var currentHost = window.location.host;

	links.forEach(function(link) {
		// href가 없으면 무시
		if (!link.href) return;

		// 현재 host가 포함되지 않은 경우 = 외부 링크
		if (link.href.indexOf(currentHost) === -1) {
			link.addEventListener("click", function(event) {
				event.preventDefault();
				event.stopPropagation();
				window.open(link.href, "_blank");
			});
		}
	});
});
</script>

JSコード WordPressに追加するさまざまな方法があります。

  1. チャイルドテーマを作成し、enquque方式でロード→サイト速度への影響を最小限に抑える
  2. WPCodeのようなプラグインを使用→簡単
  3. GeneratePress テーマなど一部のテーマではJSコードを追加できる機能を提供

WPCode(Insert Headers and Footers)プラグインを使用してコードをフッタ領域に追加すると、簡単に追加できます。

ただし、WPCodeを使用するとサイト全体で読み込まれるため、それはお勧めできません。 GeneratePress テーマを使用している場合は、フックを使用してフッタ領域にJSコードをロードできます。

上記のコードがうまくいかない場合は、次の記事で紹介するコードでテストしてみてください。

参考までに、すべてのリンク(内側リンクと外側リンクの両方)を新しいウィンドウ/新しいタブで開くようにしたい場合は、次のようなJasを適用できます。

var links = document.getElementsByTagName("a");

for(var i=0; i<links.length; i++) {
    links[i].target='_blank';
}

SEOの場合、内部リンクは現在のウィンドウで、外部リンクは新しいウィンドウで開くようにすることを検討できます。

内部リンクは現在のウィンドウで、外部リンクは新しいウィンドウで開くようにする

SEOために、内部リンクは現在のウィンドウで開き、外部リンクは新しいウィンドウで開くことができます。

以下のJSコードが必要に応じて動作するかどうかをテストしてください。

<script>
	(function () {
		"use strict";

		// ===== 설정(필요 시 수정) =====
		const INCLUDE_SUBDOMAINS = false;	// 내부 도메인 판정 시 서브도메인을 포함할지 여부
		const EXTERNAL_REL_TOKENS = ["noopener", "noreferrer"]; // 외부 링크 보안 토큰
		const IGNORE_PROTOCOLS = new Set(["mailto:", "tel:", "javascript:"]); // 처리 제외 프로토콜
		const DATA_OPTOUT_ATTR = "data-link-scope"; // data-link-scope="keep" 이면 처리 제외

		// ===== 유틸 =====
		const currentURL = window.location;
		const currentHost = currentURL.hostname;

		function isHashOnly(href) {
			return href.charAt(0) === "#";
		}

		function toURL(href) {
			// 상대경로를 포함한 모든 href를 절대 URL로 안전 변환
			try {
				return new URL(href, currentURL.href);
			} catch (e) {
				return null;
			}
		}

		function isInternal(url) {
			if (!url) return true; // 파싱 실패 시 보수적으로 내부로 간주
			if (INCLUDE_SUBDOMAINS) {
				return url.hostname === currentHost || url.hostname.endsWith("." + currentHost);
			}
			return url.hostname === currentHost;
		}

		function ensureRelTokens(el, tokens) {
			const existing = (el.getAttribute("rel") || "").split(/\s+/).filter(Boolean);
			const set = new Set(existing);
			for (const t of tokens) set.add(t);
			el.setAttribute("rel", Array.from(set).join(" "));
		}

		function removeRelTokens(el, tokens) {
			const existing = (el.getAttribute("rel") || "").split(/\s+/).filter(Boolean);
			const filtered = existing.filter(t => !tokens.includes(t));
			if (filtered.length) el.setAttribute("rel", filtered.join(" "));
			else el.removeAttribute("rel");
		}

		function shouldSkip(a) {
			// 명시적 옵트아웃, 다운로드 링크, 버튼 역할, 해시만 있는 링크, 특수 프로토콜 등은 건너뜀
			const href = a.getAttribute("href") || "";
			if (!href) return true;
			if (a.hasAttribute("download")) return true;
			if (a.getAttribute(DATA_OPTOUT_ATTR) === "keep") return true;
			if (isHashOnly(href)) return true;

			for (const proto of IGNORE_PROTOCOLS) {
				if (href.startsWith(proto)) return true;
			}
			return false;
		}

		function processLink(a) {
			if (shouldSkip(a)) return;

			const url = toURL(a.getAttribute("href"));
			// http/https 이외는 스킵
			if (!url || (url.protocol !== "http:" && url.protocol !== "https:")) return;

			if (isInternal(url)) {
				// 내부 링크: target 제거, 외부용 rel 토큰 제거
				if (a.hasAttribute("target")) a.removeAttribute("target");
				removeRelTokens(a, EXTERNAL_REL_TOKENS);
			} else {
				// 외부 링크: 새 창 + 보안 rel 토큰 추가
				if (a.target !== "_blank") a.target = "_blank";
				ensureRelTokens(a, EXTERNAL_REL_TOKENS);
			}
		}

		function processAll(root) {
			// a[href]만 선별하여 순회 (라이브 컬렉션 대신 정적 NodeList 사용으로 성능 개선)
			const anchors = root.querySelectorAll("a[href]");
			for (const a of anchors) processLink(a);
		}

		// 초기 DOM 처리
		if (document.readyState === "loading") {
			document.addEventListener("DOMContentLoaded", function () {
				processAll(document);
			});
		} else {
			processAll(document);
		}

		// 동적 추가 노드에 대한 처리 (예: 무한 스크롤, Ajax, 블록 에디터 등)
		const mo = new MutationObserver(function (mutations) {
			for (const m of mutations) {
				for (const node of m.addedNodes) {
					if (node.nodeType !== 1) continue; // ELEMENT_NODE
					if (node.matches && node.matches("a[href]")) {
						processLink(node);
					}
					// 하위에도 a[href]가 있을 수 있으므로 루트로 처리
					processAll(node);
				}
			}
		});

		mo.observe(document.body, { childList: true, subtree: true });
	})();
</script>

Rank Mathプラグインがインストールされている場合は、Rank Math内ですべての外部リンクを新しいウィンドウで開くように設定し、次のコードを使用して内部リンクのみを現在のウィンドウで開くように設定することも検討できます。

<script>
	(function () {
		"use strict";

		// ===== 설정(필요 시 수정) =====
		const INCLUDE_SUBDOMAINS = false;	// 내부 도메인 판정 시 서브도메인을 포함할지 여부
		const EXTERNAL_REL_TOKENS = ["noopener", "noreferrer"]; // (내부 링크에선 제거 대상)
		const IGNORE_PROTOCOLS = new Set(["mailto:", "tel:", "javascript:"]); // 처리 제외 프로토콜
		const DATA_OPTOUT_ATTR = "data-link-scope"; // data-link-scope="keep" 이면 처리 제외

		// ===== 유틸 =====
		const currentURL = window.location;
		const currentHost = currentURL.hostname;

		function isHashOnly(href) {
			return href.charAt(0) === "#";
		}

		function toURL(href) {
			try {
                // 상대경로 포함 모든 href를 절대 URL로 변환
				return new URL(href, currentURL.href);
			} catch (_e) {
				return null;
			}
		}

		function isInternal(url) {
			if (!url) return true; // 파싱 실패 시 보수적으로 내부로 간주
			if (INCLUDE_SUBDOMAINS) {
				return url.hostname === currentHost || url.hostname.endsWith("." + currentHost);
			}
			return url.hostname === currentHost;
		}

		function removeRelTokens(el, tokens) {
			const existing = (el.getAttribute("rel") || "").split(/\s+/).filter(Boolean);
			const filtered = existing.filter(t => !tokens.includes(t));
			if (filtered.length) el.setAttribute("rel", filtered.join(" "));
			else el.removeAttribute("rel");
		}

		function shouldSkip(a) {
			const href = a.getAttribute("href") || "";
			if (!href) return true;
			if (a.hasAttribute("download")) return true;
			if (a.getAttribute(DATA_OPTOUT_ATTR) === "keep") return true;
			if (isHashOnly(href)) return true;
			for (const proto of IGNORE_PROTOCOLS) {
				if (href.startsWith(proto)) return true;
			}
			return false;
		}

		function processLink(a) {
			if (shouldSkip(a)) return;

			const url = toURL(a.getAttribute("href"));
			// http/https 이외는 스킵
			if (!url || (url.protocol !== "http:" && url.protocol !== "https:")) return;

			// ✅ 내부 링크만 현재 창 강제
			if (isInternal(url)) {
				if (a.hasAttribute("target")) a.removeAttribute("target");
				// 내부 링크에 붙어 있을 수 있는 외부용 rel 토큰 정리
				removeRelTokens(a, EXTERNAL_REL_TOKENS);
			}

			// ❌ 외부 링크는 전혀 건드리지 않음 (target/rel 그대로 유지)
		}

		function processAll(root) {
			const anchors = root.querySelectorAll("a[href]");
			for (const a of anchors) processLink(a);
		}

		// 초기 DOM 처리
		if (document.readyState === "loading") {
			document.addEventListener("DOMContentLoaded", function () {
				processAll(document);
			});
		} else {
			processAll(document);
		}

		// 동적 추가 노드 처리 (무한스크롤/블록 에디터 등)
		const mo = new MutationObserver(function (mutations) {
			for (const m of mutations) {
				for (const node of m.addedNodes) {
					if (node.nodeType !== 1) continue; // ELEMENT_NODE
					if (node.matches && node.matches("a[href]")) {
						processLink(node);
					}
					processAll(node);
				}
			}
		});
		mo.observe(document.body, { childList: true, subtree: true });
	})();
</script>

GeneratePress テーマがインストールされて WordPress サイトでテストしてみると、うまく動作することを確認しました。他の環境でも好きなように動作すると思われますが、上記のコードが機能しない場合は、コメントでお知らせください。

すべてのリンクを現在のウィンドウで開く

リンクを現在のウィンドウ/タブで開くようにすると AdSense 広告中に前面広告が表示される可能性が高いため、収益を増やすのに役立ちます。

詳しくは、「WordPress/履歴:すべてのリンクを現在のタブ/ウィンドウで開く方法(AdSense 収益の増加)「記事の内容を参考にしてください。

ただし、この方法を使用すると、外部リンクもブラウザの現在のタブで開かれ、直帰率が増加し、SEOには不利になる可能性があります。

ちなみに、ティーストーリーではアンカー広告が禁止され、2025年9月3日からはモバイルフロント広告も設定できないようにポリシーが変更されました。

プラグインを使用して外部リンクを新しいウィンドウ/新しいタブで開く

プラグインを使用すると、外部リンクを新しいウィンドウで開くように簡単に設定できます。 Rank Mathプラグインを使用している場合は、ランクマス内で外部リンクを新しいウィンドウで開くように設定することができます。

SEOプラグインを使用する

WordPress SEOプラグインで外部リンクを新しいウィンドウで開くように設定するオプションを提供することができます。 例えば、 Rank MathWordPress 管理者ページ » Rank Math SEO » 一般設定(General Settings) » リンクから Open External Links in New Tab / Window オプションを有効にして、外部リンクを新しいウィンドウで開くようにすることができます。

Rank Mathプラグインで外部リンクを新しいウィンドウで開く

他にも、外部リンクや画像ファイルのリンクに Nofollow属性を追加するなど、様々なSEO関連のオプションを提供しています。

Rank Mathプラグインを使用している場合は、別のプラグインをインストールする必要なく、このプラグインで提供される機能を使用して外部リンクを新しいウィンドウで実行されるようにすることができます。

Yoast SEOプラグインの場合、このオプションが提供されていないようです。 私は、オプションを検出できなかった可能性がありますので、Yoast SEOでもこの機能が提供される場合、以下のコメントを介してお知らせいただければ文を更新するようにします。

External Links in New Window / New Tabプラグイン

このような機能を提供する代表的なプラグイン External Links in New Window / New Tabがあります。

このプラグインは2025年9月6日現在、3万を超えるサイトにインストールされ使用されています。 Rank Mathプラグインがインストールされている場合は、このプラグインを使用する必要はなく、Rank Math内で設定してください。

WordPress 外部リンクを新しいウィンドウ/新しいタブで開くプラグイン

このプラグインは、基本的に、すべての外部リンクを新しいウィンドウ/タブで開くようにします。 また、新しいタブで開かないように例外リンクを追加することができます。

External Links in New Window / New Tabプラグインの設定ページ
External Links in New Window / New Tabプラグインの設定ページ

最後に、

以上で WordPressで外部リンクを新しいウィンドウ/新しいタブで表示する方法を説明しました。 文を適性するときに、内部リンク(Internal Link)と外部リンク(Exernal Link)を適切に追加すると、SEOに役立ちます。 Yoast SEOやRank MathのようなSEOのプラグインを使用すると、文の作成時にSEOに関連して支援を受けることができます。

参照

2のコメント

コメントを残す

  1. リンクを開いたとき、現在のウィンドウで開くか、新しいウィンドウで開くかは常に悩みましたが、良い情報をありがとう。

    返信
    • 通常、内部リンクは現在のウィンドウで、外部リンクは新しいウィンドウ/新しいタブで開くようにすると無難になりそうです。 AdSense 収益が重要な場合は、すべてのリンクを現在のタブで開くようにすると、前面広告を表示する機会が増え、収益を増やすのに役立ちますが、直帰率が増加してSEOに不利になる可能性があります。

      返信