WooCommerce nie ma pola na NIP, bo powstał na rynku, na którym nikt go nie potrzebuje. W polskim sklepie brakuje go od pierwszego zamówienia na firmę — i wtedy zaczyna się improwizacja: klient wpisuje numer w „Uwagach do zamówienia”, ktoś przepisuje go ręcznie, myli cyfrę, faktura wraca do korekty.
Są trzy sposoby, żeby to naprawić. Różnią się nie tyle efektem, co tym, ile pracy zostawiają na później.
Sposób 1: filtr w functions.php
Najszybszy i najczęściej spotykany. Dokładasz pole filtrem woocommerce_checkout_fields:
add_filter( 'woocommerce_checkout_fields', function ( $fields ) {
$fields['billing']['billing_nip'] = [
'label' => 'NIP',
'required' => false,
'class' => [ 'form-row-wide' ],
'priority' => 35,
];
return $fields;
} );
Potem trzeba jeszcze zapisać wartość i pokazać ją w panelu:
add_action( 'woocommerce_admin_order_data_after_billing_address', function ( $order ) {
echo '<p><strong>NIP:</strong> ' . esc_html( $order->get_meta( '_billing_nip' ) ) . '</p>';
} );
Wada, o której warto wiedzieć
Kod w functions.php znika razem z motywem. Przy zmianie szablonu za dwa lata pole zniknie, a razem z nim widok danych w panelu — dane zostaną w bazie, ale nikt ich nie zobaczy. Jeśli decydujesz się na tę drogę, przenieś kod do wtyczki własnej, choćby jednoplikowej.
Sposób 2: wtyczka do budowania pól
Wtyczki typu „Checkout Field Editor” pozwalają dodać pole klikaniem. Zaleta: nie dotykasz kodu. Wady dwie — takie wtyczki zwykle dokładają całą warstwę ustawień, z której użyjesz jednego procenta, a pole i tak nie ma walidacji NIP-u, więc literówka przechodzi dalej.
To dobre rozwiązanie, jeśli pól niestandardowych potrzebujesz więcej niż jedno i nie chcesz pisać kodu.
Sposób 3: pole z walidacją sumy kontrolnej
NIP ma cyfrę kontrolną, więc poprawność da się sprawdzić bez odpytywania jakiegokolwiek rejestru:
function tw_is_valid_nip( string $nip ): bool {
$nip = preg_replace( '~[^0-9]~', '', $nip );
if ( strlen( $nip ) !== 10 ) {
return false;
}
$weights = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];
$sum = 0;
for ( $i = 0; $i < 9; $i++ ) {
$sum += (int) $nip[ $i ] * $weights[ $i ];
}
return ( $sum % 11 ) === (int) $nip[9];
}
Ta funkcja odrzuci przestawione cyfry i większość literówek. Nie sprawdzi, czy firma istnieje — do tego trzeba API GUS-u — ale wyłapie to, co w praktyce psuje faktury najczęściej.
Który wybrać
Jeśli wystawiasz kilka faktur firmowych rocznie, wystarczy sposób pierwszy przeniesiony do własnej wtyczki. Jeśli zamówienia na firmę to znacząca część sprzedaży, walidacja zwróci się po pierwszej niepoprawionej fakturze.
Trzecią drogę wraz z przenoszeniem danych na maile i do eksportu spakowaliśmy w gotową wtyczkę — jeśli wolisz nie utrzymywać tego samodzielnie, znajdziesz ją w naszym katalogu.