Jak dodać pole NIP do zamówienia w WooCommerce: trzy sposoby

4 min czytania karol
Klawiatura laptopa w ciemności, podświetlone klawisze

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: kilka linijek kodu

Najszybszy. Jak go napisać, zależy od tego, którą kasę ma Twój sklep - a w nowych instalacjach WooCommerce domyślna jest kasa blokowa.

Kasa blokowa

Pole rejestruje się funkcją woocommerce_register_additional_checkout_field (WooCommerce 8.9 i nowszy):

add_action( 'woocommerce_init', function () {
    woocommerce_register_additional_checkout_field( [
        'id'       => 'mojsklep/nip',
        'label'    => 'NIP',
        'location' => 'order',
        'type'     => 'text',
        'required' => false,
    ] );
} );

Zapisu i widoku w panelu nie trzeba dopisywać - WooCommerce sam zapisuje wartość przy zamówieniu i pokazuje ją w szczegółach zamówienia, w panelu i u klienta.

Kasa klasyczna

Jeśli sklep używa jeszcze skrótu

, pole dokładasz filtrem woocommerce_checkout_fields. W kasie blokowej ten filtr nic nie robi: kod nie zgłasza błędu, a pola po prostu nie ma - więcej o tym we wpisie o blokowej kasie.

add_filter( 'woocommerce_checkout_fields', function ( $fields ) {
    $fields['billing']['billing_nip'] = [
        'label'    => 'NIP',
        'required' => false,
        'class'    => [ 'form-row-wide' ],
        'priority' => 35,
    ];
    return $fields;
} );

W klasycznej kasie wartość trzeba jeszcze samemu pokazać 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.

Dłonie piszące na klawiaturze podświetlonej na turkusowo
NIP to jedno pole w formularzu. Pytanie brzmi, gdzie trafia dalej.

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.

Jak podpiąć to do kasy blokowej

Sama funkcja niczego jeszcze nie sprawdza - musi ją wywołać kasa. Pole zarejestrowane sposobem pierwszym przyjmuje własną funkcję sprawdzającą pod kluczem validate_callback. WooCommerce odmówi rejestracji pola, jeśli nie będzie to poprawne wywołanie, więc literówka w nazwie funkcji nie przejdzie po cichu:

add_action( 'woocommerce_init', function () {
    woocommerce_register_additional_checkout_field( [
        'id'                => 'mojsklep/nip',
        'label'             => 'NIP',
        'location'          => 'order',
        'type'              => 'text',
        'required'          => false,
        'validate_callback' => function ( $wartosc ) {
            if ( '' === $wartosc || tw_is_valid_nip( $wartosc ) ) {
                return true;
            }

            return new WP_Error( 'nip_bledny', 'NIP ma błędną sumę kontrolną - sprawdź cyfry.' );
        },
    ] );
} );

Puste pole przechodzi, bo NIP podaje tylko część klientów. Gdybyś chciał go wymagać przy zakupie na firmę, samo required nie wystarczy - wymusiłoby numer także przy zakupie prywatnym. Warunek trzeba oprzeć na innym polu, na przykład na zaznaczonym „chcę fakturę na firmę”.

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.

Walidacja NIP-u razem z pobieraniem danych firmy z rejestru VIES działa w tym sklepie - w kasie, pod polem NIP, jest przycisk „Pobierz dane firmy”. To część naszej wtyczki do faktur, której na razie nie sprzedajemy osobno. Jeśli szukasz czegoś, co dołoży własne pola do zamówienia bez pisania kodu, zajrzyj do Własnych pól produktu.

Nowa wtyczka? Dowiesz się pierwszy.

Premiery, poradniki i promocje - raz na jakiś czas, bez zasypywania skrzynki.

[ skrót ] Albo zrób to wtyczką
Motyw strony wynajmu domku
v1.0.0 Nowość

Motyw strony wynajmu domku

Strona jednego domku: kalendarz wolnych terminów i cena pobytu bez dzwonienia.

WP
6.4+
799,00 zł jednorazowo
Kup i pobierz
Motyw dla siłowni
v1.1.0 Nowość

Motyw dla siłowni

Jednostronicowa strona siłowni, którą klient sam wypełni treścią.

WP
6.4+
799,00 zł jednorazowo
Kup i pobierz