Como proteger páginas com autenticação dupla: senha + email (no campo personalizado)

8

Gostaria de estender a proteção por senha das postagens do WordPress adicionando um campo de entrada extra para o email do usuário.

Portanto, para visualizar o conteúdo, o usuário precisará saber a senha e o e-mail fornecido anteriormente, armazenados no meta-campo personalizado da postagem protegida.

Eu estava tentando encontrar um bom gancho checando esse campo extra, mas sem sucesso. Você poderia me dar algumas idéias de como fazer isso? Não quero criar contas de usuário para esse tipo de recurso.

Abed
fonte

Respostas:

7

Quando você define uma postagem como protegida por senha, a proteção ocorre na get_the_content()função. Lá, o WordPress verifica se há um cookie de senha de postagem e, se não estiver definido, não é válido ou expirou, exibe o formulário de senha.

Este formulário de senha é enviado para wp-login.php, um cookie é definido de acordo com a senha gravada no formulário e a solicitação é redirecionada para a postagem novamente.

O processo pode ser descrito da seguinte maneira:

  1. ir para a página de postagem
  2. chame the_content ()
  3. verifique o cookie
  4. se não for válido, mostre o formulário da senha
  5. envie o formulário para wp_login.php
  6. wp_login.php
  7. defina o cookie com base na senha enviada e redirecione para a página de postagem
  8. comece novamente o formulário # 1

O que podemos fazer:

  • no ponto # 4, use o gancho 'the_password_form'para editar a saída do formulário, adicionando um campo para o email e um campo oculto com o ID da postagem (neste momento, estamos dentro da get_the_contentfunção para ter acesso à variável global da postagem)
  • Infelizmente, no ponto 3, não podemos alterar o resultado da verificação de cookies (ou pelo menos não podemos de uma maneira fácil e confiável). Mas no ponto 7, o WordPress tem um gancho de filtro que permite definir a expiração do cookie: se definirmos esse horário para um carimbo de data / hora anterior, o cookie não será definido (e, se existir, será excluído) e, portanto, a validação falhará. . Assim, podemos usar esse gancho para verificar o e-mail enviado por meio do formulário e, graças ao ID da postagem no campo oculto, podemos compará-lo com os e-mails da meta, se o e-mail não for fornecido ou estiver errado, retornaremos um carimbo de data / hora anterior.

Primeiro passo:

/**
 * Customize the form, adding a field for email and a hidden field with the post id
 */
add_filter( 'the_password_form', function( $output ) {

  unset( $GLOBALS['the_password_form'] );
  global $post;
  $submit = '<input type="submit" name="Submit" value="' . esc_attr__('Submit') . '" /></p>';
  $hidden = '<input type="hidden" name="email_res_postid" value="' . $post->ID . '">';
  $email = '</p><p><label for="email_res">' . __( 'Email:' );
  $email .= '<input name="email_res" id="email_res" type="text" size="20" /></label></p><p>';
  return str_replace( $submit, $hidden . $email . $submit, $output );

}, 0 );

E o segundo:

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

  $postid = filter_input( INPUT_POST, 'email_res_postid', FILTER_SANITIZE_NUMBER_INT );
  $email = filter_input( INPUT_POST, 'email_res', 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;
  }
  // get the allowed emails
  $allowed = array_filter( (array)get_post_meta( $postid, 'allow_email' ), function( $e ) {
    if ( filter_var( $e, FILTER_VALIDATE_EMAIL) ) return $e;
  });
  if ( ! empty( $allowed ) ) { // some emails are setted, let's check it
    // if the emails posted is good return the original expire time
    // otherwise  return past timestamp
    return in_array( $email, $allowed ) ? $valid : $expired;
  }
  // no emails are setted, return the original expire time
  return $valid;

}, 0 );

Acabamos.

Agora criar um post, salvar como protegido por senha e definir alguns e-mails permitidos em campos personalizados usando a chave 'allow_email'. Não há limite para o número de e-mails que você pode adicionar ...


Definições:

Campos personalizados para permitir a proteção de postagem de email


pós proteção via senha


Resultado (vinte e treze sem estilo adicional):

Resultado em TwentyThirteen sem estilo adicional

gmazzap
fonte