Ketika Anda mengatur posting sebagai kata sandi yang dilindungi, perlindungan terjadi pada get_the_content()
fungsi. Di sana WordPress memeriksa cookie kata sandi pos, dan jika tidak disetel, tidak valid atau kedaluwarsa, tunjukkan formulir kata sandi.
Formulir kata sandi ini dikirim ke wp-login.php
, ada cookie disetel sesuai dengan kata sandi yang ditulis dalam formulir, maka permintaan diarahkan ke posting lagi.
Prosesnya dapat digambarkan seperti ini:
- buka halaman posting
- panggil the_content ()
- periksa cookie
- jika tidak valid tunjukkan formulir kata sandi
- kirim formulir ke wp_login.php
- wp_login.php
- atur cookie berdasarkan pwd yang dikirimkan dan arahkan ke halaman posting
- mulai lagi dari # 1
Apa yang bisa kita lakukan:
- pada titik # 4 gunakan kait
'the_password_form'
untuk mengedit output dari formulir, menambahkan bidang untuk email dan bidang tersembunyi dengan id pos (pada titik ini kami berada di dalam get_the_content
fungsi sehingga kami memiliki akses ke variabel pos global)
- Sayangnya pada poin # 3 di sana kita tidak dapat mengubah hasil pemeriksaan cookie (atau setidaknya kita tidak bisa dengan cara yang mudah dan dapat diandalkan). Tetapi pada titik # 7 WordPress memiliki kait filter yang memungkinkan untuk mengatur kadaluwarsa cookie: jika kita menyetel waktu ke stempel waktu yang lalu, maka cookie tidak akan disetel (dan jika adax itu akan dihapus) sehingga validasi akan gagal . Jadi kita dapat menggunakan pengait itu untuk memeriksa email yang dikirimkan melalui formulir dan berkat id pos di bidang tersembunyi kita dapat membandingkannya dengan email di meta, jika email tidak diberikan atau salah, kita mengembalikan stempel waktu yang lalu.
Langkah pertama:
/**
* 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 );
Dan yang kedua:
/**
* 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 );
Kita sudah selesai.
Sekarang buat posting, simpan sebagai dilindungi kata sandi dan atur beberapa email yang diizinkan di bidang khusus menggunakan tombol 'allow_email'
. Tidak ada batasan jumlah email yang dapat Anda tambahkan ...
Pengaturan:
Hasil (TwentyThirteen tanpa gaya tambahan):