Изменение цен на товары в корзине в Woocommerce 3


Я пытаюсь изменить цену товара в корзине, используя следующую функцию:

    add_action( 'woocommerce_before_shipping_calculator', 'add_custom_price' 
     );
      function add_custom_price( $cart_object ) {
         foreach ( $cart_object->cart_contents as $key => $value ) {
         $value['data']->price = 400;
        } 
     }

Он работал правильно в WooCommerce версии 2.6.x, но больше не работал в версии 3.0+

Как я могу заставить его работать в WooCommerce версии 3.0+?

Спасибо.

Author: LoicTheAztec, 2017-04-10

2 answers

Обновление ( Сентябрь 2018)

С WooCommerce версии 3.0+ вам нужно:

  • Для использования woocommerce_before_calculate_totals вместо этого крюк.
  • Для использования wc_cart get_cart() метод вместо
  • Для использования wc_продукт set_price() метод вместо

Вот код:

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 20, 1);
function add_custom_price( $cart_obj ) {

    // 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;

    // Loop through cart items
    foreach ( $cart_obj->get_cart() as $cart_item ) {
        $cart_item['data']->set_price( 40 );
    }
 }

Код входит в function.php файл вашей активной дочерней темы (или темы) или также в любом плагине файл.

Этот код протестирован и работает.

Примечание: вы можете увеличить приоритет подключения с 20 чтобы 1000 ( или даже 2000) при использовании нескольких конкретных плагинов или других настроек.

Связанные:

 23
Author: LoicTheAztec, 2018-10-01 03:54:45

С версией WooCommerce 3.2.6 ответ @LoicTheAztec работает для меня, если я увеличу приоритет до 1000.

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 1000, 1);

Я попробовал значения приоритета 10,99 и 999 но цена и общая сумма в моей корзине не изменились (хотя я смог подтвердить с помощью get_price(), что set_price() фактически установил цену товара.

У меня есть пользовательский крючок, который добавляет плату в мою корзину, и я использую сторонний плагин, который добавляет атрибуты продукта. Я подозреваю, что эти WooCommerce "дополнения" вводят задержки, которые требуют, чтобы я отложил свое пользовательское действие.

 1
Author: Tony, 2018-02-16 01:42:29