Extending password protected posts with name and email

If you want to add name email or any additional fields in addition to password for protected posts, see the steps below:

/****************** custom protected post form *****/
add_filter( 'the_password_form', 'custom_password_form' );
function custom_password_form() {
	global $post;
	$label = 'pwbox-'.( empty( $post->ID ) ? rand() : $post->ID );
	$a = '<div class="clearfix"><form id="password_form" class="protected-post-form" action="' . get_option('siteurl') . '/wp-login.php?action=postpass" method="post">
	<label for="phone_input">Name: </label><input type="text" name="phone_input" /><br />
	<label for="mail_input">Email: </label><input type="email" name="mail_input" />
	' . '<p>' . __( "Enter Password to view post:" ,'text-domain') . '</p>' . '
	<label for="' . $label . '">' . __( "Password:" ,'text-domain') . ' </label><div class="input-append"><input name="post_password" id="' . $label . '" type="password" size="20" /><input type="submit" name="Submit" class="btn btn-primary" value="' . esc_attr__( "Gönder",'text-domain' ) . '" /></div>
	<input type="hidden" name="res_postid" value="' . $post->ID . '">
	</form></div>
	';
	return $a;
}

Now to the validation

/**
 * Set the post password cookie expire time based on the email
 */
add_filter( 'post_password_expires', function( $valid ) {

  $postid = filter_input( INPUT_POST, 'res_postid', FILTER_SANITIZE_NUMBER_INT );
  $email = filter_input( INPUT_POST, 'mail_input', FILTER_SANITIZE_STRING );
  $name = filter_input( INPUT_POST, 'name_input', FILTER_SANITIZE_STRING );
  $subpw = filter_input( INPUT_POST, 'post_password', FILTER_SANITIZE_STRING );
  // a timestamp in the past
  $expired = time() - 10 * DAY_IN_SECONDS;
  if ( empty( $postid ) || ! is_numeric( $postid ) ) {
      // empty or bad post id, return past timestamp
      return $expired;
  }

  if ( empty($email) || ! filter_var($email, FILTER_VALIDATE_EMAIL) ) {
      // empty or bad email id, return past timestamp
      return $expired;
  }
  
  $the_post = get_post( $postid );
	$postpw = $the_post->post_password;
	if($postpw !== $subpw) return $expired;
//see below
  // pw_post_email_notify($name,$email);
  return $valid;

}, 0 );

What you want to do with the information (name, email) is up to you. I wanted to be notified who logged in to view the post so I wrote a email notification as follows:

function pw_post_email_notify($name= NULL,$email= NULL) {
	$to = get_bloginfo('admin_email');
	$blogname = get_bloginfo('blogname');
	$frommail = $to;
	
	if ( ! isset($email) ) return false;
	
	$headers = sprintf( "From: %s <%s>\r\n", $blogname, $frommail );
	$subject = "Someone has viewed the protected post";
	$msg = "Name: " .$name. " -  Email: ".$email;	
	$mail_result = wp_mail( $to, $subject, $msg, $headers );
}