Исключить категорию продукта из вариантов доставки - PullRequest
1 голос
/ 26 октября 2019

У меня есть два способа доставки: стандартная ставка (метод 1) и экспресс-почта с фиксированной ставкой (метод 2). Две категории продуктов, X и Z, могут использовать только метод 1, поэтому я хочу скрыть метод 2 от выбора доставки при оформлении заказа, если в корзине есть какие-либо товары из категории X или Z.

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

function specific_products_shipping_methods( $rates, $package ) {

   $product_ids = array( 39 ); // HERE set the product IDs in the array
   $method_id = 'Express_Post:5'; // HERE set the shipping method ID
   $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 )
       unset( $rates[$method_id] );

   return $rates;
}

Способ доставки 2 имеет идентификатор: 5, а категория продукта X - идентификатор: 39. Я отключил, сохранил, включил и сохранил способ доставки 2. Когда я добавляю вышеперечисленное как фрагмент кода в php-файл, он либо ломает сайт («Ваш сайт испытывает технические трудности»), либо после ввода адреса доставки я застрял(вращающееся колесо) и поэтому не может попасть в корзину, чтобы проверить, работает ли код.

[Обновление]

Большое спасибо @Kelvin Mariano за ваш ответ,Я пробовал ваш код несколько раз с несколькими вариантами на случай, если у меня что-то не так. Я больше не получаю никаких ошибок, но оба способа доставки отображаются, даже если в корзине нет товара.

Вывод эха для соответствующего метода доставки был следующим:

  [flat_rate:5] => WC_Shipping_Rate Object
  (
  [data:protected] => Array
    (`

        [id] => flat_rate:5
        [method_id] => flat_rate
        [instance_id] => 5
        [label] => Express Post

Код, который я пробовал, был следующим:

<code>    function bz_specific_products_shipping_methods( $rates, $package )  {

    $product_ids = array( 39 ); // HERE set the product IDs in the array
    //$method_id = 'flat_rate:5'; // HERE set the shipping method ID
    $method_id = 'flat_rate:5'; // HERE set the shipping method ID
    $found = false;

    /*
    //please remove this comment to view all shipping methods and  their   information
   `echo "<pre>";
    print_r( $rates );
    echo "
"; exit (); * /`// Цикл по элементам корзины Проверка определенных идентификаторов товаров foreach ($ package ['contents'] как $ cart_item) {if (in_array ($ cart_item ['product_id'], $ product_ids)) {$ found = true; break;}} if ($ found) {if (isset ($ нормы [$ method_id])) {unset ($ ставок [$ method_id]);}} вернуть $ ставок;} // использовать фильтр, это важно add_filter ('woocommerce_package_rates', 'bz_specific_products_shipping_methods', 10, 2);

Обновление 2

Array
(
[flat_rate:1] => WC_Shipping_Rate Object
    (
        [data:protected] => Array
            (
                [id] => flat_rate:1
                [method_id] => flat_rate
                [instance_id] => 1
                [label] => Flat rate Standard
                [cost] => 9.00

            )


    )

[flat_rate:5] => WC_Shipping_Rate Object
    (
        [data:protected] => Array
            (
                [id] => flat_rate:5
                [method_id] => flat_rate
                [instance_id] => 5
                [label] => Express Post
                [cost] => 11.77

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Я обнаружил, что приведенный выше код мешает работе плагина WooCommerce Advanced Free Shipping. Я деактивировал этот плагин и удалил код выше. Затем я установил Advanced Flat Rate Shipping для Woocommerce, и этот плагин позволял мне устанавливать параметры, которые не позволяли двум категориям продуктов участвовать в способе доставки 2.

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

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

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

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

Обратите внимание, что я поставилесли перед отменой сброса, чтобы избежать ошибок php

<code>function bz_specific_products_shipping_methods( $rates, $package ) {

   $product_ids = array( 149 ); // HERE set the product IDs in the array
   //$method_id = 'Express_Post:5'; // HERE set the shipping method ID
   $method_id = 'free_shipping:2'; // HERE set the shipping method ID
   $found = false;

   /*
    //please remove this comment to view all shipping methods and their information
   echo "<pre>";
   print_r( $rates );
   echo "
"; exit (); * / // Цикл по элементам корзины Проверка определенных идентификаторов продукта foreach ($ package ['contents'] как $ cart_item) {if (in_array ($ cart_item ['product_id'], $ product_ids)) {$ found = true; break;}} if ($ found) {if (isset ($ rate [$ method_id])) {unset ($ норм [$ method_id]). не давать имя коррили ваш woocommerce или php устарели, поэтому сообщение сайта испытывает трудности или цикл с белым экраном
...