Пользовательская цена продукта в Woocommerce
Иногда нужно чтобы продукт в Woocommerce имел не заданную стоимость продукта, а ту которую ввел пользователь, например для сбора пожертвований.
Для этого нужно создать для каждого элемента дополнительное поле (например custom_price) с новой ценой, и при подсчете стоимости корзины с помощью хука woocommerce_before_calculate_totals установить для каждого элемента корзины стоимость из дополнительного поля с новой ценой.
В файле темы functions.php создаем следующую функцию:
//Сохраняем цену указанную пользователем в поле custom_price
add_filter('woocommerce_add_cart_item_data', 'save_custom_fields_data_to_cart', 10, 2);
function save_custom_fields_data_to_cart($cart_item_data, $product_id) {
if( isset($_POST['custom_price']) && !empty( $_POST['custom_price'])) {
//Сохраняем пользовательские данные в корзину
$cart_item_data['custom_price'] = (float)sanitize_text_field($_POST['custom_price']);
//Делаем товар отдельным и уникальным элементом в корзине
$cart_item_data['unique_key'] = md5(microtime().rand());
}
return $cart_item_data;
}
//Обновляем цену товара в корзине
add_action('woocommerce_before_calculate_totals', 'change_cart_item_price', 30, 1);
function change_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 {
//Устанавливаем новую цену товара
if(isset($cart_item['custom_price'])){
$cart_item['data']->set_price($cart_item['custom_price']);
}
}
}
Где $_POST[‘custom_price’] — это пользовательская цена товара.
Данную функцию легко переделать например для продукта у которого цена рассчитывается в зависимости от ширины и высоты.