php wordpress смена пароля - выход из системы! - PullRequest
4 голосов
/ 18 апреля 2011

Я пытаюсь создать простой скрипт для изменения пароля в 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();
}

Ответы [ 5 ]

3 голосов
/ 30 июня 2013

После сброса пароля вы должны установить / сбросить файлы 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 из-за интеграции сдругие приложения / плагины.

1 голос
/ 11 февраля 2016

Вы можете попробовать код ниже.После смены пароля он не выйдет из системы.

$userdata['ID'] = 1; //admin user ID
$userdata['user_pass'] = 'new_password';
wp_update_user( $userdata );

Наслаждайтесь;)

1 голос
/ 18 апреля 2011

На самом деле это:

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))
0 голосов
/ 17 декабря 2014

если вы все еще ищете ответ по этой теме: я нашел решение!

короче говоря, после обновления пароля очистите данные и выйдите из системы (как вы сделали)

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 я ищу эти два параметра расшифруйте секретный ключ, чтобы проверить, является ли это окей

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

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

0 голосов
/ 14 июня 2012

Убедитесь, что код выполняется до конца заголовков HTTP и начала содержимого обычной страницы.Вы можете не получить никакого предупреждения, если непреднамеренно подождете слишком долго в процессе генерации страницы.Все это просто молча провалится, и вы загадочно выйдете из системы (даже если wp_signon() вернет действительный WP_User объект).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...