Он должен динамически фильтровать цены по всему магазину в зависимости от пользователя и продукта.
Он также должен иметь возможность принудительно отображать определенные элементы корзины. бесплатно.
Обе эти функции работают по отдельности, но когда я объединяю их вместе, цена бесплатного товара в корзине (нулевая) переопределяется функцией, которая динамически устанавливает цены на продукты.< /p>
Он у меня сейчас есть применение уникальной цены клиента следующим образом (я удалил много кода, чтобы сохранить актуальность проблемы):
Код: Выделить всё
add_filter('woocommerce_product_get_price', 'wcds_custom_price', 10, 2);
function wcds_custom_price($price, $product)
{
if (did_action('woocommerce_product_get_price') >= 2) {
return;
}
// get price specific to user and product
$user_id = get_current_user_id();
$price = wcds_get_price($product, $user_id); // This works
return $price;
}
Затем мне нужно обнулить эти цены для определенных товаров, которые программно добавляются в корзину. Бесплатные товары не превышают максимального количества — любое дальнейшее количество бесплатного товара добавляется как отдельный товар без изменения цены (опять же, я сохранил это в соответствующем коде):
Код: Выделить всё
add_filter('woocommerce_before_calculate_totals', 'wcds_apply_giveaway_pricing', 999, 1);
function wcds_apply_giveaway_pricing($cart)
{
// Do not modify prices in admin
if (is_admin()) {
return;
}
if (did_action('woocommerce_before_calculate_totals') >= 2) {
return;
}
// Example of $giveaway_products (actually set dynamically)
$giveaway_products = array(
'107964' => array
(
'qty' => '2',
'giveaway_post_id' => '127753'
)
);
// Example of $giveaway_products (actually set dynamically from cart contents)
$total_quantities = array(
'107964' => '5'
);
$to_add = array();
// Loop through cart items and split giveaways
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product_id = $cart_item['product_id'];
if (array_key_exists($product_id, $giveaway_products)) {
$total_quantity = $total_quantities[$product_id];
$free_quantity = $giveaway_products[$product_id]['qty'];
$free_quantity = min($total_quantity, $free_quantity);
$paid_quantity = max($total_quantity - $free_quantity, 0);
$to_add[$product_id] = [
'paid' => $paid_quantity,
'free' => $free_quantity,
'giveaway_post_id' => $giveaway_products[$product_id]['giveaway_post_id'],
];
$cart->remove_cart_item($cart_item_key); // Remove original rows for giveaway products
} else {
unset($cart_item['giveaway']); // Remove the giveaway flag if not in the giveaway list
}
}
// Add the giveaway products to the cart with the adjusted quantities
foreach ($to_add as $product_id => $data) {
// Add paid products to cart
if ($data['paid'] > 0) {
$cart->add_to_cart($product_id, $data['paid']);
}
// Add free giveaway products to cart
if ($data['free'] > 0) {
$giveaway_id = $data['giveaway_post_id'];
$cart_item_key = $cart->add_to_cart($product_id, $data['free'], '', '', [
'giveaway' => true,
'giveaway_id' => $giveaway_id,
]);
// Adjust the price for giveaway items
$cart_item = $cart->get_cart_item($cart_item_key);
$cart_item['data']->set_price(0);
$cart_item['data']->set_name('FREE: ' . $cart_item['data']->get_name()); // Optionally change name for giveaways
}
}
}
Если я удалю add_filter('woocommerce_product_get_price', 'wcds_custom_price', 10, 2); , то цена добавленного товара в корзину успешно устанавливается равной нулю.
Похоже, что woocommerce_product_get_price срабатывает несколько раз ПОСЛЕ woocommerce_before_calculate_totals (я Я также попробовал woocommerce_get_cart_item_from_session), который снова устанавливает цену после того, как я установил ее на ноль.
Как я могу заставить обе функции работать?
Подробнее здесь: https://stackoverflow.com/questions/791 ... red-by-woo