Ako pridať nové hodnoty do WooCommerce registračného formulára

Pridávame nové hodnoty do WooCommerce registračného formulára

Pri vývoji e-shopu pre jedného klienta, som sa stretol so špecifickou požiadavkou. Keďže ide o B2B shop, klient požadoval, aby bol umožnený predaj len prihláseným užívateľom.

Na to, aby si užívateľ mohol vytvoriť účet na jeho e-shope, však vyžadoval ako povinné zadanie Názvu spoločnosti a IČO spoločnosti. Názov spoločnosti sa od základu nachádza vo Woocommerce e-shope, IČO, DIČ a IČ DPH som doplnil pomocou známeho pluginu WPify.

Čo som teda potreboval dosiahnuť navyše:

  1. urobiť z Názvu spoločnosti a IČO spoločnosti povinné pole
  2. doplniť tieto dve položky do registračného formuláru

 

1. Povinný názov spoločnosti a IČO.

Toto šlo veľmi jednoducho. Za 10 sekúnd som vygooglil snippet, ktorý to umožňuje. Tu je:

  1. add_filter( 'woocommerce_billing_fields', 'ts_require_wc_company_field');
  2.    function ts_require_wc_company_field( $fields ) {
  3.       $fields['billing_company']['required'] = true;
  4.       $fields['billing_ic']['required'] = true;
  5.       return $fields;
  6.    }

Filter je veľmi jednoduchý. Vybraným položkám poľa $fields jednoducho nastaví na príznačný parameter hodnotu TRUE, čím ich urobí povinnými. Namiesto (voliteľné) sa začne zobrazovať červená hviezdička. Viete si, samozrejme, podľa potreby doplniť vlastné polia, či už billing, alebo shipping a urobiť ich tak povinnými v objednávkovom procese.
 

2. Doplnenie polí do registračného formulára

Toto už je trošku horšie. Po dlhšom skúmaní a neúspešných pokusoch som však našiel riešenie. Ide o tri rozličné actions.

  1. add_action( 'woocommerce_register_form', 'misha_add_register_form_field' );
  2. function misha_add_register_form_field(){
  3.     woocommerce_form_field(
  4.         'billing_company',
  5.         array(
  6.             'type'        => 'text',
  7.             'required'    => true, // just adds an "*"
  8.             'label'       => 'Názov firmy'
  9.         ),
  10.         ( isset($_POST['billing_company']) ? $_POST['billing_company'] : '' )
  11.     );
  12.     woocommerce_form_field(
  13.         'billing_ic',
  14.         array(
  15.             'type'        => 'text',
  16.             'required'    => true, // just adds an "*"
  17.             'label'       => 'IČO'
  18.         ),
  19.         ( isset($_POST['billing_ic']) ? $_POST['billing_ic'] : '' )
  20.     );
  21. }
  22.  
  23. add_action( 'woocommerce_register_post', 'misha_validate_fields', 10, 3 );
  24. function misha_validate_fields( $username, $email, $errors ) {
  25.     if ( empty( $_POST['billing_company'] ) ) {
  26.         $errors->add( 'billing_company', 'Toto pole je povinné' );
  27.     }
  28.     if ( empty( $_POST['billing_ic'] ) ) {
  29.         $errors->add( 'billing_ic', 'Toto pole je povinné' );
  30.     }
  31. }
  32.  
  33. add_action( 'woocommerce_created_customer', 'misha_save_register_fields' );
  34. function misha_save_register_fields( $customer_id ){
  35.     if ( isset( $_POST['billing_company'] ) ) {
  36.         update_user_meta( $customer_id, 'billing_company', wc_clean( $_POST['billing_company'] ) );
  37.         update_user_meta( $customer_id, 'billing_ic', wc_clean( $_POST['billing_ic'] ) );
  38.     }
  39. }

V prvej action prostredníctvom vstavanej Woocommerce funkcie „woocommerce_form_field()“ pridáme nami žiadané polia. Vyberieme typ (text, radio, select, number,…), nastavíme povinnosť (v mojom prípade povinné obidva) a nastavíme názov. Tu je potrebné dávať pozor, aby sa id nového poľa (prvý parameter funkcie) rovnal reálnemu názvu poľa. V mojom prípade teda billing_company a billing_ic (billing_ic pochádza z pluginu wpify). Funkciou isset, ktorá sa nachádza v poslednom parametri, zabezpečíme, aby v prípade neúspešnej registrácie ostali vypísané dáta vo svojich fieldoch a nemusel ich používateľ vypisovať znova. Keďže pridávam dve polia (company a ic), musím aj dvakrát použiť funkciu woocommerce_form_field(). Raz pre company a raz pre ic.

V druhej action prevedieme validáciu. Pokiaľ po odoslaní formulára zistíme, že IČO, alebo názov spoločnosti nie je vyplnené, vrátime užívateľa späť s chybou „Toto pole je povinné“. Spustenie po kliku na tlačidlo nám zabezpečí hook woocommerce_register_post.

V tretej akcií, ktorá sa vykoná hneď po uložení nového užívateľa ešte potrebujeme vykonať update jeho metadát, konkrétne billing_company a billing_ic. Použijeme na to funkciu update_user_meta(), do ktorej vložíme hodnotu $_POST. To je presne tá hodnota, ktorú užívateľ vypísal do formulára.
 

Výsledok?

Výsledkom sú nové polia v registračnom formulári, ktoré sa správne uložia k užívateľovi a následne sa aj samé dotiahnu do pokladne a do užívateľského profilu.


 

Pridajte komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Návrat hore