Скрыть определенные варианты доставки на основе продуктов или категорий в WooCommerce - PullRequest
0 голосов
/ 05 мая 2018

Мой веб-сайт WooCommerce использует 3 различных типа доставки.

  1. Королевская почта подписана на (7 дней)
  2. На следующий день гарантировано
  3. Зарегистрированная доставка

Некоторые товары могут быть отправлены только с использованием опции 1. Когда этот товар добавлен в корзину, созданный мною класс доставки помогает отобразить вариант 1 в корзине, но другие два варианта по-прежнему видны (покупателям не разрешено выбирать эти варианты для этого продукта). Используя jQuery, я смог скрыть две другие опции, потому что опция 1 была выбором по умолчанию. (Так что было легко спрятать два других, основываясь на этом).

Проблема, с которой я столкнулся, заключается в том, что на странице оформления заказа все еще отображаются 2 скрытых параметра, и я не уверен, почему.

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

jQuery(document.body).ready(function() {
    if(jQuery('#shipping_method_0_ced_pps').val() == 'ced_pps')
        jQuery('ul#shipping_method li:nth-child(2)').hide();
        jQuery('ul#shipping_method li:nth-child(3)').hide();
});

Странно, что если я проверяю, существует ли значение на странице оформления заказа, я могу активировать предупреждение, но когда я использую приведенный выше код, он вообще не работает.

Может ли кто-нибудь оказать некоторую помощь или альтернативный метод?

Я посмотрел здесь, и это - самое близкое мне решение без использования jQuery. Проблема с этим решением заключается в том, что мне нужно вручную ввести идентификаторы продукта в файл functions.php. Что не идеально, когда есть более 100 продуктов.

1 Ответ

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

Обновлено Существует несколько способов сделать это без необходимости использования jQuery:

1) Если у вас мало продуктов , вы можете использовать следующий код, который вы определите:

  • Массив идентификаторов продуктов
  • Ваши идентификаторы экземпляров методов доставки будут удалены

код:

add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
    // HERE set the product IDs in the array
    $product_ids = array( 113, 115, 126 ); 
    // HERE set the shipping methods to be removed (like "fat_rate:5")
    $method_instances_ids = array('2846', '2851'); 

    $found = false;

    // Loop through cart items checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
        if ( in_array( $cart_item['product_id'], $product_ids ) ){
            $found = true;
            break;
        }
    }

    if ( ! $found ) return $rates; // If not found we exit

    // Loop through your active shipping methods
    foreach( $rates as $rate_id => $rate ) {
        // Remove all other shipping methods other than your defined shipping method
        if ( in_array( $rate_id, $method_instances_ids ) ){
            unset( $rates[$rate_id] );
        }
    }    

    return $rates;
}

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


2) Если у вас есть набор продуктов , лучше ориентировать эти продукты на категорию продуктов (или метку продукта) ... Вы можете назначить ее в большом количестве.

В коде вы определите:

  • Категория продукта (или тег продукта с таксономией product_tag)
  • Ваши идентификаторы экземпляров методов доставки будут удалены

код:

add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
    // HERE set the product category in the array (ID, slug or name)
    $terms = array( 'my-category' ); 
    $taxonomy = 'product_cat'; 

    // HERE set the shipping methods to be removed (like "fat_rate:5")
    $method_instances_ids = array('2846', '2851');  

    $found = false;

    // Loop through cart items checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
        if ( has_term( $terms, $taxonomy, $cart_item['product_id'] ) ){
            $found = true;
            break;
        }
    }

    if ( ! $found ) return $rates; // If not found we exit

    // Loop through your active shipping methods
    foreach( $rates as $rate_id => $rate ) {
        // Remove all other shipping methods other than your defined shipping method
        if ( in_array( $rate_id, $method_instances_ids ) ){
            unset( $rates[$rate_id] );
        }
    }    

    return $rates;
}

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

Чтобы все заработало для тегов товара :
Вы просто замените таксономию 'product_cat' на 'product_tag'


3) Если у вас есть набор продуктов , вы также можете создать класс доставки и массово назначить его своим продуктам. Вам нужно будет установить цену за нее в соответствующих методах доставки…

Фильтр Способ доставки на основе класса доставки в Woocommerce 3

Вам необходимо обновить кэши доставки:
1) Сначала этот код уже сохранен в вашем файле function.php и очистите вашу корзину…
2) В настройках доставки войдите в зону доставки и отключите способ доставки и «сохранить». Затем снова включите Способ доставки и нажмите «Сохранить». Готово.

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