Динамически устанавливать метку метода доставки на основе количества товаров в WooCommerce - PullRequest
1 голос
/ 01 октября 2019

В моей корзине woocommerce стоимость доставки по-прежнему корректно рассчитывается по коду ниже. Но этикетка доставки сейчас не обновляется. Я не могу найти причину;может быть последнее обновление woocommerce 3.7? Спасибо за помощь!

/**
 * Add different price for shipping based on products quantity
 */
function mx_shop_shipping_price( $rates, $package ) {
    //Shipping Mode 1
    if ( WC()->cart->cart_contents_count < 4 ) {
        return array_filter($rates, function (WC_Shipping_Rate $rate) {
            return $rate->get_label() === 'Shipping Mode 1'; // Shipping Mode 1
        });
    }
    //Shipping Mode 2
    if ( WC()->cart->cart_contents_count < 13 ) {
        return array_filter($rates, function (WC_Shipping_Rate $rate) {
            return $rate->get_label() === 'Shipping Mode 2';
        });
    }
    //Shipping Mode 3
    return array_filter($rates, function (WC_Shipping_Rate $rate) {
        return $rate->get_label() === 'Shipping Mode 3';
    });     
}
add_filter( 'woocommerce_package_rates', 'mx_shop_shipping_price', 10, 2 );

/** End

Информация о корзине с этикеткой доставки не обновлена. Примечание Общая сумма заказа корректно обновляется

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вы не используете правый хук , чтобы включить метку динамического способа доставки на основе количества элементов в корзине ...

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

add_filter( 'woocommerce_cart_shipping_method_full_label', 'change_cart_shipping_method_full_label', 1000, 2 );
function change_cart_shipping_method_full_label( $label, $method ) {
    $count     = WC()->cart->get_cart_contents_count();
    $label     = sprintf( __( "Shipping Mode %s", "woocommerce" ), $count < 4 ? 1 : ( $count < 13 ? 2 : 3 ) );

    $has_cost  = 0 < $method->cost;
    $hide_cost = ! $has_cost && in_array( $method->get_method_id(), array( 'free_shipping', 'local_pickup' ), true );

    if ( $has_cost && ! $hide_cost ) {
        if ( WC()->cart->display_prices_including_tax() ) {
            $label .= ': ' . wc_price( $method->cost + $method->get_shipping_tax() );
            if ( $method->get_shipping_tax() > 0 && ! wc_prices_include_tax() ) {
                $label .= ' <small class="tax_label">' . WC()->countries->inc_tax_or_vat() . '</small>';
            }
        } else {
            $label .= ': ' . wc_price( $method->cost );
            if ( $method->get_shipping_tax() > 0 && wc_prices_include_tax() ) {
                $label .= ' <small class="tax_label">' . WC()->countries->ex_tax_or_vat() . '</small>';
            }
        }
    }
    return $label;
}

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


Похожие темы:

0 голосов
/ 01 октября 2019

Вы используете оператор сравнения '===' вместо оператора присваивания. Вот ваш обновленный код, который вы можете попробовать:

function mx_shop_shipping_price( $rates, $package ) {
    //Shipping Mode 1
    if ( WC()->cart->cart_contents_count < 4 ) {
        return array_filter($rates, function (WC_Shipping_Rate $rate) {
            return  $rates[$rate_key]->label = __( 'Shipping Mode 1', 'woocommerce' ); // Shipping Mode 1
        });
    }
    //Shipping Mode 2
    if ( WC()->cart->cart_contents_count < 13 ) {
        return array_filter($rates, function (WC_Shipping_Rate $rate) {
            return $rates[$rate_key]->label = __( 'Shipping Mode 2', 'woocommerce' );
        });
    }
    //Shipping Mode 3
    return array_filter($rates, function (WC_Shipping_Rate $rate) {
        return $rates[$rate_key]->label = __( 'Shipping Mode 3', 'woocommerce' );;
    });     
}
add_filter( 'woocommerce_package_rates', 'mx_shop_shipping_price', 10, 2 );

Вам необходимо обновить кэши доставки:

1) Сначала этот код ужесохранено в вашем файле function.php.

2) В настройках доставки войдите в зону доставки и отключите метод доставки и нажмите «сохранить».

Затем снова включите этот способ доставки и «сохранить». Вы сделали.

Вы можете найти ответ, уже даный для такого требования здесь

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