[Snippet] Kontrola popisného čísla v adrese pri pokladni WooCommerce

Obrázok tohto článku

Zákazník v pokladni napíše len názov ulice a na popisné číslo zabudne. Objednávka prejde, kuriér nevie, kam balík doniesť, a zásielka sa vráti alebo mešká. WooCommerce pole s adresou kontroluje len na to, či nie je prázdne. Krátky kód v tomto článku zákazníka upozorní ešte pred odoslaním objednávky, že mu v adrese chýba číslo, a funguje v klasickej aj v novej blokovej pokladni.

Čo kód urobí

  • Pri odoslaní objednávky skontroluje, či pole Ulica (prvý riadok adresy) obsahuje popisné číslo.
  • Ak číslo chýba, objednávku zastaví a zobrazí hlášku, ktorá zákazníkovi povie, čo má doplniť.
  • Kontroluje fakturačnú adresu a dodaciu, ak zákazník zadal inú.
  • Kontrola platí len pre adresy na Slovensku a v Česku. Tu má každá budova súpisné číslo, v zahraničí sa adresy bez čísla vyskytujú, napríklad v Británii, kde niektoré domy majú namiesto čísla len názov.
  • Názvy ulíc s dátumom, napríklad "Ulica 1. mája" alebo "Ulica 29. augusta", nepovažuje za adresu s číslom.

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.

// kontrola popisného čísla v adrese pri pokladni WooCommerce

// krajiny, v ktorých má každá adresa popisné číslo
function jh_address_number_countries() {
	return array( 'SK', 'CZ' );
}

// adresa obsahuje číslo, ktoré nie je súčasťou názvu ulice ako "1. mája"
function jh_address_has_number( $address ) {
	return (bool) preg_match( '/\d+(?!\d)(?!\.\s*\p{L})/u', $address );
}

// true, ak adresa v danej krajine popisné číslo potrebuje, ale nemá ho
function jh_address_number_missing( $address, $country ) {
	$address = trim( (string) $address );

	// prázdne pole hlási WooCommerce samo ako povinné
	if ( '' === $address || ! in_array( $country, jh_address_number_countries(), true ) ) {
		return false;
	}

	return ! jh_address_has_number( $address );
}

function jh_address_number_message( $type ) {
	if ( 'shipping' === $type ) {
		return 'V dodacej adrese chýba popisné číslo. Doplňte ho, prosím, aby kuriér vedel zásielku doručiť.';
	}

	return 'Vo fakturačnej adrese chýba popisné číslo. Doplňte ho, prosím.';
}

// klasická pokladňa (shortcode [woocommerce_checkout])
function jh_validate_address_number_classic( $data, $errors ) {
	$types = array( 'billing' );

	// bez zaškrtnutej inej dodacej adresy WooCommerce kopíruje fakturačnú do dodacej
	if ( ! empty( $data['ship_to_different_address'] ) ) {
		$types[] = 'shipping';
	}

	foreach ( $types as $type ) {
		if ( jh_address_number_missing( $data[ $type . '_address_1' ] ?? '', $data[ $type . '_country' ] ?? '' ) ) {
			$errors->add( $type . '_address_1_validation', jh_address_number_message( $type ), array( 'id' => $type . '_address_1' ) );
		}
	}
}
add_action( 'woocommerce_after_checkout_validation', 'jh_validate_address_number_classic', 10, 2 );

// bloková pokladňa (WooCommerce 8.7 a novší)
function jh_validate_address_number_blocks( $errors, $fields, $group ) {
	if ( jh_address_number_missing( $fields['address_1'] ?? '', $fields['country'] ?? '' ) ) {
		$errors->add( 'jh_address_number_' . $group, jh_address_number_message( $group ) );
	}
}
add_action( 'woocommerce_blocks_validate_location_address_fields', 'jh_validate_address_number_blocks', 10, 3 );

Ak predávate aj do ďalšej krajiny, kde má každá adresa číslo, pridajte jej dvojpísmenový kód do zoznamu vo funkcii jh_address_number_countries(), napríklad 'HU' pre Maďarsko. Texty hlášok zmeníte vo funkcii jh_address_number_message().

Prečo sú v kóde dve kontroly

WooCommerce má dnes dve pokladne. Klasická je stránka so shortcodom [woocommerce_checkout], ktorú používa väčšina starších e-shopov. Bloková pokladňa je dnes predvolená pri nových obchodoch a skladá sa v editore z blokov.

Každá z nich kontroluje objednávku inou cestou. Klasická volá akciu woocommerce_after_checkout_validation, bloková ju nevolá vôbec a namiesto nej má akciu woocommerce_blocks_validate_location_address_fields, ktorá existuje od WooCommerce 8.7. Kód, ktorý by sa pripojil len k prvej, by v blokovej pokladni potichu nerobil nič. Preto sú v kóde obe a nezáleží na tom, ktorú pokladňu používate.

Ako kód spozná popisné číslo

Kód hľadá v adrese číslo pomocou regulárneho výrazu (vzoru, ktorým sa v texte vyhľadávajú znaky podľa pravidiel). Číslo môže byť kdekoľvek v adrese, ale nesmie za ním nasledovať bodka a slovo, ako pri dátume v názve ulice.

  • Prejde: "Hlavná 123", "Hlavná 12/A", "Štefánikova 1234/5", "Nám. SNP 7", "Horná Lehota 125", "Mierová 5b", "Ulica 1. mája 14".
  • Neprejde: "Hlavná", "Ulica 1. mája", "Ulica 29. augusta".

Je to podobné ako vrátnik, ktorý si pozrie, či je na obálke číslo domu. Nevie, či dom na tej ulici naozaj existuje, ale obálku bez čísla vráti späť ešte pred odoslaním.

Čo kód nerobí

Kód neoveruje, či adresa existuje. Zákazník, ktorý napíše nesprávne číslo, objednávku odošle. Na overenie existujúcich adries slúžia služby napojené na databázu adries, ktoré sú platené a zložitejšie na nastavenie.

Nekontroluje ani objednávky, ktoré vytvoríte ručne v administrácii, a e-shopy, ktoré majú číslo domu v samostatnom poli. Takéto pole pridávajú niektoré doplnky pre pokladňu a kód by ho musel kontrolovať pod jeho vlastným názvom.

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 Ulica napíšte len "Hlavná".
  3. Po kliknutí na tlačidlo objednávky sa objednávka neodošle a zobrazí sa hláška o chýbajúcom popisnom čísle.
  4. Doplňte číslo, napríklad "Hlavná 12", 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.

Skúšajte v anonymnom okne prehliadača. Ak máte zapnutú vyrovnávaciu pamäť (cache), po vložení kódu ju vyprázdnite.

Zhrnutie

Chýbajúce popisné číslo je drobnosť, ktorá stojí vrátenú zásielku, poštovné navyše a nespokojného zákazníka. Kód vyššie ho zachytí priamo v pokladni, v klasickej aj v blokovej, a zahraničné adresy nechá na pokoji. Ďalšie úpravy WooCommerce nájdete v článku o tom, ako skryť položku Platby z menu WooCommerce. 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