【问题标题】:WooCommerce: "This key is invalid ..." errorWooCommerce:“此密钥无效......”错误
【发布时间】:2021-10-14 19:16:30
【问题描述】:

我在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&amp;id=31

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

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

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

不确定如何进行?

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

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

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. 在我的模板中添加了短代码:

&lt;?php echo do_shortcode( '[reset_password_form]' ); ?&gt;

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>

【问题讨论】:

  • 问题您是否以请求重置密码的用户身份登录?
  • @CrisoforoGaspar - 我都尝试过,以用户身份和非登录用户身份登录并收到相同的消息。用户不需要登录,访问该页面的唯一方法是用户请求重置密码。澄清一下,流程是/forgot-password &gt; user receives email which has link to /reset-password page。我会假设 key 附加到查询字符串(woocommerce 的一部分将更新正确的用户密码。id 也附加到查询字符串,它具有它需要确定的所有详细信息要更新哪个用户。
  • 好的,我明白了,让我看看我是否可以调试这个错误从技术上讲,用户在请求新密码时没有登录。
  • 您是要在实时服务器或本地主机上执行此操作吗?还要确保您为您的网站使用任何缓存插件?
  • 这是 WP Engine 的常见问题,您需要从 WP Engine 缓存中排除页面。请联系他们的支持,他们会解决这个问题。

标签: php wordpress woocommerce


【解决方案1】:

它不起作用并给你一个错误的原因是你应该将 keyuser login 传递给 form-reset-password.php,而当你将模板文件调用到你的简码中时你没有这样做。

您只需添加'key' =&gt; $rp_key, 'login' =&gt; $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(来自查询参数)的验证添加到此代码中。

【讨论】:

    【解决方案2】:

    您可以尝试以下方法:

    您的自定义链接:

    <a class="link" href="<?php echo esc_url(add_query_arg(array('action' => 'rp','id' => $user_id), site_url('/')) ); ?>">
    

    现在您可以在网站的任何位置添加。

    在functions.php上添加以下代码

    if(isset($_REQUEST['action']) && $_REQUEST['action'] == 'rp') {
        $user_id   = isset($_REQUEST['id']) ? $_REQUEST['id'] : 0;
        $action    = $_REQUEST['action'];
    
        if($user_id ){
           $user_data = get_userdata( $user_id );
    
           $user_email = $user_data->user_email;
           $reset_key  = get_password_reset_key( $user_data );
    
           wp_redirect( site_url( 'wp-login.php' ) . '?action='. $action .'&key=' . $reset_key . '&login=' . $user_email );
          exit;
        }
     }
    

    点击链接后,输出为:

    【讨论】:

      猜你喜欢
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多