Расчет стоимости товаров в корзине для заказов Woocommerce
Я хочу знать, как обновить расчет цены в зависимости от некоторой внутренней кодировки. Это цена, которая должна входить в товар в корзине, и пока товар в корзине показывает только базовую стоимость товара.
Технически цена должна быть изменена, когда товар добавлен в корзину.
Я подумал, что это должно быть рассчитано так:
global $woocommerce;
$items = $woocommerce->cart->get_cart();
foreach($items as $item => $values) {
if ($value['product_id'] == $product_id) {
$value['data']->set_price($price);
}
}
Поскольку это не помогает, где / когда мне нужно поставить функцию set_price(). Когда это вызывается, корзина все еще пуста, и цикл не вводится.
Моя проблема, похоже, связана с Woocommerce Bookings, так как следующая строка $this->price не установлена, а затем вызывается get_base_cost, в результате чего отображается только базовая стоимость, а не "пересчитанная" цена. Поскольку это продукт, который можно забронировать, это кажется более сложным.
public function get_price($context = ‘view’) {
return apply_filters( 'woocommerce_get_price', $this->price ? $this->price : $this->get_base_cost(), $this );
}
Присмотревшись к $ this, я по крайней мере вижу обе цены в class_wc_product_booking, где 300 - это "базовая стоимость", а 250 - пересчитанная цена, которую нужно заплатить.
Я удалил большую часть массива, который не должен относиться к этой проблеме.
WC_Product_Booking Object (
[availability_rules:WC_Product_Booking:private] => Array ( )
[object_type:protected] => product
[post_type:protected] => product
[cache_group:protected] => products
[data:protected] =>
Array (
[name] => Booking Test
[slug] => Booking Test
[sku] =>
[price] => 300
[regular_price] =>
[sale_price] =>
[rating_counts] => Array ( )
[average_rating] => 0
[review_count] => 0
)
[supports:protected] => Array ( )
[id:protected] => 1708
[changes:protected] => Array ( [price] => 250 )
[meta_data:protected] =>
[product_type] => booking
)
2 ответа
Вы пытаетесь изменить цену в обычном порядке перед отправкой в корзину? Если да, то вам нужно отправить по сеансу, эти два крючка очень помогут.
add_filter( 'woocommerce_add_cart_item' , 'set_woo_prices');
add_filter( 'woocommerce_get_cart_item_from_session', 'set_session_prices', 20 , 3 );
function set_woo_prices( $woo_data ) {
session_start();
$tac_dd_discounted_price = $_SESSION['']; // get the updated new price field
if ( ! isset($tac_dd_discounted_price ) || empty ($tac_dd_discounted_price ) ) { return $woo_data; }
$woo_data['data']->set_price( $tac_dd_discounted_price );
$woo_data['my_price'] = $tac_dd_discounted_price;
return $woo_data;
}
function set_session_prices ( $woo_data , $values , $key ) {
if ( ! isset( $woo_data['my_price'] ) || empty ( $woo_data['my_price'] ) ) { return $woo_data; }
$woo_data['data']->set_price( $woo_data['my_price'] );
return $woo_data;
}
Это должно быть сделано на woocommerce_before_calculate_totals
действие крючком, чтобы работать. Ниже рабочий пример, где он добавляет 30 к каждой цене товара в корзине:
add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 10, 1 );
function custom_cart_item_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart->get_cart() as $cart_item ){
$price = $cart_item['data']->get_price(); // Get the product price
$new_price = $price + 30; // the calculation
$cart_item['data']->set_price( $new_price ); // Set the new price
}
}
Этот код находится в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Замечания:
global $woocommerce;
с$woocommerce->cart
устарела и была замененаWC()->cart
вместо.