Я пытаюсь создать простой скрипт смены пароля WordPress (собственный, основанный на плагине) – пароль успешно изменен, но он меня вытащил после завершения изменения! Ниже приведен код. Может ли кто-нибудь увидеть, где я выхожу из системы и как его предотвратить? Благодаря!
$update = $wpdb->query($wpdb->prepare("UPDATE {$wpdb->users} SET `user_pass` = %s WHERE `ID` = %d",array(wp_hash_password($_POST['admin_pass1']),$user_ID))); if(!is_wp_error($update)) { wp_cache_delete($user_ID,'users'); wp_cache_delete($user->user_login,'userlogins'); wp_logout(); if (wp_signon(array('user_login'=>$user->user_login,'user_password'=>$_POST['admin_pass1']),false)): wp_redirect(admin_url()); endif; ob_start(); }
После сброса пароля вы должны установить / сбросить файлы cookie ( http://codex.wordpress.org/Function_Reference/wp_set_auth_cookie )
как это
$update = $wpdb->query($wpdb->prepare("UPDATE {$wpdb->users} SET `user_pass` = %s WHERE `ID` = %d",array(wp_hash_password($_POST['admin_pass1']),$user_ID))); if(!is_wp_error($update)) { wp_cache_delete($user_ID,'users'); wp_cache_delete($user->user_login,'userlogins'); wp_logout(); if (wp_signon(array('user_login'=>$user->user_login,'user_password'=>$_POST['admin_pass1']),false)): wp_redirect(admin_url()); endif; ob_start(); }else{ wp_set_auth_cookie( $current_user_id, true); }
Чтобы сбросить пароль, вам лучше использовать функции wordpress, такие как wp_check_password и wp_set_password, из-за интеграции с другими приложениями / плагинами.
На самом деле это:
if(!is_wp_error($update)) { wp_cache_delete($user_ID,'users'); wp_cache_delete($user->user_login,'userlogins'); wp_logout(); if (wp_signon(array('user_login'=>$user->user_login,'user_password'=>$_POST['admin_pass1']),false)): wp_redirect(admin_url()); endif; ob_start(); }
означает, что если ошибок нет, будут выполняться следующие функции. Одной из этих функций является wp_logout()
которая всегда будет вызываться, если выполняется условный блок.
Если это не то, что вы хотите, то вы хотите рассмотреть возможность замены:
if(!is_wp_error($update))
с:
if(is_wp_error($update))
Вы можете попробовать под кодом. После смены пароля он не выйдет из системы.
$userdata['ID'] = 1; //admin user ID $userdata['user_pass'] = 'new_password'; wp_update_user( $userdata );
Наслаждаться 😉
Убедитесь, что код запущен до конца заголовков HTTP и начало обычного содержимого страницы. Вы не можете получить предупреждение, если вы слишком долго будете ждать в процессе создания страницы. Все будет просто терпеть неудачу, и вы будете таинственным образом выходить из системы (хотя wp_signon()
возвращает действительный объект WP_User
).
если вы все еще ищете ответ на эту тему :, я нашел решение!
Короче говоря, после того, как вы обновите пароль, очистите данные и выйдите из системы (как и вы)
wp_cache_delete($user_ID,'users'); wp_cache_delete($user->user_login,'userlogins'); wp_logout();
пользователь вышел из системы
тогда
выполните «перенаправление» на новую страницу для автоматического входа в систему. Поймайте вызов на эту страницу с помощью add_action( 'wp', 'auto_login' );
(мы должны это сделать, прежде чем что-либо будет отправлено через «заголовки»)
функция auto_login может обрабатывать ваш запрос для автоматического входа в систему данного пользователя (через параметры $ _GET)
Поэтому, когда я перенаправляюсь на новую страницу, я передаю два параметра user_id (пользователь для входа) секретный ключ (для обеспечения безопасности)
$key = password_hash('[some secret ]' . $user_id, PASSWORD_DEFAULT); wp_redirect( get_permalink( $to['fl_autologin'] ) . "/?p=" . urlencode( $key ) . "&z=" . $user_id ); exit;
то в функции auto_login я ищу эти два параметра, чтобы расшифровать секретный ключ, чтобы проверить, является ли это oke
if ( $_GET['z'] && password_verify( '[some secret]' . $_GET['z'], urldecode( $_GET['p'] ) )) {
если да, то войдите в систему с данным пользователем
$user = get_user_by( 'id', $_GET['z'] ); $user_id = $user->ID; wp_set_current_user( $user_id, $user->user_login ); wp_set_auth_cookie( $user_id ); do_action( 'wp_login', $user->user_login );
выполните еще несколько проверок безопасности, например, user_id должен быть действительным и т. д., если все oke, то вы можете перенаправить его на домашнюю страницу снова
надеюсь, что это поможет вашей проблеме