问题描述
我有一家 WooCommerce 商店,客户可以在那里以客人的身份结账.我现在想销售一些虚拟产品,在这种情况下,我想自动创建一个帐户.
I have a WooCommerce shop where customers checkout as guests. I now want to sell a couple of virtual products and in that case I want to auto create an account.
所以我有两个工作代码片段.
So I have two working code snippets.
- 用于检查购物车中的产品是否属于特定类别(在线)
- 通过访客结帐自动创建帐户.
但我不知道如何将这两者结合起来使它们协同工作.或者这是一个更好的解决方案?有什么想法吗?
But I can't figure out how to combine these two so they work together. Or is it a better solution for this? Any ideas?
这是我开始使用的两个代码片段,然后尝试合并为一个函数.
Here is the two code snippets I started with and then tried to combine into one function.
来源:使用 WooCommerce 检查购物车项目中的产品类别
add_action('woocommerce_before_cart', 'action_before_cart');
function action_before_cart() {
$categories = array('online');
$has_category = false;
// Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
// Check for product categories
if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
$has_category = true;
break;
}
}
// Testing output (display a notice)
if ( $has_category ) {
wc_print_notice( sprintf( 'Product category "%s" is in cart!', reset($categories)), 'notice' );
}
}
来源:在 Woocommerce 中以编程方式发送重置密码电子邮件通知
function wc_register_guests( $order_id ) {
// get all the order data
$order = new WC_Order($order_id);
//get the user email from the order
$order_email = $order->billing_email;
// check if there are any users with the billing email as user or email
$email = email_exists( $order_email );
$user = username_exists( $order_email );
// if the UID is null, then it's a guest checkout
if( $user == false && $email == false ){
// random password with 12 chars
$random_password = wp_generate_password();
// create new user with email as username & newly created pw
$user_id = wp_create_user( $order_email, $random_password, $order_email );
//WC guest customer identification
update_user_meta( $user_id, 'guest', 'yes' );
//user's billing data
update_user_meta( $user_id, 'billing_address_1', $order->billing_address_1 );
update_user_meta( $user_id, 'billing_address_2', $order->billing_address_2 );
update_user_meta( $user_id, 'billing_city', $order->billing_city );
update_user_meta( $user_id, 'billing_company', $order->billing_company );
update_user_meta( $user_id, 'billing_country', $order->billing_country );
update_user_meta( $user_id, 'billing_email', $order->billing_email );
update_user_meta( $user_id, 'billing_first_name', $order->billing_first_name );
update_user_meta( $user_id, 'billing_last_name', $order->billing_last_name );
update_user_meta( $user_id, 'billing_phone', $order->billing_phone );
update_user_meta( $user_id, 'billing_postcode', $order->billing_postcode );
update_user_meta( $user_id, 'billing_state', $order->billing_state );
// user's shipping data
update_user_meta( $user_id, 'shipping_address_1', $order->shipping_address_1 );
update_user_meta( $user_id, 'shipping_address_2', $order->shipping_address_2 );
update_user_meta( $user_id, 'shipping_city', $order->shipping_city );
update_user_meta( $user_id, 'shipping_company', $order->shipping_company );
update_user_meta( $user_id, 'shipping_country', $order->shipping_country );
update_user_meta( $user_id, 'shipping_first_name', $order->shipping_first_name );
update_user_meta( $user_id, 'shipping_last_name', $order->shipping_last_name );
update_user_meta( $user_id, 'shipping_method', $order->shipping_method );
update_user_meta( $user_id, 'shipping_postcode', $order->shipping_postcode );
update_user_meta( $user_id, 'shipping_state', $order->shipping_state );
// link past orders to this newly created customer
wc_update_new_customer_past_orders( $user_id );
}
}
//add this newly created function to the thank you page
add_action( 'woocommerce_thankyou', 'wc_register_guests', 10, 1 );
推荐答案
我不会自动创建帐户.我会确保只要没有帐户就不能下订单.(如果该特定产品出现在购物车中).
I would not automatically create an account. I would ensure that the order cannot be placed as long as one does not have an account. (If that particular product is present in the shopping cart).
WooCommerce 中已经提供了创建帐户和相关操作(例如电子邮件等).
The creation of an account and associated actions such as emails, etc.. are already provided in WooCommerce.
否则您将不得不为它编写额外的代码,您很快就会注意到总是缺少一些选项(例如发送带有用户密码的电子邮件),需要您编写更多的额外代码.简而言之,尽可能简单.
Otherwise you will have to write extra code for it and you will soon notice that there is always some option missing (such as sending an email with the user password) that requires you to write some more extra code. In short, keep it as simple as possible.
但是因为您的问题是关于自己创建帐户,您可以使用以下代码来实现
But because your question was about creating an account yourself, you can do this with the following code
- 通过代码中添加的注释标签进行说明
- wp_insert_user() - 将用户插入数据库
- Explanation via comment tags added in the code
- wp_insert_user() - Insert a user into the database
function wc_register_guests( $order_id ) {
// Determines whether the current visitor is a logged in user.
if( is_user_logged_in() ) return;
// Get $order object
$order = wc_get_order( $order_id );
// Get the user email from the order
$order_email = $order->billing_email;
// Check if there are any users with the billing email as user or email
$email = email_exists( $order_email );
$user = username_exists( $order_email );
// If the UID is null, then it's a guest checkout (new user)
if( $user == false && $email == false ) {
// Check on category ( multiple categories can be entered, separated by a comma )
$categories = array( 'online', 'categorie-1' );
// Flag
$has_category = false;
// Loop through order items
foreach ( $order->get_items() as $item_key => $item ) {
if ( has_term( $categories, 'product_cat', $item['product_id'] ) ) {
$has_category = true;
break;
}
}
// True
if ( $has_category ) {
// Random password with 12 chars
$random_password = wp_generate_password();
// Firstname
$first_name = $order->get_billing_first_name();
// Lastname
$last_name = $order->get_billing_last_name();
// Role
$role = 'customer';
// Create new user with email as username, newly created password and userrole
$user_id = wp_insert_user(
array(
'user_email' => $order_email,
'user_login' => $order_email,
'user_pass' => $random_password,
'first_name' => $first_name,
'last_name' => $last_name,
'role' => $role,
)
);
// (Optional) WC guest customer identification
update_user_meta( $user_id, 'guest', 'yes' );
// User's billing data
update_user_meta( $user_id, 'billing_address_1', $order->billing_address_1 );
update_user_meta( $user_id, 'billing_address_2', $order->billing_address_2 );
update_user_meta( $user_id, 'billing_city', $order->billing_city );
update_user_meta( $user_id, 'billing_company', $order->billing_company );
update_user_meta( $user_id, 'billing_country', $order->billing_country );
update_user_meta( $user_id, 'billing_email', $order->billing_email );
update_user_meta( $user_id, 'billing_first_name', $order->billing_first_name );
update_user_meta( $user_id, 'billing_last_name', $order->billing_last_name );
update_user_meta( $user_id, 'billing_phone', $order->billing_phone );
update_user_meta( $user_id, 'billing_postcode', $order->billing_postcode );
update_user_meta( $user_id, 'billing_state', $order->billing_state );
// User's shipping data
update_user_meta( $user_id, 'shipping_address_1', $order->shipping_address_1 );
update_user_meta( $user_id, 'shipping_address_2', $order->shipping_address_2 );
update_user_meta( $user_id, 'shipping_city', $order->shipping_city );
update_user_meta( $user_id, 'shipping_company', $order->shipping_company );
update_user_meta( $user_id, 'shipping_country', $order->shipping_country );
update_user_meta( $user_id, 'shipping_first_name', $order->shipping_first_name );
update_user_meta( $user_id, 'shipping_last_name', $order->shipping_last_name );
update_user_meta( $user_id, 'shipping_method', $order->shipping_method );
update_user_meta( $user_id, 'shipping_postcode', $order->shipping_postcode );
update_user_meta( $user_id, 'shipping_state', $order->shipping_state );
// Link past orders to this newly created customer
wc_update_new_customer_past_orders( $user_id );
}
}
}
add_action( 'woocommerce_thankyou', 'wc_register_guests', 10, 1 );
这篇关于如果订单中的产品属于 WooCommerce 中的某个类别,如何自动创建帐户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!