如果在 WooCommerce 中选中了结帐自定义复选框,则更改用户角色
Change user role if checkout custom checkbox is checked in WooCommerce
我正在尝试将自定义功能添加到我的子主题 functions.php 文件中,其中一个复选框被添加到结帐页面上的帐单详细信息表单的底部。
此复选框询问客户是否愿意成为批发客户。
function customise_checkout_field_with_wholesale_option($checkout) {
echo '<div id="wholesale_checkbox_wrap">';
woocommerce_form_field('wholesale_checkbox', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('Would you like to apply for a wholesale account?'),
'placeholder' => __('wholesale'),
'required' => false,
'value' => true
), $checkout->get_value('wholesale_checkbox'));
echo '</div>';
}
这工作正常,但是我在接下来的部分遇到了问题..
我希望客户用户角色保存为 "wholesale_customer" 而不是 "customer" 如果他们选中复选框。
add_action('woocommerce_after_checkout_billing_form', 'customise_checkout_field_with_wholesale_option');
function wholesale_customer( $order_id ) {
$order = new WC_Order( $order_id );
if (isset($_POST['wholesale_checkbox'])) {
if ($order->user_id > 0) {
$user = new WP_User($order->user_id);
// Remove role
$user->remove_role('customer');
// Add role
$user->add_role('wholesale_customer');
}
}
}
add_action( 'woocommerce_thankyou', 'wholesale_customer' );
当我删除 wholesale_checkbox if 语句时,上述功能通过将客户保存为 "wholesale_customer" 来实现。但是如果包含 if 语句,它总是将角色保存为 "customer".
我哪里错了?干杯
正确的做法是:
add_action( 'woocommerce_after_order_notes', 'custom_checkout_field_with_wholesale_option' );
function custom_checkout_field_with_wholesale_option( $checkout ) {
if( current_user_can( 'wholesale_customer' ) ) return; // exit if it is "wholesale customer"
echo '<div id="wholesale_checkbox_wrap">';
woocommerce_form_field('wholesale_checkbox', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('Would you like to apply for a wholesale account?'),
'placeholder' => __('wholesale'),
'required' => false,
'value' => true
), '');
echo '</div>';
}
// Conditionally change customer user role
add_action( 'woocommerce_checkout_update_order_meta', 'wholesale_option_update_user_meta' );
function wholesale_option_update_user_meta( $order_id ) {
if ( isset($_POST['wholesale_checkbox']) ) {
$user_id = get_post_meta( $order_id, '_customer_user', true ); // Get user ID
if( $user_id > 0 ){
$user = new WP_User($user_id);
$user->remove_role('customer');
$user->add_role('wholesale_customer');
}
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。
我正在尝试将自定义功能添加到我的子主题 functions.php 文件中,其中一个复选框被添加到结帐页面上的帐单详细信息表单的底部。
此复选框询问客户是否愿意成为批发客户。
function customise_checkout_field_with_wholesale_option($checkout) {
echo '<div id="wholesale_checkbox_wrap">';
woocommerce_form_field('wholesale_checkbox', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('Would you like to apply for a wholesale account?'),
'placeholder' => __('wholesale'),
'required' => false,
'value' => true
), $checkout->get_value('wholesale_checkbox'));
echo '</div>';
}
这工作正常,但是我在接下来的部分遇到了问题..
我希望客户用户角色保存为 "wholesale_customer" 而不是 "customer" 如果他们选中复选框。
add_action('woocommerce_after_checkout_billing_form', 'customise_checkout_field_with_wholesale_option');
function wholesale_customer( $order_id ) {
$order = new WC_Order( $order_id );
if (isset($_POST['wholesale_checkbox'])) {
if ($order->user_id > 0) {
$user = new WP_User($order->user_id);
// Remove role
$user->remove_role('customer');
// Add role
$user->add_role('wholesale_customer');
}
}
}
add_action( 'woocommerce_thankyou', 'wholesale_customer' );
当我删除 wholesale_checkbox if 语句时,上述功能通过将客户保存为 "wholesale_customer" 来实现。但是如果包含 if 语句,它总是将角色保存为 "customer".
我哪里错了?干杯
正确的做法是:
add_action( 'woocommerce_after_order_notes', 'custom_checkout_field_with_wholesale_option' );
function custom_checkout_field_with_wholesale_option( $checkout ) {
if( current_user_can( 'wholesale_customer' ) ) return; // exit if it is "wholesale customer"
echo '<div id="wholesale_checkbox_wrap">';
woocommerce_form_field('wholesale_checkbox', array(
'type' => 'checkbox',
'class' => array('input-checkbox'),
'label' => __('Would you like to apply for a wholesale account?'),
'placeholder' => __('wholesale'),
'required' => false,
'value' => true
), '');
echo '</div>';
}
// Conditionally change customer user role
add_action( 'woocommerce_checkout_update_order_meta', 'wholesale_option_update_user_meta' );
function wholesale_option_update_user_meta( $order_id ) {
if ( isset($_POST['wholesale_checkbox']) ) {
$user_id = get_post_meta( $order_id, '_customer_user', true ); // Get user ID
if( $user_id > 0 ){
$user = new WP_User($user_id);
$user->remove_role('customer');
$user->add_role('wholesale_customer');
}
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。