Hide Flat Rate доставка исключительно для категории товаров в Woocommerce - PullRequest
0 голосов
/ 22 мая 2018

Это расширение этого вопроса: Удалить метод единой ставки доставки для определенной категории в WooCommerce 2.6 и 3 +

Использовал плагин Woo Smart Coupons для продукта Gift Card.Это ДОЛЖНО быть установлено в Variation, поскольку у нас есть несколько уровней для выбора.(это исключает виртуальные продукты) У Подарочной карты есть своя собственная категория для различения.У нас есть два варианта доставки: фиксированная ставка + местный пикап.Довольно глупо иметь варианты доставки подарочной карты, которая отправляется на Ваш почтовый ящик, поэтому я использовал следующий фрагмент, приведенный в ссылке выше:

add_filter( 'woocommerce_package_rates', 'conditional_hide_shipping_methods', 100, 2 );    
function conditional_hide_shipping_methods( $rates, $package ){

// Define/replace here your correct category slug (!)
$product_category = 'coupons-gift-cards';
$prod_cat = false;

foreach ( WC()->cart->get_cart() as $cart_item ) {
    $product_id = $cart_item['product_id'];
    if ( has_term( $product_category, 'product_cat', $product_id ) ){
        $prod_cat = true;
    }
}

$rates_arr = array();
if ( $prod_cat ) {
    foreach($rates as $key => $rate) {
        if ('free_shipping' === $rate->method_id || 'local_pickup' === $rate->method_id || 'local_delivery' === $rate->method_id) {
            $rates_arr[ $rate_id ] = $rate;
            break;
        }
    }
}
return !empty( $rates_arr ) ? $rates_arr : $rates;
}

Работает как шарм ... пока вы не добавитепродукт, который не из этой категории.Если кто-то решит, что ему нужна Подарочная карта и обычный продукт, то должны быть возвращены обычные варианты доставки.

РЕДАКТИРОВАТЬ: Проверенный ответ работает отлично!Если вы хотите изменить метку раскладки для предметов, подобных описанной выше ситуации, чтобы они говорили что-то вроде «Загрузить» вместо «Погрузка», добавьте эту строку после оператора IF, который проверяет, какие продукты соответствуют категориям

foreach( $rates as $rate_key => $rate ) {
//change local_pickup:1 to your shipping method
    if ( 'local_pickup:1' == $rate_key){
//set the text for the label
        $rates[$rate_key]->label = __( 'Download', 'woocommerce' );
    }
}

1 Ответ

0 голосов
/ 23 мая 2018

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

add_filter( 'woocommerce_package_rates', 'hide_shipping_flat_rate_conditionaly', 90, 2 );
function hide_shipping_flat_rate_conditionaly( $rates, $package ){

    // HERE Define your product category (ID, slug or name or an array of values)
    $term   = 'coupons-gift-cards';
    $others = $found = false;

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['product_id'];
        if ( has_term( $term, 'product_cat', $cart_item['product_id'] ) )
            $found = true;
        else
            $others = true;
    }

    if ( $found && ! $others ) {
        foreach($rates as $rate_id => $rate) {
            if ('flat_rate' === $rate->method_id )
                unset($rates[ $rate_id ]);
        }
    }
    return $rates;
}

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

Этот код протестирован и полностью функционален (он будет работать, если вы правильно установили свои зоны доставки).

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

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