如何在WooCommerce下订单后立即添加用户角色?



我使用下面的代码。我想在客户下订单后添加一个额外的用户角色,而不是默认的'customer'角色。

不幸的是,在下订单之后,这段代码没有添加用户角色。我错过了什么?

add_action( 'woocommerce_order_status_completed', 'change_role_on_purchase' );

function change_role_on_purchase( $order_id ) {

$order = new WC_Order( $order_id );
$items = $order->get_items();

$product_id = 73; // that's my product ID

foreach ( $items as $item ) {

if( $product_id == $item['product_id'] && $order->user_id ) {
$user = new WP_User( $order->user_id );

// Remove role
$user->remove_role( 'customer' ); 

// Add role
$user->add_role( 'premium' );
}
}

}

使用您当前的代码,或者更确切地说使用woocommerce_order_status_completed钩子,用户角色将仅在订单包含状态'完成'时被修改。但是,这种情况很少发生在客户下订单之后,订单状态更有可能是'pending'或'on-hold'

如果您想为现有用户添加一个用户角色,在下订单后立即添加,您可以通过woocommerce_thankyou钩子

执行此操作得到:

function action_woocommerce_thankyou( $order_id ) {     
// Get $order object
$order = wc_get_order( $order_id );

// Is a WC_Order
if ( is_a( $order, 'WC_Order' ) ) {
// Get user
$user = $order->get_user();
if ( is_a( $user, 'WP_User' ) ) {
// Add role
$user->add_role( 'premium' );
}
}
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );

function action_woocommerce_thankyou( $order_id ) {     
// Get $order object
$order = wc_get_order( $order_id );

// Is a WC_Order
if ( is_a( $order, 'WC_Order' ) ) {
// Get the WP_User Object
$user = $order->get_user();

// Check for "customer" user roles only
if ( is_a( $user, 'WP_User' ) && in_array( 'customer', (array) $user->roles ) ) {   
// Remove WooCommerce "customer" role (Optional)
$user->remove_role( 'customer' ); 

// Add role
$user->add_role( 'premium' );
}
}
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );

不为每个用户应用代码,而仅为具有特定用户角色的用户应用代码

最新更新