WordPress ページランダム分岐処理:速度を低下させることなくA / Bをテストする

ランディングページに流入する訪問者を複数ページにランダムに分散させたい場合があります。 A / Bテストを進行したり、トラフィックを均等に配分したり、ユーザーエクスペリエンスを多様化したい場合、ランダムリダイレクトは便利な機能です。

しかし、 WordPressでランダムリダイレクトを実装すると、キャッシュの問題で問題が発生する可能性があります。 PHPでサーバーサイドリダイレクトを実装すると、キャッシュプラグインまたはCDNによって常に同じページにのみリダイレクトされるという問題が発生する可能性があります。とはいえ、そのページに対してキャッシュ除外設定を行うと、ページの読み込み速度が著しく遅くなります。

WordPress サイトでキャッシュを維持してページの読み込み速度を低下させることなく、訪問者がそのランディングページにアクセスするたびに毎回別のページにランダムにリダイレクトする方法について説明します。

WordPress ページランダム分岐処理:速度を低下させることなくA / Bをテストする

WordPress ページランダム分岐処理:キャッシュを維持して速度を低下させることなくA / Bをテストする

WordPressでランダムリダイレクトが必要な理由

ホームページを運営していると、1つのURLを複数のページに分散させる必要がある場合がよくあります。具体的には、特定のページを訪問する訪問者をランダムに複数のページのいずれかにリダイレクトすることを検討することができます。

  • A / Bテストの実装:
    • ランディングページの効果を比較するために、同じトラフィックを複数のバージョンのページに均等に分散したい場合。どのデザイン、コピー、レイアウトがより高いコンバージョン率を示すかをテストするときは、ランダムなリダイレクト方法を利用できます。
  • トラフィック分散:
    • 特定のページにトラフィックが集中しているときに、同様のコンテンツの複数のページに訪問者を分散させることで、サーバーの負荷を軽減できます。
  • ユーザーエクスペリエンス(UX)の多様化:
    • 同じトピックに異なるアプローチのコンテンツを提供することで、ユーザーごとに異なる経験を提供することが可能です。

一般的なPHPリダイレクトの問題

WordPressから特定のページにアクセスする訪問者を複数のページにランダムにリダイレクトしたい場合は、次のPHPコードを使用してサーバーサイドリダイレクトを試すことができます。

add_action('template_redirect', function() {
    if (is_page(12345)) {
        $urls = [
            'https://example.com/page-a/',
            'https://example.com/page-b/',
            'https://example.com/page-c/'
        ];
        wp_redirect($urls[array_rand($urls)], 301);
        exit;
    }
});

キャッシュの問題

この方法は、管理者としてログインしてテストするときはうまく機能しますが、キャッシュプラグインがインストールされている場合、またはサーバーキャッシュが適用されている場合は、キャッシュのため(キャッシュが削除されるまで)同じページにリダイレクトできます。

WordPress キャッシュプラグイン(LiteSpeedキャッシュ、Breeze、WP Super Cache、W3 Total Cache、WP Rocketなど)またはCDN(CloudFlare、CloudFrontなど)がリダイレクト応答をキャッシュすると、すべての訪問者が同じページにのみリダイレクトできます。

キャッシュ除外設定時の問題

私は上記のコードを適用して適用するので、キャッシュプラグインのため、訪問時に同じページにリダイレクトされるという問題が発生しました。

キャッシュの問題が疑われ、キャッシュ除外設定を試しました。

LiteSpeed Cacheプラグインを使用する場合 設定 » LiteSpeed Cache » 除外タブに移動し、 設定を除くサーページのURLを入力してキャッシュにならないように指定できます。

LiteSpeed Cache キャッシュ除外設定

クラウドウェイズのBreezeキャッシュプラグインを使用する場合 設定 » Breeze » Advanced Options (詳細オプション) » Never Cache URL(s)でページURLを入力して、キャッシュ除外リクエストを行うことができます。

クラウドウェイズBreezeキャッシュプラグインキャッシュ除外設定

他のキャッシュプラグを使用しても同様の方法で可能です。

👉参考にキャッシュプラグインを使用する場合は、上記のようにサイトマップ、フィード、ads.txt、robots.txtファイルに対してキャッシュ除外設定を行うことをお勧めします。

そのページをキャッシュから除外すると、ランダムなリダイレクトは機能しますが、毎回サーバー上でPHPを実行する必要があるため、ページの読み込み速度が大幅に遅くなります。特にトラフィックの多いサイトでは、サーバーの負荷も増加します。

