根据 WooCommerce 活动订阅更改用户角色
Change user role based on WooCommerce active subscription
我有一个 Woocommerce 商店,它有一个可变订阅和 3 种订阅变体:subscription-a、subscription-b 和 subscription-c。我还添加了 3 种新的用户角色类型:subscriber-a、subscriber-b 和 subscriber-c。
我正在尝试创建一个功能,当客户购买、升级或降级订阅并且订阅处于活动状态时,并行用户角色将分配给该客户。
例如:
如果客户购买 subscription-a,用户角色 subscriber-a 将在激活后分配。
如果客户从 subscription-b 升级到 subscription-c,一旦激活,用户角色将有机会从 subscriber-b 变为 subscriber-c。
我尝试了类似线程中提供的功能,但它对我不起作用:
function change_role_on_purchase( $order_id ) {
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_name = $item['name'];
$product_id = $item['product_id'];
$product_variation_id = $item['variation_id'];
if ( $order->user_id > 0 && $product_variation_id == '416' ) {
update_user_meta( $order->user_id, 'paying_customer', 1 );
$user = new WP_User( $order->user_id );
// Remove role
$user->remove_role( 'subscriber' );
// Add role
$user->add_role( 'subscriber-a' );
}
}
}
add_action( 'woocommerce_subscription_status_active', 'change_role_on_purchase' );
更新:
@LoicTheAztec 的解决方案效果很好。我现在正尝试在取消订阅时删除角色。这就是我得到的,不确定这是否是最优雅的方法,但它有效。
add_action('woocommerce_subscription_status_cancelled', 'cancelled_subscription_remove_role', 10, 1);
function cancelled_subscription_remove_role($subscription) {
$user_id = $subscription->get_user_id();
$user = new WP_User($user_id);
$user->remove_role('subscriber_a');
$user->remove_role('subscriber_b');
$user->remove_role('subscriber_c');
}
已更新 以处理切换订阅 (升级或降级订阅)
您可以尝试使用woocommerce_subscription_status_updated
相关hook.In下面的代码,您将为每个变体ID设置相关用户角色,设置数组(注释代码):
// Custom function for your settings - Variation id per user role
function variation_id_per_user_role_settings(){
// Settings: set the variation ID as key with the related user role as value
return array(
'417' => 'subscriber-a',
'418' => 'subscriber-b',
'419' => 'subscriber-c',
);
}
// Custom function that check item and change user role based on variation ID
function check_order_item_and_change_user_role( $item, $user, $settings ){
$product = $item->get_product(); // The product object
// Only for variation subscriptions
if( $product->is_type('subscription_variation') ) {
$variation_id = $item->get_variation_id(); // the variation ID
$user_role = $settings[$variation_id]; // The right user role for the current variation ID
// If current user role doesn't match with the right role
if( ! in_array( $user_role, $user->roles) ) {
// Remove "subscriber" user role (if it is set)
if( in_array('subscriber', $user->roles) ) {
$user->remove_role( 'subscriber' );
}
// Remove other user roles (if they are set)
foreach ( $settings as $key_id => $value_role ) {
if( in_array($value_role, $user->roles) && $user_role !== $value_role ) {
$user->remove_role( $value_role );
}
}
// Set the right user role (if it is not set yet)
$user->set_role( $user_role );
}
}
}
// On first purchase (if needed)
add_action( 'woocommerce_subscription_status_updated', 'active_subscription_change_user_role', 100, 3 );
function active_subscription_change_user_role( $subscription, $new_status, $old_status ) {
// When subscrition status is updated to "active"
if ( $new_status === 'active' ) {
// Get the WC_Order Object from subscription
$order = wc_get_order( $subscription->get_parent_id() );
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $subscription->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
}
// On switched purchased subscription
add_action( 'woocommerce_order_status_changed', 'switched_subscription_change_user_role_on_order_status_change', 100, 4 );
function switched_subscription_change_user_role_on_order_status_change( $order_id, $old_status, $new_status, $order ) {
// When order status is updated to 'processing' or 'completed' status
if ( in_array( $new_status, array('processing','completed') ) ) {
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $order->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。它可以工作。
或者您也可以尝试使用 woocommerce_subscription_status_active
挂钩:
// Custom function for your settings - Variation id per user role
function variation_id_per_user_role_settings(){
// Settings: set the variation ID as key with the related user role as value
return array(
'417' => 'subscriber-a',
'418' => 'subscriber-b',
'419' => 'subscriber-c',
);
}
// Custom function that check item and change user role based on variation ID
function check_order_item_and_change_user_role( $item, $user, $settings ){
$product = $item->get_product(); // The product object
// Only for variation subscriptions
if( $product->is_type('subscription_variation') ) {
$variation_id = $item->get_variation_id(); // the variation ID
$user_role = $settings[$variation_id]; // The right user role for the current variation ID
// If current user role doesn't match with the right role
if( ! in_array( $user_role, $user->roles) ) {
// Remove "subscriber" user role (if it is set)
if( in_array('subscriber', $user->roles) ) {
$user->remove_role( 'subscriber' );
}
// Remove other user roles (if they are set)
foreach ( $settings as $key_id => $value_role ) {
if( in_array($value_role, $user->roles) && $user_role !== $value_role ) {
$user->remove_role( $value_role );
}
}
// Set the right user role (if it is not set yet)
$user->set_role( $user_role );
}
}
}
// On first purchase (if needed)
add_action( 'woocommerce_subscription_status_active', 'active_subscription_change_user_role', 100 );
function active_subscription_change_user_role( $subscription ) {
// Get the WC_Order Object from subscription
$order = wc_get_order( $subscription->get_parent_id() );
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $subscription->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
// On switched purchased subscription
add_action( 'woocommerce_order_status_changed', 'switched_subscription_change_user_role_on_order_status_change', 100, 4 );
function switched_subscription_change_user_role_on_order_status_change( $order_id, $old_status, $new_status, $order ) {
// When order status is updated to 'processing' or 'completed' status
if ( in_array( $new_status, array('processing','completed') ) ) {
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $order->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。它应该有效。
位更新了来自 LoicTheAztec 的代码。可以在订阅中使用不同的产品。
<?php
// Custom function for your settings - Variation id per user role
function variation_id_per_user_role_settings()
{
// Settings: set the variation ID as key with the related user role as value
return array(
//monthly subscriptions
'530' => 'subscriber',
'740' => 'subscriber-extended',
'741' => 'subscriber-advanced',
//now to the yearly
'536' => 'subscriber',
'739' => 'subscriber-extended',
'738' => 'subscriber-advanced',
);
}
// Custom function that check item and change user role based on variation ID
function check_order_item_and_change_user_role($item, $user, $settings)
{
$product = $item->get_product(); // The product object
// Only for variation subscriptions
$variation_id = $item['product_id']; // the variation ID
$user_role = $settings[$variation_id]; // The right user role for the current variation ID
// If current user role doesn't match with the right role
if (!in_array($user_role, $user->roles)) {
// Remove "subscriber" user role (if it is set)
if (in_array('subscriber', $user->roles)) {
$user->remove_role('subscriber');
}
// Remove other user roles (if they are set)
foreach ($settings as $key_id => $value_role) {
if (in_array($value_role, $user->roles) && $user_role !== $value_role) {
$user->remove_role($value_role);
}
}
// Set the right user role (if it is not set yet)
$user->set_role($user_role);
}
}
// On first purchase (if needed)
add_action('woocommerce_subscription_status_updated', 'active_subscription_change_user_role', 100, 3);
function active_subscription_change_user_role($subscription, $new_status, $old_status)
{
// When subscrition status is updated to "active"
if ($new_status === 'active') {
// Get the WC_Order Object from subscription
$order = wc_get_order($subscription->get_parent_id());
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if (is_a($user, 'WP_User') && $user->ID > 0) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ($subscription->get_items() as $item) {
check_order_item_and_change_user_role($item, $user, $settings);
}
}
}
}
// On switched purchased subscription
add_action('woocommerce_order_status_changed', 'switched_subscription_change_user_role_on_order_status_change', 100, 4);
function switched_subscription_change_user_role_on_order_status_change($order_id, $old_status, $new_status, $order)
{
// When order status is updated to 'processing' or 'completed' status
if (in_array($new_status, array('processing', 'completed'))) {
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if (is_a($user, 'WP_User') && $user->ID > 0) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ($order->get_items() as $item) {
check_order_item_and_change_user_role($item, $user, $settings);
}
}
}
}
//Remove subscriber role if subscription is not active
add_action('woocommerce_subscription_status_updated', 'switched_subscription_change_user_role_on_order_status_change_inactive', 100, 5);
function switched_subscription_change_user_role_on_order_status_change_inactive($subscription, $new_status, $old_status)
{
if ($new_status !== 'active') {
// Get an instance of the customer WP_User Object
$order = wc_get_order($subscription->get_parent_id());
$user = $order->get_user();
// Check that it's not a guest customer
if (is_a($user, 'WP_User') && $user->ID > 0) {
$settings = variation_id_per_user_role_settings();
foreach ($settings as $key_id => $value_role) {
if (in_array($value_role, $user->roles)) {
$user->remove_role($value_role);
}
}
$user->set_role('customer');
}
}
}
我有一个 Woocommerce 商店,它有一个可变订阅和 3 种订阅变体:subscription-a、subscription-b 和 subscription-c。我还添加了 3 种新的用户角色类型:subscriber-a、subscriber-b 和 subscriber-c。
我正在尝试创建一个功能,当客户购买、升级或降级订阅并且订阅处于活动状态时,并行用户角色将分配给该客户。
例如: 如果客户购买 subscription-a,用户角色 subscriber-a 将在激活后分配。 如果客户从 subscription-b 升级到 subscription-c,一旦激活,用户角色将有机会从 subscriber-b 变为 subscriber-c。
我尝试了类似线程中提供的功能,但它对我不起作用:
function change_role_on_purchase( $order_id ) {
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_name = $item['name'];
$product_id = $item['product_id'];
$product_variation_id = $item['variation_id'];
if ( $order->user_id > 0 && $product_variation_id == '416' ) {
update_user_meta( $order->user_id, 'paying_customer', 1 );
$user = new WP_User( $order->user_id );
// Remove role
$user->remove_role( 'subscriber' );
// Add role
$user->add_role( 'subscriber-a' );
}
}
}
add_action( 'woocommerce_subscription_status_active', 'change_role_on_purchase' );
更新: @LoicTheAztec 的解决方案效果很好。我现在正尝试在取消订阅时删除角色。这就是我得到的,不确定这是否是最优雅的方法,但它有效。
add_action('woocommerce_subscription_status_cancelled', 'cancelled_subscription_remove_role', 10, 1);
function cancelled_subscription_remove_role($subscription) {
$user_id = $subscription->get_user_id();
$user = new WP_User($user_id);
$user->remove_role('subscriber_a');
$user->remove_role('subscriber_b');
$user->remove_role('subscriber_c');
}
已更新 以处理切换订阅 (升级或降级订阅)
您可以尝试使用woocommerce_subscription_status_updated
相关hook.In下面的代码,您将为每个变体ID设置相关用户角色,设置数组(注释代码):
// Custom function for your settings - Variation id per user role
function variation_id_per_user_role_settings(){
// Settings: set the variation ID as key with the related user role as value
return array(
'417' => 'subscriber-a',
'418' => 'subscriber-b',
'419' => 'subscriber-c',
);
}
// Custom function that check item and change user role based on variation ID
function check_order_item_and_change_user_role( $item, $user, $settings ){
$product = $item->get_product(); // The product object
// Only for variation subscriptions
if( $product->is_type('subscription_variation') ) {
$variation_id = $item->get_variation_id(); // the variation ID
$user_role = $settings[$variation_id]; // The right user role for the current variation ID
// If current user role doesn't match with the right role
if( ! in_array( $user_role, $user->roles) ) {
// Remove "subscriber" user role (if it is set)
if( in_array('subscriber', $user->roles) ) {
$user->remove_role( 'subscriber' );
}
// Remove other user roles (if they are set)
foreach ( $settings as $key_id => $value_role ) {
if( in_array($value_role, $user->roles) && $user_role !== $value_role ) {
$user->remove_role( $value_role );
}
}
// Set the right user role (if it is not set yet)
$user->set_role( $user_role );
}
}
}
// On first purchase (if needed)
add_action( 'woocommerce_subscription_status_updated', 'active_subscription_change_user_role', 100, 3 );
function active_subscription_change_user_role( $subscription, $new_status, $old_status ) {
// When subscrition status is updated to "active"
if ( $new_status === 'active' ) {
// Get the WC_Order Object from subscription
$order = wc_get_order( $subscription->get_parent_id() );
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $subscription->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
}
// On switched purchased subscription
add_action( 'woocommerce_order_status_changed', 'switched_subscription_change_user_role_on_order_status_change', 100, 4 );
function switched_subscription_change_user_role_on_order_status_change( $order_id, $old_status, $new_status, $order ) {
// When order status is updated to 'processing' or 'completed' status
if ( in_array( $new_status, array('processing','completed') ) ) {
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $order->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。它可以工作。
或者您也可以尝试使用 woocommerce_subscription_status_active
挂钩:
// Custom function for your settings - Variation id per user role
function variation_id_per_user_role_settings(){
// Settings: set the variation ID as key with the related user role as value
return array(
'417' => 'subscriber-a',
'418' => 'subscriber-b',
'419' => 'subscriber-c',
);
}
// Custom function that check item and change user role based on variation ID
function check_order_item_and_change_user_role( $item, $user, $settings ){
$product = $item->get_product(); // The product object
// Only for variation subscriptions
if( $product->is_type('subscription_variation') ) {
$variation_id = $item->get_variation_id(); // the variation ID
$user_role = $settings[$variation_id]; // The right user role for the current variation ID
// If current user role doesn't match with the right role
if( ! in_array( $user_role, $user->roles) ) {
// Remove "subscriber" user role (if it is set)
if( in_array('subscriber', $user->roles) ) {
$user->remove_role( 'subscriber' );
}
// Remove other user roles (if they are set)
foreach ( $settings as $key_id => $value_role ) {
if( in_array($value_role, $user->roles) && $user_role !== $value_role ) {
$user->remove_role( $value_role );
}
}
// Set the right user role (if it is not set yet)
$user->set_role( $user_role );
}
}
}
// On first purchase (if needed)
add_action( 'woocommerce_subscription_status_active', 'active_subscription_change_user_role', 100 );
function active_subscription_change_user_role( $subscription ) {
// Get the WC_Order Object from subscription
$order = wc_get_order( $subscription->get_parent_id() );
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $subscription->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
// On switched purchased subscription
add_action( 'woocommerce_order_status_changed', 'switched_subscription_change_user_role_on_order_status_change', 100, 4 );
function switched_subscription_change_user_role_on_order_status_change( $order_id, $old_status, $new_status, $order ) {
// When order status is updated to 'processing' or 'completed' status
if ( in_array( $new_status, array('processing','completed') ) ) {
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if( is_a( $user, 'WP_User' ) && $user->ID > 0 ) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ( $order->get_items() as $item ) {
check_order_item_and_change_user_role( $item, $user, $settings );
}
}
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。它应该有效。
位更新了来自 LoicTheAztec 的代码。可以在订阅中使用不同的产品。
<?php
// Custom function for your settings - Variation id per user role
function variation_id_per_user_role_settings()
{
// Settings: set the variation ID as key with the related user role as value
return array(
//monthly subscriptions
'530' => 'subscriber',
'740' => 'subscriber-extended',
'741' => 'subscriber-advanced',
//now to the yearly
'536' => 'subscriber',
'739' => 'subscriber-extended',
'738' => 'subscriber-advanced',
);
}
// Custom function that check item and change user role based on variation ID
function check_order_item_and_change_user_role($item, $user, $settings)
{
$product = $item->get_product(); // The product object
// Only for variation subscriptions
$variation_id = $item['product_id']; // the variation ID
$user_role = $settings[$variation_id]; // The right user role for the current variation ID
// If current user role doesn't match with the right role
if (!in_array($user_role, $user->roles)) {
// Remove "subscriber" user role (if it is set)
if (in_array('subscriber', $user->roles)) {
$user->remove_role('subscriber');
}
// Remove other user roles (if they are set)
foreach ($settings as $key_id => $value_role) {
if (in_array($value_role, $user->roles) && $user_role !== $value_role) {
$user->remove_role($value_role);
}
}
// Set the right user role (if it is not set yet)
$user->set_role($user_role);
}
}
// On first purchase (if needed)
add_action('woocommerce_subscription_status_updated', 'active_subscription_change_user_role', 100, 3);
function active_subscription_change_user_role($subscription, $new_status, $old_status)
{
// When subscrition status is updated to "active"
if ($new_status === 'active') {
// Get the WC_Order Object from subscription
$order = wc_get_order($subscription->get_parent_id());
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if (is_a($user, 'WP_User') && $user->ID > 0) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ($subscription->get_items() as $item) {
check_order_item_and_change_user_role($item, $user, $settings);
}
}
}
}
// On switched purchased subscription
add_action('woocommerce_order_status_changed', 'switched_subscription_change_user_role_on_order_status_change', 100, 4);
function switched_subscription_change_user_role_on_order_status_change($order_id, $old_status, $new_status, $order)
{
// When order status is updated to 'processing' or 'completed' status
if (in_array($new_status, array('processing', 'completed'))) {
// Get an instance of the customer WP_User Object
$user = $order->get_user();
// Check that it's not a guest customer
if (is_a($user, 'WP_User') && $user->ID > 0) {
// Load settings
$settings = variation_id_per_user_role_settings();
// Loop through order items
foreach ($order->get_items() as $item) {
check_order_item_and_change_user_role($item, $user, $settings);
}
}
}
}
//Remove subscriber role if subscription is not active
add_action('woocommerce_subscription_status_updated', 'switched_subscription_change_user_role_on_order_status_change_inactive', 100, 5);
function switched_subscription_change_user_role_on_order_status_change_inactive($subscription, $new_status, $old_status)
{
if ($new_status !== 'active') {
// Get an instance of the customer WP_User Object
$order = wc_get_order($subscription->get_parent_id());
$user = $order->get_user();
// Check that it's not a guest customer
if (is_a($user, 'WP_User') && $user->ID > 0) {
$settings = variation_id_per_user_role_settings();
foreach ($settings as $key_id => $value_role) {
if (in_array($value_role, $user->roles)) {
$user->remove_role($value_role);
}
}
$user->set_role('customer');
}
}
}