Woocommerce установить способ доставки, получить стоимость доставки - PullRequest
0 голосов
/ 17 сентября 2018

В моем файле functions.php мне нужно указать способ доставки (для этого сайта есть только один), а затем вернуть стоимость доставки (установлено несколько затрат).

Я могу видеть flat_rate доставку, используя это:

foreach (WC()->shipping->get_shipping_methods() as $key => $value){
    echo $key;
}

Так что это определенно есть.

По сути, я хочу, чтобы стоимость доставки вернулась из вызова API. У меня есть API, и все это работает. Он вызывает эту функцию, которую я где-то подобрал, на данный момент не помню:

function pc_get_shipping(){
  $ret = array();
    foreach( WC()->session->get('shipping_for_package_0')['rates'] as $method_id => $rate ){
        if( WC()->session->get('chosen_shipping_methods')[0] == $method_id ){
            $rate_label = $rate->label; // The shipping method label name
            $rate_cost_excl_tax = floatval($rate->cost); // The cost excluding tax
            // The taxes cost
            $rate_taxes = 0;
            foreach ($rate->taxes as $rate_tax)
                $rate_taxes += floatval($rate_tax);
            // The cost including tax
            $rate_cost_incl_tax = $rate_cost_excl_tax + $rate_taxes;

            $ret[] = array('label' => $rate_label, 'total' => WC()->cart->get_cart_shipping_total());
        } 
    }
  return $ret;
}

Но это дает мне просто пустой массив, вероятно, потому что WC()->session->get('shipping_for_package_0')['rates'] оценивает пустой массив.

TL: DR

  • Информация о доставке гостевого клиента сохраняется с помощью WC()->customer->set_shipping_address_1(wc_clean($value)); (и т. Д. Для всех значений)

  • Информация о доставке гостевого клиента корректно возвращается с использованием WC()->customer->get_shipping(), поэтому я считаю, что она установлена ​​правильно.

  • Способ доставки flat_rate доступен через WC()->shipping->get_shipping_methods().

  • Как мне установить метод доставки для текущего заказа в functions.php, в методе, который будет вызываться через REST API.

  • Как мне получить расчетную стоимость доставки для текущего заказа в functions.php, в методе, который будет вызываться через REST API.

1 Ответ

0 голосов
/ 17 сентября 2018

Сначала в своем API-ответе вам необходимо установить значение стоимости как пользовательские данные в WC_Session, например, (where $ value is the response cost value from your API):

if( ! WC()->session->__isset( 'shipping_cost' ) && ! empty($value) ){
    WC()->session->set( 'shipping_cost', $value );
}

youможет потребоваться обновить страницу проверки ajax с помощью jQuery: $('body').trigger('update_checkout');

Затем вы будете использовать эту подключенную функцию:

add_filter('woocommerce_package_rates', 'shipping_cost_based_on_api', 12, 2);
function shipping_cost_based_on_api( $rates, $package ){
    if( WC()->session->__isset( 'shipping_cost' ) ) {

        // Loop through the shipping taxes array
        foreach ( $rates as $rate_key => $rate ){
            $has_taxes = false;

            if( 'flat_rate' === $rate->method_id ){
                // Get the initial cost
                $initial_cost = $new_cost = $rates[$rate_key]->cost;

                // Get the new cost
                $new_cost = WC()->session->get( 'shipping_cost' );

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

                // Taxes rate cost (if enabled)
                $taxes = [];
                // Loop through the shipping taxes array (as they can be many)
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $rates[$rate_key]->taxes[$key] > 0 ){
                        // Get the initial tax cost
                        $initial_tax_cost = $new_tax_cost = $rates[$rate_key]->taxes[$key];
                        // Get the tax rate conversion
                        $tax_rate    = $initial_tax_cost / $initial_cost;
                        // Set the new tax cost
                        $taxes[$key] = $new_cost * $tax_rate;
                        $has_taxes   = true; // Enabling tax
                    }
                }
                if( $has_taxes )
                    $rates[$rate_key]->taxes = $taxes;
            }
        }
    }
    return $rates;
}

// Enabling, disabling and refreshing session shipping methods data
add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 );
function refresh_shipping_methods( $post_data ){
    $bool = true;
    if ( WC()->session->__isset('shipping_cost' ) ) $bool = false;

    // Mandatory to make it work with shipping methods
    foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){
        WC()->session->set( 'shipping_for_package_' . $package_key, $bool );
    }
    WC()->cart->calculate_shipping();
}

Код входит в функцию.PHP-файл вашей активной дочерней темы (или активной темы).Должно работать.

На основе: Снять стоимость доставки, если в WooCommerce Checkout установлен флажок

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