it-swarm.com.ru

Изменить цены в корзине товаров в 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+?

Благодарю.

8
Archana

Update _ ​​(сентябрь 2018 г.)

С WooCommerce версии 3.0+ вам необходимо:

  • Вместо этого использовать хук woocommerce_before_calculate_totals.
  • Чтобы использовать WC_Cart get_cart() метод вместо
  • Чтобы использовать WC_product set_price() method

Вот код:

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) при использовании некоторых несколько конкретных плагинов или других настроек.

Связанные с:

27
LoicTheAztec

С версией 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
Tony