- Kiedy sklep potrzebuje pola NIP?
- Jak działa VIES i dlaczego warto je integrować?
- Problem: WooCommerce nie ma natywnej obsługi NIP + walidacji unijnej
- Cel artykułu
- Co robi nasz plugin?
- Wygląd i UI — klasy walidacyjne (checkout-vies.css)
- Rejestracja pola NIP i integracja z WooCommerce (class-dc-vies-register.php)
- Logika naliczania VAT (class-dc-vat-logic.php)
- Główna klasa walidująca (class-dc-vies-validator.php) 🚀
- Zapisywanie NIP-u w meta zamówienia (class-dc-order-meta.php) 🗂️✨
- Wysyłka AJAX i endpointy (dc-woo-vies.php) ⚡🔌
- Instalacja i konfiguracja wtyczki ⚙️🧩
- Testy: jak sprawdzić, czy plugin działa? 🧪🟢🔴
- Podsumowanie 🎯✨
Jeśli prowadzisz sklep internetowy kierowany do firm, szybko zauważysz brak jednej bardzo ważnej rzeczy: możliwości podania NIP-u podczas składania zamówienia.
WooCommerce domyślnie traktuje wszystkich klientów jak konsumentów, co jest wystarczające dla sklepów B2C — ale całkowicie niewystarczające dla sprzedaży B2B, usług elektronicznych czy sprzedaży międzynarodowej.
Kiedy sklep potrzebuje pola NIP?
Pole NIP przydaje się zawsze wtedy, gdy:
-
sprzedajesz produkty lub usługi dla firm, które oczekują faktury VAT,
-
chcesz odróżnić klientów B2B od B2C na poziomie zamówień,
-
prowadzisz sprzedaż do firm z Unijnego Obszaru VAT (np. Niemcy, Francja, Italia),
-
musisz stosować odwrotne obciążenie — czyli VAT 0% dla firm z UE posiadających aktywny numer VAT UE,
-
prowadzisz księgowość, która wymaga prawidłowych danych nabywcy,
-
chcesz automatycznie określać stawkę VAT na podstawie numeru VAT/UE klienta.
W skrócie: jeśli wystawiasz faktury i obsługujesz klientów biznesowych — pole NIP to absolutna podstawa.
Właśnie takie detale najlepiej pokazują, że dobre projektowanie sklepów internetowych zaczyna się od realnych potrzeb biznesowych, a nie od domyślnych ustawień platformy.
Jak działa VIES i dlaczego warto je integrować?
VIES (VAT Information Exchange System) to unijny system do sprawdzania, czy dana firma jest aktywnym płatnikiem VAT UE.
Dzięki integracji VIES sklep może natychmiast ustalić:
-
czy numer VAT UE klienta jest prawidłowy,
-
czy firma posiada aktywność transgraniczną,
-
czy można zastosować stawę VAT 0% przy sprzedaży wewnątrzwspólnotowej.
To nie tylko wygoda — to również obowiązek podatkowy.
Jeśli sprzedajesz firmie z UE i zastosujesz 0% VAT bez weryfikacji numeru VAT UE, możesz narazić się na problemy podczas kontroli.
Dlatego warto, aby WooCommerce automatycznie:
-
sprawdził numer VAT w VIES,
-
ustawił właściwą stawkę VAT,
-
zapisał wynik walidacji w zamówieniu.
Problem: WooCommerce nie ma natywnej obsługi NIP + walidacji unijnej
WooCommerce w swojej podstawowej wersji:
-
nie posiada pola NIP,
-
nie waliduje VAT UE,
-
nie integruje się z VIES,
-
nie stosuje automatycznego 0% VAT,
-
nie daje żadnego API do obsługi odwrotnego obciążenia.
Efekt?
Sklepy, które chcą działać zgodnie z prawem i księgowością, muszą korzystać z zewnętrznych wtyczek lub tworzyć własne integracje — a większość dostępnych dodatków jest albo przesadnie rozbudowana, albo kompletnie nieprzystosowana do blokowego checkoutu (Block Checkout).
Cel artykułu
W tym wpisie pokazujemy gotowe i praktyczne rozwiązanie, które:
-
dodaje pole NIP do WooCommerce,
-
obsługuje klientów B2B i B2C,
-
automatycznie łączy się z systemem VIES,
-
ustawia odpowiednią stawkę VAT,
-
działa również z blockowym checkoutem WooCommerce,
-
posiada niezależną klasę PHP do weryfikacji numerów VAT UE — którą możesz użyć w dowolnym projekcie, nie tylko w WordPressie.
Przejdziemy krok po kroku przez działanie wtyczki, omawiając front-end, backend, logikę podatkową, zapisywanie metadanych oraz integrację z VIES. Na końcu udostępnimy też naszą klasę walidacyjną — gotową do wykorzystania w WooCommerce, PrestaShop, OpenCart, frameworkach PHP i autorskich systemach.
Co robi nasz plugin?
Zanim zagłębimy się w techniczne szczegóły, zobaczmy, co ten plugin faktycznie robi w Twoim sklepie. Jest lekki, szybki i powstał z myślą o realnych potrzebach sprzedaży B2B w WooCommerce 💼⚙️
Dodaje pole NIP/VAT na stronie zamówienia
WooCommerce nie oferuje pola NIP od siebie, dlatego plugin automatycznie dodaje je do formularza checkout. Działa niezależnie od kraju klienta i integruje się zarówno z klasycznym checkoutem, jak i nowymi blokami WooCommerce 🧩
Pokazuje je tylko wtedy, gdy klient zaznaczy „Chcę fakturę”
Nie ma potrzeby komplikować procesu zakupu osobom prywatnym. Pole NIP pojawia się dopiero wtedy, gdy klient świadomie wybierze opcję faktury. Dzięki temu checkout pozostaje czysty, lekki i przyjazny 🎯
Automatyczne czyszczenie i skracanie NIP-u
Pole samodzielnie dba o poprawność danych:
-
usuwa wszystko poza cyframi,
-
ogranicza polski NIP do 10 znaków,
-
nie pozwala na przypadkowe literówki.
Mniej błędów, mniej porzuconych formularzy — więcej porządku ✍️✨
Weryfikacja numeru w systemie VIES (AJAX → PHP → VIES)
Po wpisaniu numeru VAT UE uruchamia się automatyczna walidacja:
-
JS wysyła zapytanie AJAX,
-
PHP odpytuje VIES,
-
zwracany jest status: valid / invalid / not_applicable.
Podczas sprawdzania pole zmienia stan:
-
🔄 animacja ładowania,
-
🟢 zielona ramka przy numerze prawidłowym,
-
🔴 czerwona przy błędnym.
Całość trwa ułamek sekundy — lekko, płynnie i w pełni automatycznie.
Automatyczne VAT 0% dla firm z UE
Jeśli numer VAT UE jest prawidłowy i pochodzi z innego kraju UE, plugin sam:
-
aktywuje VAT EXEMPT,
-
wymusza przeliczenie koszyka,
-
ustawia stawkę 0% VAT zgodnie z zasadami WDT (Wewnątrzunijna Dostawa Towarów).
To właśnie ten moment, w którym magicznie znika VAT… zgodnie z prawem ⚡🧾
Błędny numer = standardowa stawka VAT
Gdy VIES zwróci brak aktywności:
-
VAT EXEMPT zostaje wyłączony,
-
WooCommerce stosuje standardowy VAT,
-
pole oznacza się na czerwono, aby klient widział, że coś jest nie tak.
Bez kombinowania i bez ryzyka dla sklepu lub księgowości 🚫💸
Zapisuje NIP w meta zamówienia
Po finalizacji zamówienia plugin:
-
zapisuje numer NIP,
-
zachowuje wynik walidacji,
-
udostępnia go w panelu WooCommerce i w danych dla faktury.
Porządek w danych = łatwiejsza księgowość i mniej telefonów „Proszę mi wysłać fakturę jeszcze raz…” 📂💡
Wygląd i UI — klasy walidacyjne (checkout-vies.css)
Nasza wtyczka nie tylko sprawdza NIP w VIES, ale też jasno komunikuje klientowi, co dzieje się z numerem, dzięki specjalnym klasom CSS. Dzięki nim checkout reaguje natychmiast, a użytkownik dokładnie rozumie, na jakim etapie jest weryfikacja. Wszystko działa płynnie i przyjaźnie — bez irytujących komunikatów, popupów czy przeładowań strony.
Ukrywanie natywnego pola WooCommerce
WooCommerce Blocks domyślnie generuje własne pole „additional fields”. Aby uniknąć duplikacji i chaosu w formularzu, plugin ukrywa to natywne pole i prezentuje tylko własne, prawidłowe pole NIP.
Dzięki temu klient widzi dokładnie jedno pole, we właściwym miejscu i z całą obsługą walidacji ✂️🧾
Zielona ramka — gdy NIP jest prawidłowy
Po poprawnej odpowiedzi z VIES pole automatycznie otrzymuje zielone obramowanie.
To wizualny sygnał:
🟢 „Numer jest prawidłowy, możemy stosować procedury B2B.”
Nie ma tu zbędnych komunikatów tekstowych — subtelny kolor robi wszystko za nas. To szybkie, czytelne i intuicyjne.
Czerwona ramka — gdy NIP jest nieprawidłowy
Gdy numer nie przejdzie walidacji, pole zmienia kolor na czerwony:
🔴 „Coś jest nie tak z numerem VAT — sprawdź go jeszcze raz.”
Klient od razu rozumie, dlaczego VAT 0% się nie pojawia.
Nie musi czytać komunikatów, bo graficzny sygnał mówi wszystko.
Spinner ładowania — w trakcie sprawdzania numeru
Podczas wysyłania zapytania do VIES pole przechodzi w tryb „oczekiwania”:
-
pojawia się subtelna animacja ładowania 🔄
-
pole lekko blednie, informując, że trwa proces
-
kursor zmienia się na „czekaj”
To drobny, ale bardzo ważny element UX. Klient widzi, że system pracuje, a nie zawiesił się. Checkout staje się dzięki temu bardziej profesjonalny i przewidywalny.
Rejestracja pola NIP i integracja z WooCommerce (class-dc-vies-register.php)
Aby cały mechanizm VIES działał jak należy, w checkoutcie musi pojawić się właściwie zarejestrowane pole NIP/VAT. To właśnie rola klasy class-dc-vies-register.php — niewidocznego bohatera, który spina frontend, backend i WooCommerce w jedną spójną całość ⚙️🧩
Ta część pluginu sprawia, że WooCommerce zaczyna rozumieć, czym jest NIP, gdzie ma się pojawić i jak ma reagować na zmiany w danych klienta. Bez niej reszta układanki nie miałaby szans działać.
Dodanie pola checkoutowego 🧾✨
Plugin rejestruje nowe pole NIP/VAT i dodaje je do formularza zakupowego WooCommerce. Dzięki temu pojawia się ono naturalnie obok danych bilingowych — tam, gdzie klient się go spodziewa.
To pole nie jest zwykłym inputem:
-
ma swoją własną logikę,
-
jest skonfigurowane pod późniejszą walidację,
-
działa w starym i nowym checkoutcie,
-
współpracuje z blokami WooCommerce.
Checkout w końcu staje się przyjazny dla B2B 🙌
ID pola: dc-vies/nip_vat 🔖
Każde pole musi mieć identyfikator, ale tutaj ma on szczególne znaczenie.dc-vies/nip_vat to ID, pod którym komunikują się:
-
JavaScript (walidacja i dynamiczne zmiany) ⚡
-
CSS (zielone, czerwone stany, spinner) 🎨
-
backend (zapis i logika podatkowa) 🧮
-
WooCommerce Blocks (renderowanie odpowiedniej sekcji) 🧱
To centralny „adres”, dzięki któremu wszystkie warstwy pluginu wiedzą, z którym polem pracują.
Powiązanie z mechanizmem „Additional Fields” 📦🚫📦
WooCommerce Blocks próbują automatycznie dodać pole NIP w sekcji „Additional fields”. Gdybyśmy to zostawili, klient zobaczyłby dwa pola NIP, z których każde działa inaczej — bałagan murowany.
Dlatego plugin:
-
przechwytuje natywne pole,
-
ukrywa je,
-
zostawia tylko własne pole z pełną obsługą walidacji.
Efekt?
Checkout jest czysty, spójny i ma jedno, właściwe pole NIP. Nic nie duplikuje się ani nie miesza 🔍👌
Integracja z billing_country 🌍🏁
NIP nie istnieje w próżni. Jego znaczenie zależy od kraju klienta:
-
Polska → 10 cyfr, brak VAT 0% 🇵🇱
-
UE → możliwy VAT 0% przy aktywnym numerze 🇪🇺
-
poza UE → VIES niewłaściwy 🌐
Dlatego plugin aktywnie śledzi i wykorzystuje kraj bilingowy:
-
JS reaguje na zmianę kraju w czasie rzeczywistym 🖥️⚡
-
backend interpretuje numer zgodnie z jego pochodzeniem
-
logika podatkowa działa precyzyjnie, bez zgadywania
Dzięki temu checkout zachowuje się inteligentnie — numer NIP jest zawsze sprawdzany i interpretowany w kontekście odpowiedniego kraju, a klient dostaje prawidłowe podatki bez dodatkowych kroków 🎯📊
Logika naliczania VAT (class-dc-vat-logic.php)
Weryfikacja numeru VAT UE to jedno — ale prawdziwa magia zaczyna się dopiero wtedy, gdy sklep potrafi automatycznie zmienić stawkę VAT w zależności od wyniku. Tą częścią procesu zarządza klasa class-dc-vat-logic.php, która decyduje, ile podatku klient zapłaci i czy WooCommerce może zastosować odwrotne obciążenie.
To moduł, który łączy dane z pola NIP, odpowiedź VIES i ustawienia WooCommerce w jedną, spójną logikę podatkową. Całość dzieje się w tle, bez udziału klienta — szybko, poprawnie i zgodnie z przepisami 🧮⚡
Ustawianie lub usuwanie VAT EXEMPT po walidacji 🎚️💼
Kiedy VIES odpowie, klasa podejmuje kluczową decyzję:
-
jeśli numer VAT UE jest prawidłowy i spełnia warunki → klient otrzymuje status VAT EXEMPT,
-
jeśli numer jest niepoprawny lub niewłaściwy → VAT EXEMPT zostaje usunięty, a WooCommerce nalicza standardową stawkę VAT.
VAT EXEMPT to w WooCommerce specjalny stan podatkowy. Dzięki niemu system:
-
automatycznie przelicza koszyk,
-
usuwa podatek z produktów i wysyłki,
-
wyświetla odpowiednią informację w podsumowaniu.
Wszystko dzieje się natychmiast i bez ręcznego klikania przez klienta 🔄✨
Sprawdzanie kraju klienta 🌍🔍
Klasa nie działa „w ciemno”.
Przed podjęciem decyzji o podatkach analizuje kraj bilingowy (billing_country), bo to właśnie on decyduje o zastosowaniu odpowiedniej procedury:
-
inna logika działa dla Polski,
-
inna dla UE,
-
jeszcze inna dla krajów trzecich.
Dzięki temu podatki są naliczane dokładnie tak, jak wymaga tego prawo, a sklep nie ma ryzyka zastosowania niewłaściwej stawki.
Scenariusz 1: Klient z Polski 🇵🇱 — weryfikacja tylko formalna
Dla klientów z Polski:
-
numer NIP może zostać zweryfikowany,
-
ale VAT nigdy nie spada do 0%,
-
niezależnie od tego, czy firma jest płatnikiem VAT UE.
To wynika z przepisów — sprzedaż krajowa zawsze podlega krajowej stawce VAT.
Dlatego plugin traktuje polskie NIP-y czysto informacyjnie:
🟢 weryfikacja działa,
🟡 VAT EXEMPT nie jest możliwy.
Scenariusz 2: Klient z UE 🇪🇺 — VAT 0% przy prawidłowym numerze
To najważniejszy scenariusz B2B w WooCommerce.
Jeśli klient pochodzi z innego państwa UE i poda aktywne VAT ID potwierdzone w VIES:
-
włącza się VAT EXEMPT,
-
stawka spada do 0%,
-
koszyk automatycznie się przelicza,
-
zamówienie jest oznaczane jako sprzedaż wewnątrzwspólnotowa.
To pełna automatyzacja VAT WDT — zgodna z prawem, łatwa dla klientów i księgowości 🚀💶
Scenariusz 3: Klient spoza UE 🌐 — VIES ignorowany
Kraje poza UE nie działają w systemie VIES.
Dlatego:
-
numer NIP/VAT jest dla nas nieistotny,
-
walidacja jest pomijana,
-
VAT EXEMPT nie jest uruchamiany,
-
WooCommerce stosuje domyślną stawkę podatku dla sprzedaży zagranicznej.
To prosta i logiczna zasada:
tam, gdzie nie działa VIES → plugin niczego nie wymusza i nie komplikuje.
Klasa class-dc-vat-logic.php dba o to, aby każdy klient — niezależnie od kraju — otrzymał prawidłową stawkę VAT, a Ty nie musisz podejmować żadnych ręcznych decyzji. Wszystko dzieje się automatycznie, zgodnie z prawem i bez niepotrzebnego ryzyka ⚖️✨
Główna klasa walidująca (class-dc-vies-validator.php) 🚀
Cały plugin kręci się wokół jednego kluczowego elementu: klasy odpowiedzialnej za komunikację z VIES. To ona bierze numer VAT, kraj, odpytuje unijny system i mówi nam wprost:
🟢 „firma jest aktywnym płatnikiem VAT UE”
🔴 „numer jest nieprawidłowy”
⚪ „dla tego kraju VIES nie ma zastosowania”
Klasa class-dc-vies-validator.php jest napisana tak, żeby można ją było wyrwać z WordPressa i użyć w dowolnym projekcie PHP – o tym za chwilę 😉
Połączenie z usługą VIES (SOAP / API UE) 🌐🧩
Sercem walidatora jest metoda, która:
-
przyjmuje kraj i numer VAT (np.
DE+ numer), -
buduje zapytanie do VIES (SOAP lub oficjalny endpoint UE),
-
wysyła żądanie do serwera Komisji Europejskiej,
-
odbiera odpowiedź i mapuje ją na prosty, zrozumiały wynik.
Typowe statusy, które obsługuje klasa:
-
valid– numer VAT UE istnieje i jest aktywny 🟢 -
invalid– numer nie istnieje lub jest nieaktywny 🔴 -
not_applicable– kraj nie podlega VIES (np. poza UE) ⚪ -
sytuacje wyjątkowe:
-
błąd po stronie serwera VIES,
-
brak odpowiedzi,
-
problemy z połączeniem.
-
Zamiast rzucać surowymi wyjątkami w środek sklepu, klasa zwraca uładzone, przewidywalne statusy, z którymi reszta pluginu potrafi sobie poradzić.
Zabezpieczenia 🛡️
Walidacja VAT UE to nie tylko „wyślij numer i zobacz, co wróci”. Klasa musi być odporna na:
-
dziwne dane użytkownika,
-
próby wstrzyknięcia śmieci,
-
błędy po stronie usługi VIES.
Dlatego w środku robimy kilka rzeczy:
-
filtry wejścia – oczyszczamy numer z niepotrzebnych znaków, normalizujemy format,
-
walidacja formatu – sprawdzamy, czy numer ma sens dla danego kraju, zanim jeszcze odpytamy VIES,
-
fallback na błędzie API – gdy VIES nie działa (a zdarza się to częściej, niż byśmy chcieli), klasa nie wywala całego checkoutu, tylko np. zwraca status „błąd usługi” i pozwala logice VAT zareagować bezpiecznie (zwykle: naliczyć standardowy VAT).
Dzięki temu Twój sklep nie zależy w 100% od kaprysów zewnętrznego systemu, a błędy VIES nie psują konwersji 💸
Poniżej załączam pełny kod klasy. Nie wymaga composera 😉
<?php
class ViesValidator
{
/**
* @var string Adres URL usługi VIES SOAP
*/
private const VIES_WSDL_URL = 'https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
/**
* Weryfikuje numer NIP (VAT ID) w systemie VIES.
*
* @param string $vatId Numer NIP do sprawdzenia (np. "PL1234567890").
* @return bool|array Zwraca true, jeśli NIP jest ważny, false, jeśli jest nieprawidłowy,
* lub tablicę z pełnymi danymi, jeśli weryfikacja się powiedzie
* (zgodnie z Twoim życzeniem).
*/
public function validateVatId(string $vatId): bool|array
{
// 1. Oczyszczenie i walidacja formatu NIP-u
$vatId = trim($vatId);
// Sprawdzenie, czy NIP jest pusty
if (empty($vatId)) {
return false;
}
// Wydzielenie kodu kraju i numeru NIP
// Zakładamy, że kod kraju to pierwsze 2 litery (np. PL, DE, FR)
$countryCode = strtoupper(substr($vatId, 0, 2));
$vatNumber = substr($vatId, 2);
// Krótka weryfikacja, czy mamy kod kraju i numer.
// W bardziej rozbudowanej klasie można dodać walidację RegExp dla każdego kraju.
if (strlen($countryCode) !== 2 || empty($vatNumber)) {
// Można tu rzucić wyjątek lub zwrócić false, w zależności od potrzeb
return false;
}
try {
// 2. Utworzenie klienta SOAP
$client = new SoapClient(self::VIES_WSDL_URL, [
'trace' => 1, // Włączenie śledzenia błędów
'exceptions' => true, // Użycie wyjątków dla błędów SOAP
'cache_wsdl' => WSDL_CACHE_BOTH // Cache WSDL
]);
// 3. Wywołanie metody checkVat
$response = $client->checkVat([
'countryCode' => $countryCode,
'vatNumber' => $vatNumber
]);
// 4. Analiza odpowiedzi
if (isset($response->valid) && $response->valid === true) {
// Jeśli jest ważny, zbieramy i zwracamy pełne dane w tablicy
$result = [
'valid' => $response->valid,
'countryCode' => $response->countryCode,
'vatNumber' => $response->vatNumber,
'requestDate' => $response->requestDate,
'name' => $response->name,
'address' => $response->address,
'identifier' => $response->identifier ?? null, // Nowsze pola
'traderName' => $response->traderName ?? null,
'traderCompanyType' => $response->traderCompanyType ?? null,
'traderAddress' => $response->traderAddress ?? null,
];
// Zgodnie z Twoim życzeniem, zwracamy tablicę z danymi, jeśli są dostępne
// i NIP jest ważny.
return $result;
} else {
// NIP jest nieprawidłowy lub VIES go nie odnalazł
return false;
}
} catch (SoapFault $e) {
// Obsługa błędów SOAP (np. usługa niedostępna, przekroczono limit zapytań)
error_log("Błąd VIES SOAP: " . $e->getMessage());
// W przypadku błędu VIES, zgodnie z Twoją logiką,
// jeśli VIES "nie zwraca danych" z powodu błędu, zwracamy false.
return false;
} catch (\Exception $e) {
// Inne nieoczekiwane błędy
error_log("Nieoczekiwany błąd w ViesValidator: " . $e->getMessage());
return false;
}
}
/**
* Alternatywna metoda zwracająca tylko true/false, jeśli jest to preferowane.
* * @param string $vatId Numer NIP.
* @return bool True, jeśli ważny, false w przeciwnym razie lub w razie błędu.
*/
public function isVatIdValid(string $vatId): bool
{
$result = $this->validateVatId($vatId);
// Sprawdza, czy wynik jest tablicą (czyli był ważny), lub czy jest prostym true
return is_array($result) || $result === true;
}
}
$validator = new ViesValidator();
// Poprawny polski NIP (dane firmy testowej)
$testVatId_Valid = 'PL9241844419';
$result_valid = $validator->validateVatId($testVatId_Valid);
echo "--- Weryfikacja NIP: {$testVatId_Valid} --- \n";
if ($result_valid === false) {
echo "NIP jest nieprawidłowy lub wystąpił błąd.\n";
} elseif (is_array($result_valid)) {
echo "NIP jest PRAWIDŁOWY. Zwrócone pełne dane:\n";
print_r($result_valid);
}
echo "\n--- Weryfikacja NIP: Błędny NIP --- \n";
$testVatId_Invalid = 'PL1234567899';
$result_invalid = $validator->validateVatId($testVatId_Invalid);
if ($result_invalid === false) {
echo "NIP jest nieprawidłowy lub wystąpił błąd (zgodnie z oczekiwaniami).\n";
} else {
echo "Wystąpił nieoczekiwany wynik dla błędnego NIP-u.\n";
}
Zapisywanie NIP-u w meta zamówienia (class-dc-order-meta.php) 🗂️✨
Weryfikacja NIP-u i ustalenie stawki VAT to jedno — ale równie ważne jest to, co dzieje się z tymi danymi po złożeniu zamówienia. WooCommerce musi zapisać nie tylko numer, który podał klient, ale też wynik walidacji.
Właśnie tym zajmuje się klasa class-dc-order-meta.php — cichy księgowy całego pluginu 📚🧮
Ta część systemu odpowiada za porządek, kompletność danych i wygodę późniejszego raportowania. Dzięki niej wszystkie dane podatkowe lądują we właściwych polach i mogą być później łatwo wykorzystane — w fakturach, panelu administracyjnym, a nawet w narzędziach księgowych.
Zapis numeru NIP do meta zamówienia (_dc_vies_nip) 🏷️
Gdy klient wpisze numer NIP i przejdzie przez walidację, plugin zapisuje go pod kluczem:
_dc_vies_nip
Dlaczego meta, a nie custom table?
Bo WooCommerce wykorzystuje meta pola jako standardowy sposób przechowywania danych o zamówieniach. Dzięki temu:
-
numer NIP jest dostępny w każdym miejscu, gdzie WooCommerce udostępnia meta (REST API, eksporty, wtyczki fakturujące),
-
nie wymaga osobnych tabel ani skomplikowanych migracji,
-
jest automatycznie powiązany z zamówieniem — zawsze i bez wyjątków.
Klient podał numer → my zapisujemy go na stałe. Prosto i skutecznie.
Zapis wyniku walidacji VIES 🔍🟢🔴
Sama wartość NIP-u to za mało.
Dla księgowości i poprawnego rozliczenia potrzebny jest również status walidacji, czyli:
-
czy numer był prawidłowy,
-
czy system VIES potwierdził aktywność firmy,
-
czy można było zastosować VAT 0%,
-
czy walidacja się nie powiodła.
Dlatego plugin zapisuje także wynik walidacji — zwykle pod osobnym meta polem, np.:
-
valid— numer potwierdzony -
invalid— numer błędny -
error— VIES zgłosił błąd -
not_applicable— kraj spoza UE
Dzięki temu mamy zawsze pełną historię podatkową danego zamówienia 📊💼
Prezentacja danych w panelu WooCommerce 🖥️👀
Aby administrator sklepu mógł szybko sprawdzić, jaki numer podał klient i jaki był wynik weryfikacji, plugin wyświetla te informacje:
-
w szczegółach zamówienia,
-
w sekcji meta danych klientów,
-
często obok danych bilingowych.
Administrator widzi od razu:
-
numer NIP,
-
status VAT (np. „VAT 0% — firma z UE”),
-
ewentualne błędy zwrócone przez VIES.
Zero szukania. Zero zgadywania. Wszystko pod ręką 👍
Możliwość eksportu dla księgowości 📤📑
Ponieważ wszystkie dane są zapisane w meta zamówienia, można je łatwo:
-
eksportować do CSV,
-
pobierać przez REST API,
-
przekazywać do systemów fakturowych,
-
pobierać jednym zapytaniem w raportach sprzedażowych,
-
integrować z zewnętrznymi narzędziami księgowymi.
To ogromne ułatwienie dla firm, które obsługują sprzedaż B2B lub międzynarodową.
Księgowość dostaje komplet danych: NIP, status VIES, kraj, VAT 0% lub standardowy — i może przetwarzać je bez dodatkowych pytań do sklepu ❇️💡
Wysyłka AJAX i endpointy (dc-woo-vies.php) ⚡🔌
Cały proces walidacji NIP-u w WooCommerce działa tak płynnie dzięki sprawnej komunikacji między frontendem (JavaScript) a backendem (PHP).
Właśnie plik dc-woo-vies.php odpowiada za połączenie tych dwóch światów — rejestruje skrypty, przekazuje parametry i obsługuje zapytania AJAX, które uruchamiają walidator VIES.
To tutaj dzieje się prawdziwa „wymiana danych” między checkoutem a systemem VIES 🇪🇺💬
Rejestracja skryptów JS i CSS 📦✨
Pierwszym krokiem jest dodanie do WooCommerce:
-
naszego pliku JavaScript, który obsługuje:
-
pokazywanie pola NIP,
-
czyszczenie numeru,
-
wysyłanie zapytania AJAX,
-
dodawanie klas walidacyjnych (
vies-valid,vies-invalid,vies-loading)
-
-
pliku CSS, który odpowiada za zielone i czerwone ramki oraz spinner walidacji.
Dzięki tej rejestracji WooCommerce dokładnie wie, kiedy i gdzie załadować nasze skrypty — wyłącznie na stronie checkoutu i koszyka, bez obciążania reszty sklepu 🚀
wp_localize_script → dc_vies_params 🧩🔧
Aby frontend wiedział:
-
pod jaki adres wysłać zapytanie AJAX,
-
jaki nonce wykorzystać do zabezpieczeń,
-
jakie ustawienia ma plugin,
backend przesyła te dane za pomocą wp_localize_script.
Dzięki temu w JavaScript pojawia się obiekt:
dc_vies_params
zawierający parametry takie jak:
-
adres AJAX,
-
klucz bezpieczeństwa (nonce),
-
dodatkowe ustawienia logiki.
Frontend nie musi niczego „zgadywać” — dostaje wszystko gotowe w jednym obiekcie 🔐📡
AJAX action dc_vies_validate_nip 🔄📨
Gdy użytkownik wpisze NIP, JavaScript wysyła zapytanie do WordPressa:
action=dc_vies_validate_nip
Ten endpoint:
-
odbiera numer i kraj,
-
sprawdza nonce (czy zapytanie jest legalne),
-
odpytuje klasę walidującą VIES,
-
zwraca JSON z wynikiem, np.:
-
valid -
invalid -
not_applicable -
lub informacje o błędzie
-
To serce całej komunikacji z EU VIES.
Bez tego checkout nie miałby żadnego sposobu, by zweryfikować klienta w tle ⚙️🌐
Zabezpieczenia: wp_verify_nonce 🛡️🔒
Ponieważ zapytania AJAX przychodzą z przeglądarki, muszą być zabezpieczone.
Do tego używamy wp_verify_nonce, który:
-
sprawdza, czy zapytanie pochodzi z bieżącej sesji,
-
czy nie jest próbą wstrzyknięcia danych,
-
czy użytkownik nie podmienił parametrów ręcznie.
Jeśli nonce jest nieprawidłowy → zapytanie nie jest przetwarzane.
Dzięki temu żaden bot czy skrypt nie wykorzysta endpointu do spamowania lub prób ataków 🔐🛑
Logiczne rozgałęzienie w backendzie 🧠⚙️
Po odebraniu zapytania backend przechodzi przez serię kroków:
-
Sprawdzenie poprawności danych wejściowych
– czy kraj jest ustawiony?
– czy numer wygląda sensownie? -
Obsługa krajów spoza UE
→ natychmiastowy statusnot_applicable -
Wywołanie walidatora VIES
→ próba połączenia z serwisem Komisji Europejskiej -
Interpretacja odpowiedzi
– jeśli VIES zwróci pozytywny wynik →valid
– jeśli numer nie istnieje →invalid
– jeśli VIES ma błąd → status błędu, bez psucia checkoutu -
Przesłanie wyniku do frontendowego JS
→ checkout zmienia stawkę VAT
→ pole dostaje zieloną lub czerwoną ramkę
→ spinner znika
Wszystko dzieje się w ułamku sekundy, a klient widzi tylko elegancką animację i kolor ramki 💫🟢🔴
Instalacja i konfiguracja wtyczki ⚙️🧩
To jedna z tych wtyczek, które nie wymagają żadnej konfiguracji.
Zero ustawień, zero formularzy, zero dodatkowych opcji — po prostu instalujesz, włączasz i wszystko działa automatycznie.
Idealne rozwiązanie dla sklepów, które chcą uruchomić walidację VAT UE bez godzin spędzonych w panelu.
Jak zainstalować wtyczkę? 🚀
-
Pobierz paczkę ZIP
– link do pobrania z Design Cart (wkleisz go niżej)
– lub pobierz źródła z GitHub (link również wkleisz niżej) -
Wejdź w WordPress → Wtyczki → Dodaj nową → Wyślij wtyczkę na serwer
-
Wybierz pobrany ZIP i kliknij „Zainstaluj”
-
Kliknij „Włącz wtyczkę”
I to wszystko — od teraz checkout WooCommerce:
-
wyświetla pole NIP,
-
waliduje numer w VIES,
-
ustawia VAT automatycznie,
-
zapisuje dane w zamówieniach,
-
działa w klasycznym i blokowym checkoutcie.
Bez żadnych dodatkowych kroków 💡✨
Skąd pobrać wtyczkę? 📥
Testy: jak sprawdzić, czy plugin działa? 🧪🟢🔴
Po włączeniu wtyczki warto wykonać kilka szybkich testów, aby upewnić się, że wszystko działa poprawnie — zarówno po stronie checkoutu, jak i w logice podatkowej WooCommerce. Poniższe kroki sprawdzają realne scenariusze sklepowe, w których wtyczka powinna zachować się w określony sposób.
Test 1: Polski NIP (numer krajowy) 🇵🇱
Cel: sprawdzić, czy plugin poprawnie przyjmuje polski NIP i jednocześnie nie stosuje VAT 0%.
Kroki:
-
Wybierz kraj „Polska”.
-
Zaznacz opcję „Chcę fakturę”.
-
Wpisz prawidłowy polski NIP (10 cyfr).
-
Sprawdź, czy:
-
pole podświetli się na zielono 🟢,
-
VAT pozostaje naliczony (23% lub inny krajowy),
-
w meta zamówienia zapisze się numer + status (valid).
-
Oczekiwany wynik:
Walidacja działa, ale VAT się nie zmienia, bo sprzedaż krajowa zawsze podlega krajowej stawce VAT.
Test 2: Numer VAT z UE (np. DE / FR / IT) 🇩🇪🇫🇷🇮🇹
Cel: sprawdzić, czy działa automatyczna walidacja VAT UE i przełączenie checkoutu na VAT 0%.
Kroki:
-
Ustaw kraj na Niemcy, Francję lub Włochy.
-
Wpisz prawidłowy numer VAT UE dla wybranego kraju.
-
Poczekaj, aż spinner zniknie.
-
Sprawdź, czy:
-
pole podświetli się na zielono 🟢,
-
koszyk automatycznie przełączy się na 0% VAT,
-
WooCommerce oznaczy klienta jako „VAT EXEMPT”,
-
meta zamówienia zapisze pozytywny status.
-
Oczekiwany wynik:
Checkout automatycznie przechodzi w tryb WDT (wewnątrzwspólnotowa dostawa towarów) z VAT 0%.
To najważniejszy test całego pluginu — właśnie tu widać jego pełną moc ⚡🇪🇺
Test 3: Błędny lub przypadkowy numer VAT ❌🔎
Cel: upewnić się, że wtyczka nie dopuści błędnego numeru do uzyskania VAT 0% i poprawnie informuje użytkownika o problemie.
Kroki:
-
Ustaw dowolny kraj UE (np. DE).
-
Wpisz losowy numer typu „123”.
-
Sprawdź, czy:
-
pole świeci na czerwono 🔴,
-
VAT pozostaje naliczony,
-
WooCommerce nie ustawia VAT EXEMPT,
-
meta zamówienia zapisuje status invalid,
-
Oczekiwany wynik:
Checkout działa bezpiecznie — nie ma możliwości uzyskania 0% VAT bez prawidłowego i aktywnego numeru VAT UE.
Test 4: Serwis VIES offline lub niedostępny 🌐⚠️
Serwery VIES potrafią być przeciążone i czasami „padają”.
W takim przypadku wtyczka nie może blokować checkoutu ani przepuszczać błędnych danych.
Cel: sprawdzić, czy wtyczka poprawnie obsługuje awarie VIES.
Kroki:
-
Tymczasowo odłącz internet lub zasymuluj błąd (np. wpisz numer spoza UE).
-
Wpisz numer VAT UE (np. DE).
-
Sprawdź, czy:
-
pole nie świeci się na zielono,
-
domyślna stawka VAT zostaje,
-
klient może dokończyć zamówienie,
-
meta zapisuje informację o błędzie („error” lub fallback).
-
Oczekiwany wynik:
Checkout działa normalnie, system nie zawiesza się i nie przepuszcza VAT 0%.
Błąd traktowany jest bezpiecznie — lepiej naliczyć VAT niż odliczyć go niepoprawnie.
Podsumowanie 🎯✨
Wtyczka do wyświetlania pola NIP i automatycznej walidacji VIES w WooCommerce rozwiązuje realny, codzienny problem sklepów obsługujących klientów B2B w Polsce i całej Unii Europejskiej. WooCommerce domyślnie nie posiada obsługi NIP, nie wspiera VIES, nie zna logiki podatkowej VAT UE — ale dzięki temu pluginowi cały proces staje się prosty, szybki i w pełni zgodny z przepisami.
Dostajesz kompletne rozwiązanie, które:
-
dodaje inteligentne pole NIP/VAT we właściwym miejscu checkoutu,
-
automatycznie weryfikuje numer w systemie VIES,
-
stosuje poprawną stawkę VAT (w tym VAT 0% dla firm z UE),
-
zapisuje wszystkie dane i statusy w zamówieniu,
-
działa zarówno w klasycznym, jak i blokowym checkoutcie,
-
nie wymaga żadnej konfiguracji — po prostu działa od razu po instalacji.
Cała logika jest przejrzysta, modularna i gotowa do rozszerzeń.
A dzięki temu, że udostępniasz klasę walidującą VIES jako samodzielny komponent, zyskują na tym nie tylko użytkownicy WooCommerce, ale także programiści pracujący z PrestaShop, OpenCart, Joomla czy własnymi systemami.
To lekkie, praktyczne narzędzie, które eliminuje błędy, poprawia konwersję B2B, usprawnia fakturowanie i zwiększa zgodność sklepu z wymaganiami podatkowymi UE.
Jednym kliknięciem dodajesz do swojego e-commerce funkcjonalność, która w wielu systemach kosztuje setki złotych — a u Ciebie jest dostępna od ręki 💼⚡
Sklepy internetowe Woocommerce
Sklepy internetowe Opencart
Sklepy internetowe Prestashop
Sklepy internetowe Magento
Strony internetowe Joomla!
Strony Internetowe Wordpress




