feat: add auto-register to CheckoutController for guest checkout
- When 'Auto-register customers as site members' is enabled - Creates WP user account with 'customer' role for guest checkouts - Links order to existing user if email already registered - Sets WooCommerce customer billing data on new account - Triggers woocommerce_created_customer action for email notification
This commit is contained in:
@@ -262,6 +262,60 @@ class CheckoutController {
|
|||||||
update_user_meta($user_id, 'billing_email', sanitize_email($billing['email']));
|
update_user_meta($user_id, 'billing_email', sanitize_email($billing['email']));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Guest checkout - check if auto-register is enabled
|
||||||
|
$customer_settings = \WooNooW\Compat\CustomerSettingsProvider::get_settings();
|
||||||
|
$auto_register = $customer_settings['auto_register_members'] ?? false;
|
||||||
|
|
||||||
|
if ($auto_register && !empty($payload['billing']['email'])) {
|
||||||
|
$email = sanitize_email($payload['billing']['email']);
|
||||||
|
|
||||||
|
// Check if user already exists
|
||||||
|
$existing_user = get_user_by('email', $email);
|
||||||
|
|
||||||
|
if ($existing_user) {
|
||||||
|
// User exists - link order to them
|
||||||
|
$order->set_customer_id($existing_user->ID);
|
||||||
|
} else {
|
||||||
|
// Create new user account
|
||||||
|
$password = wp_generate_password(12, true, true);
|
||||||
|
|
||||||
|
$userdata = [
|
||||||
|
'user_login' => $email,
|
||||||
|
'user_email' => $email,
|
||||||
|
'user_pass' => $password,
|
||||||
|
'first_name' => sanitize_text_field($payload['billing']['first_name'] ?? ''),
|
||||||
|
'last_name' => sanitize_text_field($payload['billing']['last_name'] ?? ''),
|
||||||
|
'display_name' => trim((sanitize_text_field($payload['billing']['first_name'] ?? '') . ' ' . sanitize_text_field($payload['billing']['last_name'] ?? ''))) ?: $email,
|
||||||
|
'role' => 'customer', // WooCommerce customer role
|
||||||
|
];
|
||||||
|
|
||||||
|
$new_user_id = wp_insert_user($userdata);
|
||||||
|
|
||||||
|
if (!is_wp_error($new_user_id)) {
|
||||||
|
// Link order to new user
|
||||||
|
$order->set_customer_id($new_user_id);
|
||||||
|
|
||||||
|
// Set WooCommerce customer billing data
|
||||||
|
$customer = new \WC_Customer($new_user_id);
|
||||||
|
|
||||||
|
if (!empty($payload['billing']['first_name'])) $customer->set_billing_first_name(sanitize_text_field($payload['billing']['first_name']));
|
||||||
|
if (!empty($payload['billing']['last_name'])) $customer->set_billing_last_name(sanitize_text_field($payload['billing']['last_name']));
|
||||||
|
if (!empty($payload['billing']['email'])) $customer->set_billing_email(sanitize_email($payload['billing']['email']));
|
||||||
|
if (!empty($payload['billing']['phone'])) $customer->set_billing_phone(sanitize_text_field($payload['billing']['phone']));
|
||||||
|
if (!empty($payload['billing']['address_1'])) $customer->set_billing_address_1(sanitize_text_field($payload['billing']['address_1']));
|
||||||
|
if (!empty($payload['billing']['city'])) $customer->set_billing_city(sanitize_text_field($payload['billing']['city']));
|
||||||
|
if (!empty($payload['billing']['state'])) $customer->set_billing_state(sanitize_text_field($payload['billing']['state']));
|
||||||
|
if (!empty($payload['billing']['postcode'])) $customer->set_billing_postcode(sanitize_text_field($payload['billing']['postcode']));
|
||||||
|
if (!empty($payload['billing']['country'])) $customer->set_billing_country(sanitize_text_field($payload['billing']['country']));
|
||||||
|
|
||||||
|
$customer->save();
|
||||||
|
|
||||||
|
// Send new account email (WooCommerce will handle this automatically via hook)
|
||||||
|
do_action('woocommerce_created_customer', $new_user_id, $userdata, $password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add items
|
// Add items
|
||||||
|
|||||||
Reference in New Issue
Block a user