php wordpress password change – внесите меня в журнал!

Я пытаюсь создать простой скрипт смены пароля 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, то вы можете перенаправить его на домашнюю страницу снова

надеюсь, что это поможет вашей проблеме