Php 错误=WordPress自定义密码恢复页面的invalidkey
WordPress v5.4.1,我有以下代码从自定义页面发送密码重置邮件 跟着那辆车走 用户收到密码重置电子邮件,单击链接时,会给出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
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);