对特定类别的产品应用折扣(WooCommerce)



我有这段代码,它运行得很好,并为"subscriber"类别的用户提供10%的折扣。现在我想修改代码,使折扣仅适用于特定类别的产品。

例如,我有三类产品:"产品"、"独家产品"one_answers"订阅"。折扣应仅适用于前两类产品,而不适用于"订阅"类产品。

有人能帮我修改这个功能以满足这些要求吗?

// Applying conditionally a discount for a specific user role
add_action( 'woocommerce_cart_calculate_fees', 'discount_based_on_user_role', 20, 1 );
function discount_based_on_user_role( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return; // Exit
// Only for 'subscriber' user role
if ( ! current_user_can('subscriber') )
return; // Exit
// HERE define the percentage discount
$percentage = 10;
$discount = $cart->get_subtotal() * $percentage / 100; // Calculation
// Applying discount
$cart->add_fee( sprintf( __("Discount (%s)", "woocommerce"), $percentage . '%'), -$discount, true );
}

首先,current_user_can('subscriber')是检查当前用户角色的错误方法。current_user_can应仅用于检查功能,而不是用户角色。

其次,你没有很好地解释你的类别匹配条件。我不确定你是想检查所有产品都应该有匹配的类别,还是其中一个应该有,或者一个只有一个产品匹配的类别就可以了。你需要自己努力。

下面的代码是检查其中一个购物车产品是否有任何匹配的类别,然后条件将是有效的。

注意:代码未经过测试,如果您发现任何关键或语法错误,请告诉我我会修复代码。如果添加代码后出现任何错误,并且您无法访问wordpress后端,请确保您有网站备份和FTP访问权限,以便对文件进行更改

/**
* Applying conditionally a discount for a specific user role.
*/
function discount_based_on_user_role() {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
// Only for logged in users.
if ( ! is_user_logged_in() ) {
return;
}
$user = get_userdata( get_current_user_id() );
// User or user roles not found.
if ( ! $user || ! $user->roles ) {
return;
}
// Only for 'subscriber' user role.
if ( ! in_array( 'subscriber', (array) $user->roles, true ) ) {
return;
}
// Get products from cart.
$products_in_cart = WC()->cart->get_cart_contents();
// Get product ids array from cart products.
$product_ids_in_cart = array_column( array_values( $products_in_cart ), 'product_id' );
// Define a flag for valid categories check.
$has_valid_categories = false;
// Define valid categories array.
$valid_categories = array( 'products', 'exclusive-products' );
// Loop through product ids.
foreach ( $product_ids_in_cart as $product_id ) {
// Check if product has any of the valid category.
if ( has_term( $valid_categories, 'product_cat', $product_id ) ) {
$has_valid_categories = true;
break;
}
}
// Valid categories not found.
if ( ! $has_valid_categories ) {
return;
}
// here define the percentage discount.
$percentage = 10;
$discount = WC()->cart->get_subtotal() * $percentage / 100; // Calculation.
// Applying discount.
WC()->cart->add_fee(
sprintf(
/* translators: %s Discount Value */
__( 'Discount (%s)', 'woocommerce' ),
$percentage . '%'
),
-$discount,
true
);
}
add_action( 'woocommerce_cart_calculate_fees', 'discount_based_on_user_role', 20 );

最新更新