2022-11-23

パスワードで保護された投稿でパスワードが間違っている場合にメッセージを表示する

WordPress のパスワード保護された投稿でパスワードを間違えた場合にエラーメッセージが表示されないため、間違えたことに気づきにくいです。
そこで Stack Exchange を参考にエラーメッセージを表示するようにします。

Add error message on password protected page

function show_error_message( $form ) {
	// パスワード入力前かどうか postpass_XXXX が Cookie に保存されているかで確認。
	// Cookie がない場合はパスワード入力前なのでフォームをそのまま出力
	if ( ! isset ( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) ) {
		return $form;
	}
	// Cookie があり、パスワードが一致しない場合にメッセージを表示
	$error_message = '<p class="custom-password-message">パスワードが違います</p>';
	return $form . $error_message;
}
add_filter( 'the_password_form', 'show_error_message' );

これでエラーメッセージは表示されるようになりますが、他の保護された投稿でもエラーメッセージが表示されてしまいます。

そこで、現在のページでパスワード入力前かどうかをリファラーと投稿のパーマリンクを比較することで確認します。

function show_error_message( $form ) {
	// パスワード入力前かどうか postpass_XXXX が Cookie に保存されているかで確認。
	// Cookie がない場合はパスワード入力前なのでフォームをそのまま出力
	if ( ! isset ( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) ) {
		return $form;
	}

	// パスワード入力前かどうかリファラーと投稿のパーマリンクを比較して確認
	if ( wp_get_raw_referer() !== get_permalink() ) {
		return $form;
	}

	// Cookie があり、パスワードが一致しない場合にメッセージを表示
	$error_message = '<p class="custom-password-message">パスワードが違います</p>';
	return $form . $error_message;
}
add_filter( 'the_password_form', 'show_error_message' );

フォームをそのまま返すところはまとめてしまってもオッケーです。

	if ( ! isset ( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ) || wp_get_raw_referer() !== get_permalink() ) {
		return $form;
	}