【问题标题】:Get password value in WooCommerce checkout在 WooCommerce 结帐中获取密码值
【发布时间】:2020-06-16 11:09:31
【问题描述】:

有没有什么方法可以用任何钩子在 WooCommerce 结帐页面中检索干净的未哈希密码值?

我需要做的:在创建新的 WordPress 用户时,我需要创建一个 Firebase Auth 用户。如果这不可能,实现这一目标的最佳做法是什么?

我尝试了什么

首先我尝试在结帐时创建一个新的自定义字段并通过以下方式检索它:

function wh_CustomReadOrder($order_id)
{
    $order = wc_get_order($order_id);
    WC()->session = new WC_Session_Handler;

    /*
    * Next lets create a customer so we can access checkout fields
    * If you will check a constructor for WC_Customer class you will see
    * that if you will not provide user to create customer it will use some
    * default one. Magic.
    */
    WC()->customer = new WC_Customer;

    /*
    * Done. You can browse all chceckout fields (including custom ones)
    */
    ?>
  <script type="text/javascript">
      var order = <?php echo $order ?>;
      var checkout_fields = <?php echo json_encode(WC()->checkout->checkout_fields) ?>

      var email = order;
      console.log(checkout_fields);
  </script>
    <?php
}

add_action('woocommerce_thankyou', 'wh_CustomReadOrder');

我得到一个包含所有字段的数组,但我的自定义字段没有显示。但即便如此,WordPress 密码仍然会有所不同。最好的方法是简单地获取 WordPress 密码,然后在 Firebase 中创建用户。

你有什么想法吗?

【问题讨论】:

  • 为了清楚起见,您的意思是“结帐页面”?如果客户在那里创建一个新帐户?如果是这样的话?是的,那么就可以在那里截取未散列的密码
  • 是的,如果客户在结帐页面创建新帐户。 :)

标签: wordpress woocommerce


【解决方案1】:

正如您将在wc-user-functions.php 文件中看到的那样,在创建新帐户时会使用函数wc_create_new_customer


要检查结帐页面,您可以使用Conditional Tags

  • is_checkout() 在结帐页面返回 true。

因此,您可以使用woocommerce_created_customer 钩子拦截未散列的密码。 $unhashed_password 变量将包含未散列的密码。

function action_woocommerce_created_customer ( $customer_id, $new_customer_data, $password_generated ) {    
    // Returns true on the checkout page.
    if ( is_checkout() ) {
        $unhashed_password = $new_customer_data[user_pass];
    }
}
add_action( 'woocommerce_created_customer', 'action_woocommerce_created_customer', 10, 3 );

【讨论】:

  • 太棒了。像魅力一样工作:) 谢谢!
【解决方案2】:

我会考虑的一种方法是构建一个自定义网络表单来创建客户的帐户。这样您就可以随心所欲地操作数据。

例如用户提交表单时,取数据,在WC/WP中注册新用户,将数据发送到firebase,然后重定向。

缺点是您必须 100% 管理流程并处理任何可能的错误。

另一种方式:

使用默认的 WC 或 WP 帐户创建表单,但在提交时 -> 使用 Javascript 阻止默认,获取数据(是的,您可以在哈希之前访问密码),将其发送到 Firebase,然后,提交表单并让WC/WP 以正常方式将其保存在数据库中。

当我需要将该数据发送到电子邮件管理软件时,我就是这样做的。用户输入值,点击提交:我的代码阻止提交事件,将数据发送到我想要的位置,然后提交表单。

希望对你有帮助!

【讨论】:

  • 谢谢,好主意!但是,如果我尝试阻止默认 form.checkout.woocommerce-checkout 表单,则页面无论如何都会重定向到 Paypal.... 我的 console.log 正在显示。什么错误?
  • 我可能误解了你的位置。我的观点是在用户购买并即将创建帐户后,在帐户创建表单上执行 preventDefault。所以我不明白为什么你在提交表单后有 PayPal。
  • 但要直接回答您的问题,可能有一个脚本在您之前执行 preventDefault。我要做的是在表单上附加一个事件处理程序(附加到提交事件)。而且我会尽早完成(可能在其他脚本之前)。
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2020-06-01
  • 2017-06-16
  • 2019-04-24
  • 2018-02-06
相关资源
最近更新 更多