[Snippet] Kontrola telefónneho čísla pri pokladni WooCommerce
Kuriér pred doručením volá alebo posiela SMS s časom doručenia. Keď zákazník v pokladni napíše telefónne číslo s chýbajúcou číslicou, správa nepríde a zásielka mešká alebo sa vráti. WooCommerce pritom prepustí aj číslo "123", kontroluje len to, či v poli nie sú písmená. Krátky kód v tomto článku skontroluje, či má číslo správny počet číslic pre Slovensko a Česko, a funguje v klasickej aj v blokovej pokladni.
Čo kód urobí
- Pri odoslaní objednávky skontroluje telefónne číslo. Ak nemá správny tvar, objednávku zastaví a zobrazí hlášku.
- Pri slovenskej adrese prijme číslo s nulou na začiatku, napríklad 0905 123 456 alebo 02/1234 5678, alebo s predvoľbou +421 či 00421. Pri českej adrese 9 číslic alebo predvoľbu +420.
- Číslo s inou predvoľbou, napríklad rakúske +43, prijme, ak má 8 až 15 číslic. Viac číslic telefónne číslo podľa medzinárodného štandardu E.164 mať nemôže.
- Medzery, lomky, pomlčky a zátvorky nevadia, zákazník môže číslo písať tak, ako je zvyknutý.
- Rovnako kontroluje číslo, ktoré si zákazník zmení v časti Môj účet pri adresách.
- Číslo bez predvoľby pri adrese v inej krajine nechá na WooCommerce, ktorý kontroluje len znaky.
Kód
Kód vložte do súboru functions.php v odvodenej (child) téme, teda v téme, ktorá preberá vzhľad hlavnej témy a pri jej aktualizácii sa neprepíše. Ak odvodenú tému nemáte, poslúži doplnok na vkladanie kódu, napríklad Code Snippets. Kód začína rovno komentárom, bez úvodného <?php, takže ho môžete vložiť na koniec súboru za existujúci kód. Potrebuje WooCommerce 11.0 alebo novší.
// kontrola telefónneho čísla pri pokladni WooCommerce (od verzie 11.0)
// predvoľba krajiny a počet číslic čísla bez nej, trunk = nula pred číslom bez predvoľby
function jh_phone_rules() {
return array(
'SK' => array( 'code' => '421', 'length' => 9, 'trunk' => '0' ),
'CZ' => array( 'code' => '420', 'length' => 9, 'trunk' => '' ),
);
}
// číslo bez predvoľby a bez nuly: presný počet číslic, nezačína nulou
function jh_phone_number_valid( $digits, $length ) {
return (bool) preg_match( '/^[1-9]\d{' . ( $length - 1 ) . '}$/', $digits );
}
function jh_validate_phone( $valid, $phone, $country ) {
$phone = trim( (string) $phone );
// písmená a iné znaky odmietol už WooCommerce, prázdne pole rieši nastavenie pokladne
if ( ! $valid || '' === $phone ) {
return $valid;
}
// medzery, lomky, pomlčky a zátvorky nehrajú rolu
$digits = preg_replace( '/\D/', '', $phone );
$rules = jh_phone_rules();
// medzinárodný tvar: +421 alebo 00421
if ( preg_match( '/^[^0-9]*\+/', $phone ) || 0 === strpos( $digits, '00' ) ) {
if ( 0 === strpos( $digits, '00' ) ) {
$digits = substr( $digits, 2 );
}
foreach ( $rules as $rule ) {
if ( 0 === strpos( $digits, $rule['code'] ) ) {
return jh_phone_number_valid( substr( $digits, strlen( $rule['code'] ) ), $rule['length'] );
}
}
// iná krajina: 8 až 15 číslic, predvoľba nezačína nulou
return (bool) preg_match( '/^[1-9]\d{7,14}$/', $digits );
}
// číslo bez predvoľby kontroluje len pre krajiny zo zoznamu
$country = (string) $country;
if ( ! isset( $rules[ $country ] ) ) {
return $valid;
}
$rule = $rules[ $country ];
$trunk = $rule['trunk'];
if ( '' !== $trunk ) {
if ( 0 !== strpos( $digits, $trunk ) ) {
return false;
}
$digits = substr( $digits, strlen( $trunk ) );
}
return jh_phone_number_valid( $digits, $rule['length'] );
}
add_filter( 'woocommerce_validate_phone', 'jh_validate_phone', 10, 3 );
Ak predávate aj do ďalšej krajiny, kde majú čísla pevný počet číslic, pridajte ju do zoznamu vo funkcii jh_phone_rules(). Pre Poľsko by to bol riadok 'PL' => array( 'code' => '48', 'length' => 9, 'trunk' => '' ),, teda predvoľba 48, deväť číslic a žiadna nula pred číslom bez predvoľby. Slovensko má v poli trunk nulu, lebo slovenské číslo bez predvoľby sa ňou začína.
Ktoré čísla prejdú a ktoré nie
- Prejde pri slovenskej adrese: "0905 123 456", "0905/123 456", "02/1234 5678", "+421 905 123 456", "00421 905 123 456", "(+421) 905 123 456", aj české "+420 777 123 456".
- Prejde pri českej adrese: "777 123 456", "+420 777 123 456".
- Neprejde: "0905 123 45" (chýba číslica), "0905 123 4567" (číslica navyše), "905 123 456" (chýba nula aj predvoľba), "123", "+421 0905 123 456" (nula za predvoľbou navyše).
Posledný prípad je častá chyba. Číslo s predvoľbou sa píše bez nuly na začiatku, správne je "+421 905 123 456".
Prečo stačí jedna kontrola
WooCommerce má dve pokladne. Klasická je stránka so shortcodom [woocommerce_checkout], ktorú používa väčšina starších e-shopov, bloková je predvolená pri nových obchodoch. Každá kontroluje objednávku inou cestou, preto snippet o kontrole popisného čísla v adrese potrebuje dve časti.
Pri telefóne to od WooCommerce 11.0, ktorý vyšiel 4. augusta 2026, neplatí. Obe pokladne aj úprava adresy v Môj účet volajú tú istú kontrolu čísla a tá má filter woocommerce_validate_phone. Filter dostane výsledok kontroly WooCommerce, samotné číslo a krajinu z adresy. Kód sa pripojí len k nemu a funguje všade naraz.
V staršej verzii WooCommerce tento filter neexistuje. Kód tam nič nepokazí, ale nebude ani nič kontrolovať. Verziu nájdete v administrácii v zozname pluginov. Ak je staršia ako 11.0, oplatí sa aktualizovať, pred aktualizáciou e-shopu si urobte zálohu.
Čo kód nerobí
- Neoverí, či číslo existuje a patrí zákazníkovi. Preklep v jednej číslici pri správnom počte číslic prejde. Na to slúži overenie kódom cez SMS, ktoré ponúkajú platené doplnky a služby.
- Číslo bez predvoľby posudzuje podľa krajiny v adrese. Zákazník so slovenskou adresou a českým číslom musí napísať predvoľbu +420, inak ho kód považuje za slovenské číslo s chybou.
- Nemení text hlášky. Ten je od WooCommerce a je rovnaký pri každej chybe v čísle, filter vracia len odpoveď áno alebo nie.
- Neupraví číslo do jednotného tvaru, v objednávke ostane tak, ako ho zákazník napísal.
- Nekontroluje objednávky, ktoré vytvoríte ručne v administrácii, a nemení, či je telefón povinný. To sa nastavuje v nastaveniach pokladne, pri blokovej pokladni v editore stránky Pokladňa.
Ako overiť, že kód funguje
- Vložte do košíka ľubovoľný produkt a prejdite do pokladne.
- Ako krajinu zvoľte Slovensko a do poľa Telefón napíšte "0905 123 45", teda číslo s chýbajúcou číslicou.
- Po kliknutí na tlačidlo objednávky sa objednávka neodošle a zobrazí sa hláška o neplatnom telefónnom čísle.
- Doplňte číslicu, napríklad "0905 123 456", a objednávka prejde. Ak ju nechcete dokončiť, zvoľte platbu, pri ktorej sa nič neplatí hneď, napríklad bankový prevod, a skúšobnú objednávku potom v administrácii zrušte.

Klasická pokladňa: hláška nad formulárom, v poli Telefón chýba číslica.

Bloková pokladňa: hláška pri dodacej adrese. Jej nadpis je zatiaľ po anglicky, vo WooCommerce mu chýba slovenský preklad.
Skúšajte v anonymnom okne prehliadača. Ak máte zapnutú vyrovnávaciu pamäť (cache), po vložení kódu ju vyprázdnite.
Zhrnutie
Telefónne číslo s chýbajúcou číslicou zistíte až vtedy, keď sa kuriér nedovolá. Kód vyššie ho zachytí priamo v pokladni, v klasickej aj v blokovej, cez jediný filter, ktorý WooCommerce pridal vo verzii 11.0. Ak chcete mať v pokladni poriadok aj v adresách, doplňte k nemu kontrolu popisného čísla. Ak nechcete kód do e-shopu vkladať sami alebo pripravujete nový e-shop, pozrite si tvorbu e-shopov na mieru, alebo mi rovno napíšte.