Іноді інтернет-магазину потрібно повідомити клієнтів певної країни, що онлайн-замовлення для них недоступне, але товари можна придбати у фізичному магазині.
У моїй задачі потрібно було, щоб клієнти з Молдови не могли оформити замовлення онлайн, але бачили повідомлення з адресою магазину.
Щоб це працювало правильно і красиво, я реалізувала поєднання фронтенд та бекенд.
Поєднання JS + PHP дозволяє:
Одразу показати користувачу повідомлення та приховати блоки checkout.
Гарантувати, що замовлення не пройде, навіть якщо JavaScript вимкнений.
JS (фронтенд) — гарний UX на сторінці Checkout
Вставляємо в файл functions.php. JavaScript показує повідомлення одразу після вибору країни та ховає блоки доставки, оплати і підсумку замовлення. Користувач бачить, що оформлення онлайн неможливе, і відразу отримує адресу магазину. Cелектори можуть відрізнятися і код потрібно буде адаптувати.
add_action(‘woocommerce_after_checkout_form’, function() {
?>
<script>
jQuery(function($){
const blockedCountries = [‘MD’]; // список країн, де замовлення онлайн не доступне
const noticeHTML = `
<div class=”checkout-country-notice”>
Дякуємо за інтерес до нашої продукції!
Ви можете придбати товари у нашому магазині за адресою ХХХХ
Для деталей та консультацій звертайтеся за телефоном XXXXXXX.
</div>`;
$(‘#billing_country_field’).append(noticeHTML);
function checkCountry(){
let selectedCountry = $(‘#billing_country’).val();
if(blockedCountries.includes(selectedCountry)){
$(‘.checkout-country-notice’).show();
$(‘#order_review, #order_review_heading, #payment, #shipping_method’).hide();
} else {
$(‘.checkout-country-notice’).hide();
$(‘#order_review, #order_review_heading, #payment, #shipping_method’).show();
}
}
checkCountry();
$(‘#billing_country’).on(‘change’, checkCountry);
});
</script>
<?php
});
PHP (бекенд) — надійна перевірка на сервері
JavaScript можна обійти, якщо він вимкнений у браузері. Тому потрібно додати серверну перевірку, яка блокує створення замовлення та показує те саме повідомлення.
add_action(‘woocommerce_checkout_process’, function(){
$blocked_countries = [‘MD’]; // список країн
$country = isset($_POST[‘billing_country’]) ? sanitize_text_field($_POST[‘billing_country’]) : ”;
if (in_array(strtoupper($country), $blocked_countries)) {
wc_add_notice(
‘Дякуємо за інтерес до нашої продукції!
Ви можете придбати товари у нашому магазині за адресою ХХХХ
Для деталей та консультацій звертайтеся за телефоном XXXXXXX.‘,
‘error’
);
}
});

