Cara melindungi halaman dengan otentikasi ganda: kata sandi + email (di bidang khusus)

8

Saya ingin memperluas perlindungan kata sandi WordPress dari posting dengan menambahkan bidang input tambahan untuk email pengguna.

Jadi, untuk melihat konten, pengguna harus mengetahui kata sandi dan email yang sebelumnya diberikan yang disimpan di bidang meta khusus dari pos yang dilindungi.

Saya mencoba mencari pengait yang bagus untuk memeriksa bidang tambahan itu tetapi tidak berhasil. Bisakah Anda memberi saya beberapa ide bagaimana membuatnya? Saya tidak ingin membuat akun pengguna untuk fitur semacam ini.

Tempat tidur
sumber

Jawaban:

7

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:

  1. buka halaman posting
  2. panggil the_content ()
  3. periksa cookie
  4. jika tidak valid tunjukkan formulir kata sandi
  5. kirim formulir ke wp_login.php
  6. wp_login.php
  7. atur cookie berdasarkan pwd yang dikirimkan dan arahkan ke halaman posting
  8. 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_contentfungsi 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:

Bidang khusus untuk memungkinkan perlindungan pos email


proteksi pos melalui kata sandi


Hasil (TwentyThirteen tanpa gaya tambahan):

Hasilkan di TwentyThirteen tanpa gaya tambahan

gmazzap
sumber