WooCommerce - Как добавить пользовательское поле к товарам корзины и итогам корзины

26 янв. 2014 г., 06:42:13
Просмотры: 26.5K
Голосов: 7

Я использую плагин 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');

Итак, мне нужно знать, как добавить "Стоимость доставки" как в детали товаров корзины, так и в итоги корзины.

Буду признателен за любую помощь с кодом.

Спасибо.

7
Комментарии

Какой код вы уже пробовали?

Brad Dalton Brad Dalton
26 янв. 2014 г. 06:50:25

Привет, я обновил свой пост выше, но жестко прописал 100, что не совсем то, что мне нужно - мне нужно вычисляемое значение.

tonyf tonyf
26 янв. 2014 г. 07:24:40

Это не вопрос по WordPress, а по WooCommerce, вам лучше задать его в каналах поддержки плагина, так как подобные вопросы обычно не по теме здесь

Mark Kaplun Mark Kaplun
26 янв. 2014 г. 07:25:37

Странно, ведь я видел много вопросов на этом форуме с тегом WooCommerce.

tonyf tonyf
26 янв. 2014 г. 07:27:04

Да, и процент полезных ответов ненамного выше нуля.

Mark Kaplun Mark Kaplun
26 янв. 2014 г. 11:09:21

Так что, Марк Каплун, не могли бы вы помочь мне с моими вопросами - я был бы очень признателен.

tonyf tonyf
26 янв. 2014 г. 12:45:57

поверьте, если бы я знал ответ, я бы

Mark Kaplun Mark Kaplun
26 янв. 2014 г. 16:35:44
Показать остальные 2 комментариев
Все ответы на вопрос 1
2

Сначала сохраните пользовательское поле при редактировании товара. Допустим, вы используете пользовательское поле 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');

Вот и всё, после этого должно работать. Не забудьте удалить строки "Только для тестирования..." из обоих кодов, я не создавал пользовательское поле на своём сайте для тестирования.

26 янв. 2014 г. 14:06:31
Комментарии

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

tonyf tonyf
26 янв. 2014 г. 14:26:01

Если это связано с первоначальным вопросом, конечно :)

passatgt passatgt
26 янв. 2014 г. 14:34:11