Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 错误=WordPress自定义密码恢复页面的invalidkey_Php_Wordpress - Fatal编程技术网

Php 错误=WordPress自定义密码恢复页面的invalidkey

Php 错误=WordPress自定义密码恢复页面的invalidkey,php,wordpress,Php,Wordpress,WordPress v5.4.1,我有以下代码从自定义页面发送密码重置邮件 跟着那辆车走 用户收到密码重置电子邮件,单击链接时,会给出errors=invalidkey 我已尝试删除自定义$key函数以生成WordPress默认键。然后我将有密码重置页面,但任何操作都会显示错误=无效密钥为什么要重新生成$key?为什么不直接使用传递给回调函数的函数呢 但如果必须重新生成,则可以使用: $key=get\u password\u reset\u key($user\u data); 您的inval

WordPress v5.4.1,我有以下代码从自定义页面发送密码重置邮件

跟着那辆车走

用户收到密码重置电子邮件,单击链接时,会给出
errors=invalidkey


我已尝试删除自定义
$key
函数以生成WordPress默认键。然后我将有密码重置页面,但任何操作都会显示
错误=无效密钥

为什么要重新生成
$key
?为什么不直接使用传递给回调函数的函数呢

但如果必须重新生成,则可以使用:

$key=get\u password\u reset\u key($user\u data);

您的
invalidkey
错误的原因是您只是在创建随机密码并按原样使用它。要使其成为有效的重置键,需要对其进行哈希运算

参考:

所以如果你想使用你的方法,你只需要像这样散列你的密钥

// Custom message
function replace_retrieve_password_message($message, $key, $user_login, $user_data) {

    global $wpdb;
    global $wp_hasher;

    $key = $wpdb->get_var("SELECT user_activation_key FROM $wpdb->users WHERE user_login ='" . $user_login . "'");
    if (empty($key)) {
        //generate reset key
        $key = wp_generate_password(20, false);

        if ( empty( $wp_hasher ) ) {
            require_once ABSPATH . WPINC . '/class-phpass.php';
            $wp_hasher = new PasswordHash( 8, true );
        }

        $key = time() . ':' . $wp_hasher->HashPassword( $key );

        $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login));
    }
    // Create new message
    $msg = __('Hello!') . "\r\n\r\n";
    $msg .= sprintf(__('You asked us to reset your password for your account using the email address %s.'), $user_login) . "\r\n\r\n";
    $msg .= __("If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen.") . "\r\n\r\n";
    $msg .= __('To reset your password, visit the following address:') . "\r\n\r\n";
    $msg .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";
    $msg .= __('Thanks!') . "\r\n";

    return $msg;
}

add_filter('retrieve_password_message', 'replace_retrieve_password_message', 10, 4);
但我写这篇文章只是为了让你理解这个问题。我不推荐。

推荐方法:

正如另一个答案所建议的那样,正确的方法是跳过手动创建的所有密钥,并为此使用正确的函数,即
get\u password\u reset\u key()

// Custom message
function replace_retrieve_password_message($message, $key, $user_login, $user_data) {

    $key = get_password_reset_key( $user_data );

    // Create new message
    $msg = __('Hello!') . "\r\n\r\n";
    $msg .= sprintf(__('You asked us to reset your password for your account using the email address %s.'), $user_login) . "\r\n\r\n";
    $msg .= __("If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen.") . "\r\n\r\n";
    $msg .= __('To reset your password, visit the following address:') . "\r\n\r\n";
    $msg .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";
    $msg .= __('Thanks!') . "\r\n";

    return $msg;
}

add_filter('retrieve_password_message', 'replace_retrieve_password_message', 10, 4);

正如你所看到的,它更干净。最好在可用和适用的地方使用现有函数。

在您有“key=$key”的站点中,尝试这样做:“key={$key}”仍然有
errors=invalidkey
error第一种方法给了我直接的
errors=invalidkey
error。第二个
$key=get\u password\u reset\u key($user\u data)
将我带到密码重置页面,但是在输入密码后给出了
errors=invalidkey
error.@theKing,这件东西可能不是罪魁祸首。除此过滤器外,您正在使用的其他部件也可能存在问题
// Custom message
function replace_retrieve_password_message($message, $key, $user_login, $user_data) {

    $key = get_password_reset_key( $user_data );

    // Create new message
    $msg = __('Hello!') . "\r\n\r\n";
    $msg .= sprintf(__('You asked us to reset your password for your account using the email address %s.'), $user_login) . "\r\n\r\n";
    $msg .= __("If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen.") . "\r\n\r\n";
    $msg .= __('To reset your password, visit the following address:') . "\r\n\r\n";
    $msg .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";
    $msg .= __('Thanks!') . "\r\n";

    return $msg;
}

add_filter('retrieve_password_message', 'replace_retrieve_password_message', 10, 4);