WordPress のメールフォームプラグイン Contact Form 7 では、送信完了メッセージが画面遷移なしで同一ページに表示されるのが標準の仕様です。簡単な送信完了メッセージの場合はそのままで構わないのですが、案件によっては送信完了ページ表示させるカスタマイズを加えることがよくあります。

多くのブログ等で紹介されているように、固定ページで送信完了ページを作成し、送信ボタンを押した際にこれに遷移させるというものですが、そのままでは送信完了ページに直アクセスで表示することができてしまいます。

例えば、アンケートフォームに回答を送信してもらったら、送信完了ページで資料をダウンロードできるというような用途の場合、送信完了ページへの直アクセスはできないようにしておく必要がありますし、サイト内検索や Google 検索等からもヒットしないようにしておく必要があります。そのような用途でなくても、直アクセスは避けたいものです。

まずは定番の送信完了ページへ遷移させるカスタマイズ。Contact Form 7 の wpcf7mailsent イベントを使って、JavaScript で送信完了ページにリダイレクトさせるというものですが、一つのサイトで複数のフォームを設置することも多々ありますので、共通の JavaScript を使いまわせるように次のようにしています。

前提として、フォームを表示するページの子ページとして、”thanks” というスラッグで送信完了ページを作成します。基本的に異なるフォームで共通の送信完了ページを表示することはないので、フォームページ毎に子ページとして送信完了ページを作成しています。

そして以下のような JavaScript を記述します。案件によってやり方はいろいろですが、下記は page.php に記述する場合のもので、現在のフォームの URL に ‘thanks/’ を追加した URL にリダイレクトさせるというものです。

<script>
<?php $location = get_the_permalink(); ?>
document.addEventListener( 'wpcf7mailsent', function( event ) {
	const responseOutput = event.target.querySelector('.wpcf7-response-output');
	if (responseOutput) {
		responseOutput.style.display = 'none';
	}
	location = '<?php echo $location. 'thanks/'; ?>';
}, false );
</script>

そして本題の送信完了ページに直アクセスさせない方法です。page.php の先頭に以下を記述し、フォームページからの遷移以外で送信完了ページにアクセスした場合は、親ページのフォームページにリダイレクトさせています。ただし、管理者として送信完了ページを確認する必要がありますので、管理画面にログイン中は直アクセスできます。

<?php
if ( is_page( 'thanks' ) ) {
	global $post;
	$parent = get_post( $post->post_parent );
	
	if ( $parent ) {
		$parent_slug = $parent->post_name;
		$referer = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '';
		
		if ( ! is_user_logged_in() && strpos( $referer, $parent_slug ) === false ) {
			wp_safe_redirect( get_permalink( $parent->ID ) );
			exit;
		}
		
	}
}
?>

あと、Google 等の検索エンジンに登録させない対策です。他ページからの直リンクがないので基本的に登録されないはずですが念の為。functions.php に以下を記述します。

add_filter( 'wp_robots', function( $robots ) {
	if ( is_page(array('thanks', '他に登録させないページがあればスラッグを記述')) ) {
		return [
			'noindex' => true,
			'nofollow' => true,
		];
	}
	return $robots;
});