私は特に訪問者数が多く、多くの機能のためにサイトの最適化がうまくできず、速度がやや遅いサイトに上記のようなコードを適用して、そのランディングページに対してキャッシュ除外設定をするので、ページを訪問するたびに若干の遅延が体感されるほどでした。

サイトが軽くて高速で、キャッシュプラグインを有効にしなくてもページの読み込みが大丈夫なら、この状態で利用できるはずです。ただし、キャッシュが適用されない場合、ページの読み込み速度が遅くなると直帰率が増加し、SEOの問題が発生する可能性があります。

解決策:JavaScriptクライアントサイドリダイレクト(キャッシュ除外設定をしない)

この問題を解決する効果的な方法の1つは、JavaScriptを使用したクライアントサイドリダイレクトです。サーバーは常に同じHTMLを返し(キャッシュ可能)、ブラウザでJavaScriptを実行してランダムにURLを選択してリダイレクトするようにします。

👉この方法を使用する場合は、キャッシュプラグインの設定でそのページのキャッシュ除外設定を行った場合は、キャッシュ除外セクションでそのページのURLを削除してください。

この方法の利点

  1. キャッシュの維持:サーバーが返すHTMLは常に同じであるため、キャッシュプラグインとCDNは正常に動作します。
  2. 高速:ページがキャッシュされるため、サーバーの処理時間が最小限に抑えられ、Time To First Byte(TTFB)が高速です。
  3. ランダム機能動作:JavaScriptのMath.random()関数はブラウザで実行されるため、ユーザーがそのページにアクセスするたびに新しいランダム選択が行われます。
  4. サーバー負荷の低減:PHPを実行せずに静的ファイルのみを提供するため、サーバーリソースを節約できます。

例コード:

add_action('template_redirect', function() {
	if (is_page(1234)) {
		?>
		<!DOCTYPE html>
		<html>
		<head>
			<meta charset="UTF-8">
			<title>Redirecting...</title>
			<script>
				(function() {
					var urls = [
						'https://example.co.kr/page-a/',
						'https://example.co.kr/page-b/',
						'https://example.co.kr/page-c/'
					];
					var randomUrl = urls[Math.floor(Math.random() * urls.length)];
					window.location.replace(randomUrl);
				})();
			</script>
		</head>
		<body></body>
		</html>
		<?php
		exit;
	}
}, 1);

コードの説明

  • add_action('template_redirect', …): WordPress テンプレートが読み込まれる前に実行
  • 優先順位1: 他のプラグインの前に実行するように設定
  • is_page(1234): 特定のページにのみ適用されるようにページIDをチェックする
  • 即時実行関数: (function() { … })() でページを読み込むと同時に実行
  • Math.random(): ブラウザでランダム数を生成する
  • window.location.replace(): 履歴に残らずにリダイレクト(戻るボタンの問題を防ぐ)

上記のコード チャイルドテーマの関数ファイル(functions.php)に追加すると、テーマが更新されてもコードが保持されます。

FTP / SFTPにアクセスできない場合、またはFTPを使用するのが難しい場合は、WPCodeなどのプラグインを使用してPHPコードスニペットを追加できます。 WPCodeプラグインにPHPコードを追加する方法については、次の記事を参照してください。加入型 WordPress(WordPressドットコム)を参考に説明しましたが、設置型 WordPressでも同様に適用が可能です。

上記のコードを追加したら、必要に応じてうまく機能するかどうかをテストしてください。コードを追加してキャッシュプラグインのキャッシュを消去してから(キャッシュが積み重ねられるように)しばらく待ってからテストしてみると、ページの読み込み速度を低下させることなくうまく機能します。 (ただし、ログイン状態ではキャッシュプラグインは通常動作しないため、ページの読み込みが遅くなることがあります。)

最後に、

以上で WordPressでキャッシュを維持し、ページの読み込み速度を低下させることなくランダムにリダイレクトする方法について説明しました。

検索エンジンボットはJavaScriptを実行しますが、ランダムリダイレクトページが検索結果に公開されることは望ましくないので、ランディングページにnoindexメタタグを追加することを検討してください。 Rank MathやYoast SEOをインストールした場合、該当ページ編集画面でnoindex設定が可能です。

参照

コメントを残す

コメントを残す