首页 > 解决方案 > WooCommerce:“此密钥无效......”错误

问题描述

我在我的WooCommerce网站上创建了一个自定义重置密码页面。重置页面以前是/my-account/lost-password/,但我的自定义页面是/reset-password/

在我的主题中,我复制了 WooCommerce customer-reset-password.php,因此我可以自定义电子邮件中的 URL 以指向我的新页面。电子邮件中的链接如下所示:

<a class="link" href="<?php echo esc_url( add_query_arg( array( 'key' => $reset_key, 'id' => $user_id ), home_url()." /reset-password/ " ) ); ?>">
  <?php // phpcs:ignore ?>
  <?php esc_html_e( 'Click here to reset your password', 'woocommerce' ); ?>
</a>

现在,当我转到 时/lost-password/,输入我的电子邮件地址。我成功收到了一封重置电子邮件,其中包含指向正确页面的链接:/reset-password/?key=p5iemdCVtG4qkh5WQH8B&id=31

单击电子邮件中的链接后,我可以输入新密码并重新输入新密码(我使用 WooCommercereset_password_form短代码来显示表单)。

但是,在填写这些字段并单击提交时,我收到以下消息: This key is invalid or has already been used. Please reset your password again if needed.

我查看了现有的线程,即:

不确定如何进行?

我如何创建/添加重置密码表单:

  1. 在中注册了 WooCommerce 重置密码短代码functions.php

function wc_custom_reset_password_form( $atts ) {
  return wc_get_template( 'myaccount/form-reset-password.php', array( 'form' => 'reset_password' ) );
}
add_shortcode( 'reset_password_form', 'wc_custom_reset_password_form' );

  1. 将简码添加到我的模板中:

<?php echo do_shortcode( '[reset_password_form]' ); ?>

改变了customer-reset-password.php什么?

这是模板默认链接的内容:

<a class="link" href="<?php echo esc_url( add_query_arg( array( 'key' => $reset_key, 'id' => $user_id ), wc_get_endpoint_url( 'lost-password', '', wc_get_page_permalink( 'myaccount' ) ) ) ); ?>"><?php // phpcs:ignore ?>
  <?php esc_html_e( 'Click here to reset your password', 'woocommerce' ); ?>
</a>

这就是我将其更改为:

<a class="link" href="<?php echo esc_url( add_query_arg( array( 'key' => $reset_key, 'id' => $user_id ), home_url()." /reset-password/ " ) ); ?>">
  <?php // phpcs:ignore ?>
  <?php esc_html_e( 'Click here to reset your password', 'woocommerce' ); ?>
</a>

标签: phpwordpresswoocommerce

解决方案


它不起作用并给你一个错误的原因是你应该通过key并且当你将模板文件调用user loginform-reset-password.php你的简码中时你没有进入。

您只需添加'key' => $rp_key, 'login' => $rp_login.

您当前的代码是:

function wc_custom_reset_password_form( $atts ) {
  return wc_get_template( 'myaccount/form-reset-password.php', array( 'form' => 'reset_password' ) );
}
add_shortcode( 'reset_password_form', 'wc_custom_reset_password_form' );

完整代码:

function wc_custom_reset_password_form( $atts ) {
    $rp_key     = wp_unslash( $_GET['key'] );
    $user_id    = absint( $_GET['id'] );
    $userdata   = get_userdata( absint( $user_id ) );
    $rp_login   = $userdata ? $userdata->user_login : '';
    $user       = WC_Shortcode_My_Account::check_password_reset_key( $rp_key, $rp_login );  
    return wc_get_template( 'myaccount/form-reset-password.php', array( 'form' => 'reset_password', 'key' => $rp_key, 'login' => $rp_login ) );
}
add_shortcode( 'reset_password_form', 'wc_custom_reset_password_form' );

您可以将keyuser id(来自查询参数)的验证添加到此代码中。


推荐阅读