Установить проблему с общей суммой доставки корзины после обновления Woocommerce - PullRequest
0 голосов
/ 29 ноября 2018

После обновления мои пользовательские правила по сумме доставки не работают.До обновления я использовал следующий код для обновления суммы доставки.

add_action('woocommerce_calculate_totals', 'mysite_box_discount');
function mysite_box_discount($cart ) 
{
  $cart->shipping_total=100;
  return $cart;
}

После обновления структура массива $ cart изменилась, и приведенный выше код перестал работать.Теперь данные поступают в виде защищенного массива.Я обнаружил, что $ cart-> get_shipping_total ();можете доставить мне сумму доставки.

Я также нашел следующую функцию для обновления суммы доставки.

$cart->set_shipping_total($amount);

Поэтому я использовал ее следующим образом, но она не работает.

add_action('woocommerce_calculate_totals', 'mysite_box_discount');
function mysite_box_discount($cart ) 
{
  $cart->set_shipping_total(100);
  return $cart;
}

Может кто-нибудь помочь мне и рассказать, как я могу использовать эту функцию или есть ли другой способ сделать это.Спасибо.

1 Ответ

0 голосов
/ 01 декабря 2018

Вы можете использовать вместо этого woocommerce_package_rates фильтр-хук, чтобы установить стоимость методов доставки, которая будет аналогична вашему старому коду:

add_filter('woocommerce_package_rates', 'custom_shipping_costs', 10, 2 );
function custom_shipping_costs( $rates, $package ){
    // Loop through shipping methods rates
    foreach ( $rates as $rate_key => $rate ){
        // Targeting all shipping methods except "Free shipping"
        if ( 'free_shipping' !== $rate->method_id ) {
            $has_taxes = false;
            $taxes = [];

            $rates[$rate_key]->cost = 100; // Set to 100
            // Taxes rate cost (if enabled)
            foreach ($rates[$rate_key]->taxes as $key => $tax){
                if( $tax > 0 ){
                    $has_taxes = true;
                    $taxes[$key] = 0; // Set to 0 (zero)
                }
            }
            if( $has_taxes )
                $rates[$rate_key]->taxes = $taxes;
        }
    }
    return $rates;
}

Код помещается в файл function.php вашего активного ребенкатема (или активная тема).Протестировано и работает.

Возможно, вам потребуется обновить кэшированные данные доставки: отключить, сохранить и включить, сохранить связанные методы доставки для текущей зоны доставки в настройках доставки Woocommerce.

В этом хуке если вам нужно перебрать элементы корзины (например, для выполнения некоторых вычислений), вы будете использовать внутри кода функции:

foreach( $package['contents'] as $cart_item_key => $cart_item ) {
     $product = $cart_item['data']; // Get the WC_Product instance Object

     // your code
}
...