WooCommerce - Как добавить пользовательское поле к товарам корзины и итогам корзины
Я использую плагин WooCommerce и у меня следующий вопрос:
На странице отдельного товара, в зависимости от определенных выборов покупателя, рассчитывается стоимость доставки, которую мне нужно передать/включить как часть товаров корзины в виде нового столбца "Стоимость доставки" при просмотре корзины.
Дело в том, что покупатель может решить купить, скажем, три разных товара, где каждый из этих трех товаров может иметь различные расчеты стоимости доставки, после нажатия кнопки "Добавить в корзину" три раза.
Например:
Для товара A расчет стоимости доставки составляет $2.00
Для товара B расчет стоимости доставки составляет $4.00
Для товара C расчет стоимости доставки составляет $6.00
Таким образом, когда покупатель закончит покупки и нажмет "Просмотреть корзину", я хочу, чтобы он увидел:
Товар Цена Стоимость доставки Количество Всего
---------------------------------------------------------------------------------------
Товар A $10 $2 1 $10
Товар B $5 $4 1 $5
Товар C $15 $6 1 $15
Именно столбец "Стоимость доставки" я хотел бы добавить в корзину, и я не уверен, как это сделать.
Кроме того, я также хочу добавить в "Итоги корзины" ниже еще одно пользовательское поле "Стоимость доставки", которое составит $12, что затем будет добавлено к общей стоимости товаров, т.е.:
Итоги корзины
Подытог корзины $30
Стоимость доставки $12
Итого к оплате $42
Вот часть кода, который я использовал для расчета стоимости доставки в итогах корзины:
function woo_add_cart_fee() {
global $woocommerce;
$woocommerce->cart->add_fee( __('Стоимость доставки', 'woocommerce'), 100 );
}
add_action( 'woocommerce_before_calculate_totals', 'woo_add_cart_fee');
Итак, мне нужно знать, как добавить "Стоимость доставки" как в детали товаров корзины, так и в итоги корзины.
Буду признателен за любую помощь с кодом.
Спасибо.

Сначала сохраните пользовательское поле при редактировании товара. Допустим, вы используете пользовательское поле custom_shipping_cost. Убедитесь, что оно сохраняется как число, например 20, а не $20.00.
Затем вам нужно отобразить это поле на странице корзины. К сожалению, нет фильтра для добавления новой колонки в таблице корзины, поэтому вам нужно редактировать файл шаблона, или, если это не обязательно должно быть колонкой, вы можете сделать следующее — этот код добавит дополнительное значение к последней колонке:
add_filter('woocommerce_cart_item_subtotal','additional_shipping_cost',10,3);
function additional_shipping_cost($subtotal, $values, $cart_item_key) {
//Получаем значение пользовательского поля
$custom_shipping_cost = get_post_meta($post->ID, 'custom_shipping_cost', true);
//Только для тестирования, эту строку можно удалить
$custom_shipping_cost = 10;
//Проверяем наличие пользовательской стоимости доставки, если есть - отображаем её под ценой товара
if ($custom_shipping_cost) {
return $subtotal.'<br>+'.woocommerce_price($custom_shipping_cost).' Стоимость доставки';
} else {
return $subtotal;
}
}
Таким образом, первая часть вопроса решена. Если вы хотите отобразить это как в вашем примере выше, вам нужно продублировать файл plugins/woocommerce/templates/cart/cart.php в themes/yourtheme/woocommerce/cart/cart.php. Затем отредактируйте файл, добавьте свою колонку, вы можете использовать приведённый выше код для отображения цены.
После этого нам нужно обновить итоговую сумму в корзине с учётом дополнительных расходов. Ваш код с add_fee будет полезен:
function woo_add_cart_fee() {
global $woocommerce;
$extra_shipping_cost = 0;
//Перебираем корзину, чтобы найти дополнительные расходы
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
//Получаем информацию о товаре
$_product = $values['data'];
//Получаем значение пользовательского поля
$custom_shipping_cost = get_post_meta($_product->id, 'custom_shipping_cost', true);
//Только для тестирования, эту строку можно удалить
$custom_shipping_cost = 10;
//Суммируем дополнительные расходы
$extra_shipping_cost = $extra_shipping_cost + $custom_shipping_cost;
}
//Проверяем, есть ли дополнительная плата, затем добавляем её
if ($extra_shipping_cost) {
$woocommerce->cart->add_fee( __('Стоимость доставки', 'woocommerce'), $extra_shipping_cost );
}
}
add_action( 'woocommerce_before_calculate_totals', 'woo_add_cart_fee');
Вот и всё, после этого должно работать. Не забудьте удалить строки "Только для тестирования..." из обоих кодов, я не создавал пользовательское поле на своём сайте для тестирования.

Привет passatgt - Я очень ценю твою помощь и отличный пример с объяснением. Я попробую то, что ты предложил, и если всё получится, можно ли будет обратиться к тебе снова, если возникнут сложности?
