Intereting Posts
Преимущества использования <link> вместо wp_enqueue_style ()? изменение статуса участника для отмены в woocommerce изменение URL-адреса кнопки регистрации в WPMU / Buddypress С каких причин можно условно добавлять действия? Советы по структуре плагина Как я могу скрыть заголовок раздела, если в пользовательских полях нет данных? Как я могу сделать мой CPT прочитанным на странице- * post-type * .php? Как организовать иерархическую структуру в пользовательском типе сообщений с таксономией (например, с категориями) WordPress ThickBox модальный в панели администратора продолжает загружать Вопрос о шаблоне страницы магазина Отдельная страница пользовательского типа сообщения, не отображающего содержание сообщения Как изменить .css-версию? проблемы с перенаправлением многостраничного текстового пресса и наличие разных файлов роботов Разница между do_action_ref_array () и do_action () Получение определенных значений сообщений другому div или модальному

Как защитить страницы с двойной аутентификацией: пароль + адрес электронной почты (в настраиваемом поле)

Я хотел бы расширить WordPress для защиты паролей сообщений, добавив дополнительное поле ввода для электронной почты пользователя.

Поэтому, чтобы увидеть контент, пользователь должен будет знать пароль и ранее заданный адрес электронной почты, который хранится в настраиваемом мета-поле защищенного сообщения.

Я пытался найти хороший крюк, проверяя это дополнительное поле, но без успеха. Не могли бы вы дать мне некоторые идеи, как это сделать? Я не хочу создавать учетные записи пользователей для этой функции.

Solutions Collecting From Web of "Как защитить страницы с двойной аутентификацией: пароль + адрес электронной почты (в настраиваемом поле)"

Когда вы устанавливаете почту как защищенную паролем, защита происходит в функции get_the_content() . Там WordPress проверяет наличие cookie паролей сообщений, а если не установлен, недействителен или истек, то отобразите форму пароля.

Эта форма пароля отправляется в wp-login.php , там cookie устанавливается в соответствии с паролем, написанным в форме, после чего запрос снова перенаправляется на сообщение.

Процесс можно описать так:

  1. перейти на страницу сообщений
  2. назовите the_content ()
  3. проверить файл cookie
  4. если не действительный, введите форму пароля
  5. отправить форму на wp_login.php
  6. wp_login.php
  7. установить cookie на основе pwd, отправленного и перенаправленного на страницу публикации
  8. начать снова форму # 1

Что мы можем сделать:

  • в пункте # 4 используйте 'the_password_form' для редактирования вывода формы, добавляя поле для электронной почты и скрытое поле с идентификатором сообщения (в этот момент мы находимся внутри функции get_the_content поэтому у нас есть доступ к глобальной переменной post)
  • К несчастью в пункте №3 мы не можем изменить результат проверки файлов cookie (или, по крайней мере, мы не можем легко и надежно). Но в пункте № 7 WordPress имеет крючок фильтра, который позволяет установить срок действия файла cookie: если мы установим это время на прошлую метку времени, cookie не будет установлен (и если existx будет удален), и поэтому проверка не удастся , Таким образом, мы можем использовать этот крючок, чтобы проверить электронную почту, отправленную через форму, и благодаря идентификатору сообщения в скрытом поле мы можем сравнить его с электронными письмами в мета, если сообщение si не указано или ошибочно, мы возвращаем прошлую метку времени.

Первый шаг:

 /** * 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 ); 

И второе:

 /** * 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 ); 

Мы сделали.

Теперь создайте сообщение, сохраните его как защищенный паролем и установите некоторые разрешенные электронные письма в настраиваемых полях, используя ключ 'allow_email' . Нет числа на число писем, которые вы можете добавить …


Настройки:

Пользовательские поля для защиты почты


защита почты через пароль


Результат (TwentyHirteen без дополнительного стиля):

Результат в TwentyThirteen без дополнительного стиля