Sprzedaż wirtualnych produktów w WooCommerce: jak pozbyć się adresu wysyłki z formularza zamówienia

Jako konsument spotykam się czasami z sytuacją, gdy podczas zakupów w sklepie internetowym muszę podać pełne dane adresowe, nawet jeśli zamawiam produkt cyfrowy. Bywa to irytujące dla klientów, a co bardziej ostrożni mogą zrezygnować z zakupów w takim sklepie.

Ponieważ specjalizuję się w WordPressie, pokażę Ci, jak zmodyfikować formularz WooCommerce, aby nie zbierał danych adresowych i nie denerwował Twoich klientów.

Zmiany najlepiej wnieść w motywie potomnym. O tym, jak go utworzyć, pisałam w jednym z wcześniejszych wpisów. Jeśli jednak czujesz, że utworzenie motywu potomnego Cię przerasta, skorzystaj z darmowej wtyczki Code Snippets.

W pliku functions.php w motywie potomnym umieść następujący kod:

add_filter( 'woocommerce_cart_needs_shipping', 'wc_no_shipping' );
function wc_no_shipping( $x ) {
    return false;
}

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
    $fields['order']['order_comments']['placeholder'] = 'Uwagi do zamówienia.';
    return $fields;
}

Funkcja wc_no_shipping usunie checkbox „Wysłać na inny adres?”, natomiast funkcja custom_override_checkout_fields zmieni tekst w okienku „Uwagi do zamówienia (opcjonalne)” z „Uwagi do zamówienia, np. informacje o dostarczeniu przesyłki.” na „Uwagi do zamówienia.” (bo przecież nie dostarczasz przesyłki, więc po co mącić klientowi w głowie?).

Już jest nieźle, prawda?

Kolejna rzecz, którą można zrobić, aby klient nie musiał wypełniać zbyt wielu okienek, to oznaczenie pól adresowych jako pola opcjonalne:

add_filter( 'woocommerce_default_address_fields' , 'custom_override_default_address_fields' );
function custom_override_default_address_fields( $address_fields ) {
  $address_fields['address_1']['required'] = false;
  $address_fields['address_2']['required'] = false;
  $address_fields['city']['required'] = false;
  $address_fields['country']['required'] = false;
  $address_fields['postcode']['required'] = false;
  return $address_fields;
}

A może by tak całkowice zrezygnować z pola z krajem? Jest na to prosty sposób:

add_filter( 'woocommerce_checkout_fields' , 'custom_unset_checkout_fields' );
function custom_unset_checkout_fields( $fields ) {
  unset($fields['billing']['billing_country']);
  return $fields;
}

Co gdy w koszyku mamy mieszane produkty?

Jeśli w koszyku znajdują się zarówno wirtualne, jak i fizyczne produkty, klient powinien podać adres wysyłki. Poniższy kod sprawdzi koszyk i zastosuje uproszczony formularz tylko dla koszyka z wirtualnymi produktami:

function cart_has_only_virtual_products() {
   if ( WC() && WC()->cart && WC()->cart->get_cart() ) {
      foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
         $product = $cart_item['data'];
         if ( ! $product->is_virtual() && ! $product->is_downloadable() ) {
            return false;
         }
      }
      return true;
   }
   return false;
}

add_filter( 'woocommerce_cart_needs_shipping', 'custom_wc_no_shipping' );
add_filter( 'woocommerce_cart_needs_shipping_address', 'custom_wc_no_shipping' );
function custom_wc_no_shipping( $needs_shipping ) {
   if ( cart_has_only_virtual_products() ) {
      return false;
   }
   return $needs_shipping;
}

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
   if ( cart_has_only_virtual_products() ) {
      $fields['order']['order_comments']['placeholder'] = 'Uwagi do zamówienia.';
   }
   return $fields;
}

add_filter( 'woocommerce_default_address_fields' , 'custom_override_default_address_fields' );
function custom_override_default_address_fields( $address_fields ) {
   if ( cart_has_only_virtual_products() ) {
      $address_fields['address_1']['required'] = false;
      $address_fields['address_2']['required'] = false;
      $address_fields['city']['required'] = false;
      $address_fields['country']['required'] = false;
      $address_fields['postcode']['required'] = false;
   }
   return $address_fields;
}

add_filter( 'woocommerce_checkout_fields' , 'custom_unset_checkout_fields' );
function custom_unset_checkout_fields( $fields ) {
   if ( cart_has_only_virtual_products() ) {
      unset($fields['billing']['billing_country']);
   }
   return $fields;
}

Więcej o możliwościach dostosowania formularza zamówienia WooCommerce do własnych upodobań znajdziecie na stronie WooCommerce.

Pani Marta
Jestem Marta. Pani Marta. Na moim blogu dzielę się prostymi sposobami na bezwtyczkowe ulepszenie swojej strony WordPress. Jeśli brakuje Ci czegoś w tym wpisie lub chcesz, abym poruszyła temat, na którym Ci zależy, daj znać w komentarzu!

Dodaj komentarz

*

*

*

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Komentarze

  1. A jak zrobić aby uproszczony formularz był tylko dla plików wirtualnych? a dla fizycznych pozostawał niezmieniony?

    1. Cześć Rafał! W takim przypadku trzeba sprawdzić koszyk i zastosować kod tylko dla koszyka z wirtualnymi produktami. Uzupełniłam wpis o sekcję „Co gdy w koszyku mamy mieszane produkty?”. Mam nadzieję, że będzie to pomocne.