Увеличьте стоимость доставки по количеству категорий, найденных в корзине WooCommerce

Я пытаюсь увеличить стоимость доставки в зависимости от количества категорий в корзине (количество). Пока у меня есть это:

add_filter( 'woocommerce_package_rates', 'vh_wc_shipping_costs', 20 );

function vh_wc_shipping_costs( $rates ) {
    $increase_cost = 50;
    $cat_ids       = array();
    $count         = 0;

    foreach ( wc()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $cat_ids = array_merge(
            $cat_ids,
            (array) $cart_item['data']->get_category_ids()
        );
        $count   = count( $cat_ids );
    }

    $i=0;

    if ( $count >= 1 ) {
        foreach ( $rates as $rate_key => $rate ) {
            $i++; $i <= $count;

            // Excluding free shipping methods
            if ( 'free_shipping' !== $rate->method_id ) {
                // Get old cost
                $old_cost = $rates[ $rate_key ]->cost;

                // Set rate cost
                $rates[ $rate_key ]->cost = $old_cost + $increase_cost;
            }
        }
    }

    return $rates;
}

Но по какой-то причине это не увеличивает стоимость доставки для каждой дополнительной категории. Также я хотел бы добавить примечание к дополнительной стоимости. Любое предложение приветствуется.


person Marina M    schedule 11.08.2020    source источник
comment
Требуется больше внимания: в настоящее время этот вопрос включает несколько вопросов в одном. Следует сосредоточиться только на одной проблеме. Обратите внимание, что правило на StackOverFlow - это один вопрос за раз.   -  person LoicTheAztec    schedule 11.08.2020


Ответы (1)


Поскольку правило на StackOverFlow - это один вопрос, я отвечу только на первый вопрос, связанный с вашим кодом.

Следующий код добавит дополнительную стоимость доставки для каждой дополнительной категории продукта, найденной в корзине (но не для первой):

add_filter( 'woocommerce_package_rates', 'filter_shipping_rates_costs', 10, 2 );
function filter_shipping_rates_costs( $rates, $package ) {
    $step_cost = 50;
    $term_ids  = array();

    // Loop through cart items for the current shipping package
    foreach( $package['contents'] as $cart_item ){
        $term_ids = array_merge(
            $term_ids,
            (array) $cart_item['data']->get_category_ids()
        );
    }

    $terms_count = count( $term_ids );

    // Loop through shipping rates
    foreach ( $rates as $rate_key => $rate ) {
        // Excluding free shipping methods
        if ( 'free_shipping' !== $rate->method_id && $terms_count > 1 ) {
            // Set rate cost
            $rates[$rate_key]->cost = $rate->cost + ($step_cost * ($terms_count - 1));
        }
    }

    return $rates;
}

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

add_filter( 'woocommerce_package_rates', 'filter_shipping_rates_costs', 10, 2 );
function filter_shipping_rates_costs( $rates, $package ) {
    $step_cost = 50;
    $term_ids  = array();

    // Loop through cart items for the current shipping package
    foreach( $package['contents'] as $cart_item ){
        $term_ids = array_merge(
            $term_ids,
            (array) $cart_item['data']->get_category_ids()
        );
    }

    $terms_count = count( $term_ids );

    // Loop through shipping rates
    foreach ( $rates as $rate_key => $rate ) {
        // Excluding free shipping methods
        if ( 'free_shipping' !== $rate->method_id && $terms_count > 0 ) {
            // Set rate cost
            $rates[$rate_key]->cost = $rate->cost + ($step_cost * $terms_count);
        }
    }

    return $rates;
}

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

Обновите кеши доставки:

  1. Этот код уже сохранен в вашем файле functions.php.
  2. В настройках зоны доставки отключите / сохраните любой способ доставки, затем включите возврат / сохранение.

    Готово, и вы можете проверить это.
person LoicTheAztec    schedule 11.08.2020
comment
Как я могу исключить дочерние категории из этого расчета? Спасибо - person Marina M; 12.08.2020
comment
stackoverflow.com/questions/63375188 / Вопрос опубликован. Спасибо за вашу помощь и предложения @LoicTheAztec - person Marina M; 12.08.2020