2017-02-13 10 views
2

В нашем магазине Woocommerce у нас есть 2 различных продукта (безалкогольный напиток) в 330 мл и 500 мл.Требуется минимальное количество вариаций для клиента из определенного состояния

330 мл продукт имеет вариации:

  • 1 шесть пакетов
  • 2 шесть пачек
  • 3 шесть пачек
  • 4 шесть пачек
  • 1 коробка (24 бутылок)

Продукт 500 мл имеет варианты:

  • 1 шесть пакет
  • 2 шесть пачек
  • 3 шесть пачек
  • 4 шесть пачек
  • 1 коробка (20 бутылок)

Мы только продавать:

  • Западная Австралия
  • Южная Австралия
  • Северная территория

Мы успешно ограничены продаж в 3 штатах выше, и мы не продаем в Виктории, Тасмании, Новый Южный Уэльс, Квинсленд или в данный момент (мы сосредоточив внимание на 3 западных большинстве государств).

Как мы требуем клиентов в Южной Австралии (SA), чтобы приобрести как минимум:

  • 4 шесть пачек по 300 мл продукта
  • или упаковке продукта 300 мл
  • или 4 шесть пачек в 500 мл продукта
  • или 1 упаковка продукта 500 мл

Любая помощь будет оценена.

Благодаря

ответ

1

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

Но вам нужно будет правильно установить данные в массивах в начале кода внутри функции, как было задано. Если ваши условия не совпадают, продукт не будет добавлен в корзину и (необязательно) будет отображаться пользовательское сообщение.

Вот этот код:

add_filter('woocommerce_add_to_cart_validation', 'addtocart_postcode_validation', 10, 5); 
function addtocart_postcode_validation($passed, $product_id, $quantity, $variation_id, $variations) { 

    // ==> Define HERE your array of targetted variations SLUGs values (NOT the Names) 
    $variation_slugs = array('4-six-packs', '1-carton-(20-bottles)', '1-carton-(24 bottles)'); 

    // ==> Define HERE your array of restricted states (coma separated) 
    $restricted_states = array('South Australia'); 

    if (is_user_logged_in()){ 

     // Getting current user ID 
     $user_id = get_current_user_id(); 

     // Getting current user address state 
     $user_state = get_user_meta($user_id, 'billing_state', true); 

     // targeting users from South Australia 
     if(in_array($user_state, $restricted_states)){ 
      foreach($variations as $variation){ 
       // if the variation value is corresponding to a value of our arrays => true (OK) 
       if(in_array($variation, $variation_slugs)){ 
        $passed = true; // OK 
       } else { 
        $passed = false; // NOT OK 
        // Stops the loop 
        break; 
       } 
      } 
     } else { 
      $passed = true; // OK for other states 
     } 

     // (optionally) Displaying an alert message only for targetted state and if is not corresponding to targetted variations slugs 
     if(!$passed) 
      wc_add_notice(__('Sorry, you are not allowed to add this product with the chosen packaging, please chose another allowed packaging.', 'woocommerce'), 'error'); 


    } else { // for non logged user — NOT OK 
     wc_add_notice(__('To add this product to cart, you need to be logged in.', 'woocommerce'), 'error'); 
     $passed = false; 
    } 

    return $passed; 
} 

код идет в function.php файле Вашего активного ребенка темы (или темы), или же в любом файле плагина.

При желании вы можете отобразить пользовательское сообщение, когда неправильные варианты занесена и, когда клиент не вошли в систему (на продукте добавить в корзину представление) ...

Этот код протестирован и работает ...


Если вы не уверены в правильности данных, которые вы должны установить в массивах, вы можете использовать перед тем эту маленькую функцию, что выход будет на странице корзины:

  • текущее состояние пользователя,
  • вариационных слизняки из пунктов добавленных в корзину ...

Вот этот код:

add_action('woocommerce_before_cart_table','output_cart_raw_data'); 
function output_cart_raw_data(){ 
    if (!WC()->cart->is_empty() && is_user_logged_in()){ 
     $user_id = get_current_user_id(); 
     $user_state = get_user_meta($user_id, 'billing_state', true); 

     // Displaying the current user 'billing_state': 
     echo '<br><div style="border:solid 2px #333; padding: 10px;"><p><b>User State:</b> <span style="font-style:italic; color: green;">'.$user_state.'</span></p>'; 

     // Iterating through each cart items 
     $count = 1; 
     foreach(WC()->cart->get_cart() as $cart_item){ 
      if($cart_item['variation_id'] > 0){ 
       echo "<p><b>Cart Item variable $count</b><br>"; 
       foreach($cart_item['variation'] as $var_key => $var_value){ 
        echo '<span>Attribute — Key: <span style="font-style:italic; color: green;">'.$var_key.'</span> => Value: <span style="font-style:italic; color: green;">'.$var_value.'</span></span><br>'; 
       } 
       echo '</p>'; $count++; 
      } 
     } 
     echo '</div>'; 
    } 
} 

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