Изменить стоимость доставки в зависимости от поля ACF и исключить определенные способы доставки

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

//add additional extra cost to shipping except for local pickup
    
        add_filter( 'woocommerce_package_rates', 'shipping_extra_cost' );
        function shipping_extra_cost( $rates ) {
        
            
            foreach($rates as $key => $rate ) {
                $rates[$key]->cost = $rates[$key]->cost + get_field('extra_cost', "51");
            }
    
        return $rates;
    }

Но тогда дополнительная плата также добавляется к местной доставке. что неправильно.

Я не могу работать с классами доставки WC, потому что это мешает работе сторонней программы расчета стоимости доставки.

Есть ли способ проверить, существует ли «местный самовывоз», а затем исключить из него дополнительную плату?

Как убрать количество товаров в категории WooCommerce
Как убрать количество товаров в категории WooCommerce
По умолчанию WooCommerce показывает количество товаров рядом с категорией, как показано ниже.
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете исключить 1 или несколько способов доставки, используя $rate->method_id

Примечание:, потому что get_field() применяется только при использовании плагина ACF. Я заменил его фиксированным номером, настройте в соответствии с вашими потребностями.

Итак, вы получаете:

function filter_woocommerce_package_rates( $rates, $package ) {
    //$field = get_field( 'extra_cost', '51' );

    $field = 50;

    // Multiple can be added, separated by a comma
    $exclude = array( 'local_pickup' );

    // Loop through
    foreach ( $rates as $rate_key => $rate ) {
        // Targeting
        if ( ! in_array( $rate->method_id, $exclude ) ) {
            // Set the new cost
            $rates[$rate_key]->cost += $field;
        }
    }

    return $rates;
}
add_filter( 'woocommerce_package_rates','filter_woocommerce_package_rates', 10, 2 );

Для цели отладки вы можете временно использовать:

function filter_woocommerce_cart_shipping_method_full_label( $label, $method ) {
    // Getters
    $id = $method->id;
    $method_id = $method->method_id;

    // Output
    $label .= '<span style = "color:red; font-size:20px; display:block;">Id = ' . $id . '</span>';
    $label .= '<span style = "color:red; font-size:20px; display:block;">Method id = ' . $method_id . '</span>';

    return $label; 
}
add_filter( 'woocommerce_cart_shipping_method_full_label', 'filter_woocommerce_cart_shipping_method_full_label', 10, 2 );

Результат:

Другие вопросы по теме

Измените только 1 ключ в сериализованном массиве с 3 ключами, используя функцию php
Получение статуса подписки пользователя WooCommerce с помощью Firebase Auth с помощью пользовательских утверждений
Партнерская ссылка Woocommerce с несколькими URL-адресами
Добавьте поле выбора на страницы отдельных продуктов WooCommerce, которое позволяет добавить дополнительный продукт в корзину
Есть ли фильтр для сообщения об ошибке Checkout?
Электронная почта новой учетной записи WooCommerce поставляется с несколькими петлями нижнего колонтитула
Изменить стоимость доставки для определенных стран на основе общего количества заказов клиента в WooCommerce
Wordpress WooCommerce - Слушайте, когда товар снова появится на складе (от 0 до 1) в PHP или скрипте
Разбивка страницы продукта WooCommerce, показывающая дубликаты на всех страницах
Дублирование продукта в Woocommerce с использованием встроенного повторяющегося URL-адреса Wordpress