[Snippet] Kontrola telefónneho čísla pri pokladni WooCommerce

Obrázok tohto článku

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

  1. Vložte do košíka ľubovoľný produkt a prejdite do pokladne.
  2. Ako krajinu zvoľte Slovensko a do poľa Telefón napíšte "0905 123 45", teda číslo s chýbajúcou číslicou.
  3. Po kliknutí na tlačidlo objednávky sa objednávka neodošle a zobrazí sa hláška o neplatnom telefónnom čísle.
  4. 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 WooCommerce: hláška Fakturačné pole Telefón nie je platné telefónne číslo a pole Telefón s číslom 0905 123 45

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

Bloková pokladňa WooCommerce: hláška Zadané telefónne číslo nie je platné pri dodacej adrese a pole Telefón s číslom 0905 123 45

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.


Páčil sa vám tento článok? Zdieľajte ho na sociálnych sieťach alebo ho pošlite niekomu, komu by mohol pomôcť.

Zdieľať článok:
Ak chcete podporiť ďalšie články, kúpte mi kávičku.
Profilový obrázok autora článku
O autorovi článku

Juraj

Nezávislý profesionál s viac ako 10 rokmi skúseností v tvorbe webových stránok & eshopov a špecialista na WordPress. Pomáham klientom vytvárať funkčné, moderné a efektívne webové riešenia. Vo voľnom čase cestujem a oddychujem vo wellnesse. Rád varím a ešte radšej jem!

Pridať komentár