password_reset doesnt work

时间:2019-03-31 作者:Kamran Asgari

我试图在密码重置后使用$\\u POST方法提交操作下面是代码

add_action( \'after_password_reset\', \'action_function\', 10, 2 );
function action_function( $user, $new_pass ){
    if (isset( $_POST[\'password_1\'] ) ) {
        update_user_meta($user->ID, \'user_pass2\', password_hash($_POST[\'password_1\'], PASSWORD_DEFAULT));
    }
}
但它不会被解雇

有小费吗?

还有reason 我需要另一个应用程序凭据使用的密码。例如,以下代码显示了我在profile\\u更新期间如何使用$\\u POST

function my_profile_update( $user_id ) {
    // password changed...
    if ( ! is_admin() && isset( $_POST[\'password_1\'] ) ) {
        update_user_meta($user_id, \'user_pass2\', password_hash($_POST[\'password_1\'], PASSWORD_DEFAULT));
        global $wpdb;
        global $current_user;
        $script_db = new wpdb(\'db\', \'pass\', \'user\', \'localhost\');
        get_currentuserinfo();
        $email = (string) $current_user->user_email;
        $password = (string)  get_user_meta( $current_user->ID, \'user_pass2\', true );;
        $query   = $script_db->prepare( "SELECT * FROM {$script_db->prefix}np_users WHERE email = %s", $email );
        $results = $script_db->get_results($query);
        if(count( $results ) > 0) {
            $id = $results[0]->id;
            $script_db->update(\'np_users\', array(
            \'password\' => $password
            ),array(\'id\'=>$id));
        }
    }

}
add_action( \'profile_update\', \'my_profile_update\' );

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

你不应该用这些钩子。如果你不想在其他应用程序中使用相同的密码,那么密码始终保持不变是至关重要的。

因此,最好的办法是确保它永远是真实的。怎样通过处理这些。

WordPress使用wp_set_password 每次更改密码时都会运行。里面没有钩子(https://core.trac.wordpress.org/browser/tags/5.1.1/src/wp-includes/pluggable.php#L0), 但是it\'s pluggable - 因此,您可以编写自己的版本。那么就这样做吧:

function wp_set_password( $password, $user_id ) {
    // Keep original WP code
    global $wpdb;

    $hash = wp_hash_password( $password );
    $wpdb->update(
        $wpdb->users,
        array(
            \'user_pass\'           => $hash,
            \'user_activation_key\' => \'\',
        ),
        array( \'ID\' => $user_id )
    );

    wp_cache_delete( $user_id, \'users\' );

    // and now add your own
    $script_db = new wpdb(\'db\', \'pass\', \'user\', \'localhost\');

    $custom_hash = password_hash( $password, PASSWORD_DEFAULT );
    $userdata = get_userdata( $user_id );

    $script_db->update(
        \'np_users\',
        array( \'password\' => $custom_hash ),
        array( \'email\' => $userdata->user_email )
    );
}
这样,密码将始终同步。(例如,如果管理员更改了用户的密码,您的代码将破坏密码)。

您也不必将第二个哈希存储为用户元。而且它执行的查询更少-您不必通过电子邮件选择用户,然后使用他的ID更新密码-您只需运行更新即可。

您所需要做的就是将该函数放入插件中。