Вот пользовательская функция зацепили в 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 вашей активной дочерней темы (или темы) ...