PHP
0
Вклад в тег
// Adding a wholesale price for items
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 20, 1);
function add_custom_price( $cart ) {
// This is necessary for WC 3.0+
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Avoiding hook repetition (when using price calculations for example)
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Get order subtotal
$order_subtotal = WC()->cart->get_cart_subtotal();
if ( $order_subtotal >= 2000 ) {
foreach ( $cart->get_cart() as $item ) {
// Значение set_price нужно будет заменить на id кастомной цены, если всё заработает
$item['data']->set_price( 150.6 );
}
}
}
$order_subtotal
. $order_subtotal
через echo
, но мне постоянно выдавало что оно равно 0 (нуль или ноль?). Не понимая что присходит я немного впал в отчаянне. Но. НО. После я заметил что в add_action
написано woocommerce_before_calculate_totals
. Хахахах. Всё было так просто. Там написано before. Это BEFORE. Т.е до подсчёта суммы. Лёгкими нажатиями своими пальчиками я заменил этот никчёмный "before" на нужный мне "after". И боги, оно заработало. Я начал видеть правильный мне подытог корзины.get_cart_subtotal()
, то я получаю сумму в виде строки со знаком валюты, а если использывать get_subtotal()
мы получаем уже тип float, который можно использывать для конструкции if.// Adding a wholesale price for items
add_action( 'woocommerce_after_calculate_totals', 'add_custom_price', 20, 1);
function add_custom_price( $cart ) {
// This is necessary for WC 3.0+
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Avoiding hook repetition (when using price calculations for example)
if ( did_action( 'woocommerce_after_calculate_totals' ) >= 2 )
return;
if ( WC()->cart->get_subtotal() >= 2000 ) {
foreach ( $cart->get_cart() as $item ) {
$item['data']->set_price( 150.6 );
}
}
}
// Adding a wholesale price for items
add_action( 'woocommerce_after_calculate_totals', 'add_custom_price', 20, 1);
function add_custom_price( $cart ) {
// This is necessary for WC 3.0+
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Avoiding hook repetition (when using price calculations for example)
if ( did_action( 'woocommerce_after_calculate_totals' ) >= 2 )
return;
// Adding a custom price for items
if ( WC()->cart->get_subtotal() >= 2000 ) {
foreach ( $cart->get_cart() as $item ) {
$item['data']->set_price( 150.6 );
}
}
// Recount cart total
WC()->cart->calculate_totals();
// Wrong minimum amount protection
if ( WC()->cart->get_subtotal() < 2000 ) {
foreach ( $cart->get_cart() as $item ) {
$regular_price = $item['data']->get_regular_price();
$item['data']->set_price( $regular_price );
}
}
// Recount cart total
WC()->cart->calculate_totals();
}
$ca = WC()->cart->calculate_totals()
. В попытках проверить не виснит ли сайт от такой логики при перезагрузки я не увидил сообщение о том что "Возникла ошибка. Поробуйте в другой раз." (Это уже очень радовало). Я решил попробывать изменить количесто товара. И именно тут я заметил что корзина пересчитывает итогувую сумму по новой, заданной мной, цене. ОоОООООООО. Я перекрестился и сказал чпасибо себе за то что я такой классный. После я оставил только WC()->cart->calculate_totals()
, что также работало исправно.$regular_price = $item['data']->get_regular_price()
и также добавил перерасчет суммы корзины после.