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:
- ir para a página de postagem
- chame the_content ()
- verifique o cookie
- se não for válido, mostre o formulário da senha
- envie o formulário para wp_login.php
- wp_login.php
- defina o cookie com base na senha enviada e redirecione para a página de postagem
- 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_content
funçã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:
Resultado (vinte e treze sem estilo adicional):