WooCommerce update_checkout не будет обновлять способы доставки - PullRequest
2 голосов
/ 28 апреля 2020

На моем сайте WooCommerce я использую эту функцию, чтобы добавить комиссию в размере 4 €, если в качестве способа оплаты вы выберете около sh при доставке:

add_action('woocommerce_cart_calculate_fees', 'increase_cod_cost');

function increase_cod_cost() {
  if(WC()->session->chosen_payment_method=='cod')
    WC()->cart->add_fee(__('COD Fee'), 4);
}

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

add_action('woocommerce_review_order_before_payment', 'custom_checkout_update');

function custom_checkout_update() {
  echo '
    <script type="text/javascript">
    (function($){
    $(\'form.checkout\').on(\'change\', \'input[name="payment_method"]\', function() {
    $(\'body\').trigger(\'update_checkout\');
    });
    })(jQuery);
    </script>
  ';
}

Обе функции работают на 100%.

Теперь вместо добавления Я бы хотел правильно увеличить фактическую стоимость доставки, поэтому я попробовал эту функцию вместо первой:

add_filter('woocommerce_package_rates', 'increase_cod_cost_2', 10, 2);

function increase_cod_cost_2($rates, $package) {
  if(WC()->session->chosen_payment_method=='cod')
    $rates['flat_rate:1']->cost=$rates['flat_rate:1']->cost+4;
  return $rates;
}

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Пожалуйста, попробуйте это.

add_filter( 'woocommerce_package_rates', 'custom_shipping_costs', 20, 2 );
function custom_shipping_costs( $rates, $package ) {
    // New shipping cost (can be calculated)
    $new_cost = 1000;
    $tax_rate = 0.4;

    foreach( $rates as $rate_key => $rate ){
        // Excluding free shipping methods
        if( $rate->method_id != 'free_shipping'){

            // Set rate cost
            $rates[$rate_key]->cost = $new_cost;

            // Set taxes rate cost (if enabled)
            $taxes = array();
            foreach ($rates[$rate_key]->taxes as $key => $tax){
                if( $rates[$rate_key]->taxes[$key] > 0 )
                    $taxes[$key] = $new_cost * $tax_rate;
            }
            $rates[$rate_key]->taxes = $taxes;

        }
    }
    return $rates;
}

0 голосов
/ 02 мая 2020

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

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

do_action( 'woocommerce_shipping_method_chosen', $chosen_method );

или что-то лучше, что срабатывает всякий раз, когда woocommerce отправляется на поиск доступных методов доставки.

Будьте осторожны, чтобы хуки не вызывались последовательно, и вы добавляете на 4 доллара больше хан 1 раз ...

PD: я заметил, что предложенный хук тоже не идеален, вы можете попробовать один из них:

add_action( 'woocommerce_load_shipping_methods', 'action_woocommerce_load_shipping_methods', 10, 1 ); 
add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates' );

или проверьте здесь все крючки woocommerce: https://docs.woocommerce.com/wc-apidocs/hook-docs.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...