请完整阅读此问题。我找不到任何有用的东西来获得完全正常的功能。
STEP 1
商店中有一种免费产品,直到其数量与购物篮中其他商品的数量匹配为止。
第2步
如果该产品的价格超过其他产品,则必须分为2:-免费,其数量与所购买的商品数量相同-已超过购物篮中其他商品的数量。
为此,我使用了钩子:woocommerce_check_cart_items
,它对我有用。
第3步
但是在结帐页面中的购物车之后:
在付款过程中以及在管理面板中保存时,所有内容都会正确显示。
如果我使用woocommerce_before_calculate_totals
挂钩,则会在产品添加到购物车事件中添加一个无限循环。
我对必要的更改进行了几次检查,仍然是一个无休止的循环。
也许,您知道其他钩子吗?
或者如何将我的自定义购物车保存在结帐页面?
我的代码:
add_action('woocommerce_check_cart_items', array('validate_all_cart_contents', 'init'), 10);
class validate_all_cart_contents
{
private static $custom_price = 5; // This will be your custome price
private static $sizing_kit_id = 57651;
private static $count_products = 0;
private static $count_sizing_kit = 0;
private static $payment_count = 0;
private static $free_count = 0;
public static function init()
{
foreach (WC()->cart->cart_contents as $cart_content_product) {
if ($cart_content_product["product_id"] == self::$sizing_kit_id) {
self::$count_sizing_kit += $cart_content_product["quantity"];
} else {
self::$count_products += $cart_content_product["quantity"];
}
}
self::$free_count = self::$count_sizing_kit;
if (self::$count_products <= self::$count_sizing_kit) {
self::$free_count = self::$count_products;
self::$payment_count = self::$count_sizing_kit - self::$count_products;
}
if (self::$count_sizing_kit > 0 && self::$count_sizing_kit > self::$count_products && !self::check()) {
self::clear_sizingkit_in_cart();
/**
* Payment sizing kit
*/
self::add_to_cart_with_custom_price(self::$payment_count, self::$custom_price);
/**
* Free sizing kit
*/
self::add_to_cart_with_custom_price(self::$free_count);
WC()->cart->calculate_totals();
WC()->cart->set_session();
WC()->cart->maybe_set_cart_cookies();
}
}
private static function check()
{
$correct_free_count = $correct_payment_count = (self::$count_products >= self::$count_sizing_kit) ? true : false;
foreach (WC()->cart->cart_contents as $cart_content_product) {
if ($cart_content_product["product_id"] == self::$sizing_kit_id) {
if ($cart_content_product["line_total"] == 0 && $cart_content_product["quantity"] == self::$free_count) {
$correct_free_count = true;
} else if ($cart_content_product["line_total"] > 0 && $cart_content_product["quantity"] == self::$payment_count) {
$correct_payment_count = true;
}
}
}
return $correct_free_count && $correct_payment_count;
}
private static function clear_sizingkit_in_cart()
{
/**
* Remove sizing kit in cart
*/
$keys_list = array();
foreach (WC()->cart->cart_contents as $cart_content_product) {
if ($cart_content_product['product_id'] == self::$sizing_kit_id) {
$in_cart = WC()->cart->find_product_in_cart($cart_content_product['key']);
$keys_list[] = $in_cart;
}
}
if ($keys_list) {
foreach ($keys_list as $key) {
WC()->cart->remove_cart_item($key);
}
}
}
private static function add_to_cart_with_custom_price($sizingkit_cart_count, $sizingkit_cart_price = 0)
{
if ($sizingkit_cart_count == 0) return;
$add_to_cart = WC()->cart->add_to_cart(self::$sizing_kit_id, $sizingkit_cart_count);
if ($sizingkit_cart_price != 0) {
$sizingkit_cart_price = $sizingkit_cart_price <= 30 ? $sizingkit_cart_price : 30;
$in_cart = WC()->cart->find_product_in_cart($add_to_cart);
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
if ($cart_item['key'] == $in_cart) {
$customPriceSizingKit[$in_cart] = $sizingkit_cart_price;
$cart_item['data']->set_price($sizingkit_cart_price);
}
}
}
return true;
}
}