问题描述
我想要做的是使用钩子在 woocommerce 中以编程方式自定义折扣创建自定义优惠券类型.这就是我的代码的样子
what I am trying to do is creating custom coupon type with custom programmatically discount in woocommerce using hooks. This what my code looks like
//add new coupon type called "custom_discount"
function custom_discount_type( $discount_types ) {
$discount_types['custom_discount'] =__( 'custom discount', 'woocommerce' );
return $discount_types;
}
// add the hooks
add_filter( 'woocommerce_coupon_discount_types', 'custom_discount_type',10, 1);
//function to get coupon amount for "custom_discount"
function woocommerce_coupon_get_discount_amount($discount, $discounting_amount, $cart_item, $single, $coupon) {
if ($coupon->type == 'custom_discount'){ //if $coupon->type == 'fixed_cart' or 'percent' or 'fixed_product' or 'percent_product' The code Works
$discount = 85;
return $discount;
} else {
return $discount;
}
}
//add hook to coupon amount hook
add_filter('woocommerce_coupon_get_discount_amount', 'woocommerce_coupon_get_discount_amount', 10, 5);
优惠券总是以 0(零)折扣金额返回.我是不是错过了什么.感谢您的帮助 =)
the coupon always return with 0(Zero) discount amount. Am I missing something.Thanks for helping =)
推荐答案
好的,所以这个话题引导我走上制作自己的优惠券类型的道路,所以我想我应该回答它以帮助他人.
Ok so this topic lead me on the road to making my own coupon type so I thought I should answer it to help others.
我尝试了你的代码,想知道为什么任何普通的优惠券在删除按钮之前都显示-£xx",但自定义优惠券类型只是瘦长的,没有减号,没有英镑符号是空的.原来这是 WooCommerce 如何验证购物车产品上的优惠券的问题.无论购物车中的商品是否有效,只要优惠券有效,它就会被激活.
I tried out your code and was wondering why any normal coupon showed "-£xx" before the remove button, but the custom coupon type just was lank, no minus, no pound sign jut empty. Turns out it's an issue with how WooCommerce validates the coupon on cart products. It will become active if the coupon is valid regardless if the item in the cart are.
您的优惠券必须对产品有效,或者对整个购物车有效.但是,当 Woocommerce 检查您的产品是否对该产品有效时,它仅检查优惠券类型是 fixed_product
还是percent_product".如果是其他任何东西,它会使用现有数据运行 woocommerce_coupon_is_valid_for_product
钩子,但默认为 false,因此您的 woocommerce_coupon_get_discount_amount
钩子不会触发.
Your coupon needs to be either valid and valid for a product, or valid for the entire cart. However when Woocommerce checks to see if your product is valid for the product it ONLY checks if the coupon type is fixed_product
or 'percent_product'. If it's anything else it runs the woocommerce_coupon_is_valid_for_product
hook with the existing data but defaulting to false, so your woocommerce_coupon_get_discount_amount
hook will not fire.
因此您需要连接到 woocommerce_coupon_is_valid_for_product
并验证产品以确保其有效.就我而言,我只是复制了默认的有效函数并将 $this
更改为 $coupon
.
So you need to hook into woocommerce_coupon_is_valid_for_product
and validate the product to make sure it's valid. In my case I just copied the default valid function and changes $this
to $coupon
.
// Check if coupon is valid for product
add_filter('woocommerce_coupon_is_valid_for_product', 'woocommerce_coupon_is_valid_for_product', 10, 4);
function woocommerce_coupon_is_valid_for_product($valid, $product, $coupon, $values){
if ( ! $coupon->is_type( array( 'bogof' ) ) ) {
return $valid;
}
$product_cats = wp_get_post_terms( $product->id, 'product_cat', array( "fields" => "ids" ) );
var_dump( $coupon->product_ids );
// Specific products get the discount
if ( sizeof( $coupon->product_ids ) > 0 ) {
if ( in_array( $product->id, $coupon->product_ids ) || ( isset( $product->variation_id ) && in_array( $product->variation_id, $coupon->product_ids ) ) || in_array( $product->get_parent(), $coupon->product_ids ) ) {
$valid = true;
}
}
// Category discounts
if ( sizeof( $coupon->product_categories ) > 0 ) {
if ( sizeof( array_intersect( $product_cats, $coupon->product_categories ) ) > 0 ) {
$valid = true;
}
}
if ( ! sizeof( $coupon->product_ids ) && ! sizeof( $coupon->product_categories ) ) {
// No product ids - all items discounted
$valid = true;
}
// Specific product ID's excluded from the discount
if ( sizeof( $coupon->exclude_product_ids ) > 0 ) {
if ( in_array( $product->id, $coupon->exclude_product_ids ) || ( isset( $product->variation_id ) && in_array( $product->variation_id, $coupon->exclude_product_ids ) ) || in_array( $product->get_parent(), $coupon->exclude_product_ids ) ) {
$valid = false;
}
}
// Specific categories excluded from the discount
if ( sizeof( $coupon->exclude_product_categories ) > 0 ) {
if ( sizeof( array_intersect( $product_cats, $coupon->exclude_product_categories ) ) > 0 ) {
$valid = false;
}
}
// Sale Items excluded from discount
if ( $coupon->exclude_sale_items == 'yes' ) {
$product_ids_on_sale = wc_get_product_ids_on_sale();
if ( isset( $product->variation_id ) ) {
if ( in_array( $product->variation_id, $product_ids_on_sale, true ) ) {
$valid = false;
}
} elseif ( in_array( $product->id, $product_ids_on_sale, true ) ) {
$valid = false;
}
}
return $valid;
}
这篇关于带有自定义折扣的 Woocommerce 自定义优惠券类型始终返回 0;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!