WooCommerce – úprava polí v pokladně

Úprava polí v pokladně WooCommerce, nebo obecně přizpůsobení pokladny tak, aby byla pro zákazníky přehlednější, je jedním z nejčastějších požadavků klientů.

Pokladna ve WooCommerce se dá upravit téměr libovolně, může být jednokroková nebo vícekroková, mít různě upravená / přesouvaná pole atd., viz. několik screenshotů níže.

Pro customizaci polí je dostupná dokumentace, která pomůže se základní orientací, ale neřeší některé detaily, jako je např. pořadí polí v pokladně.

U webu paleosnadno.cz znělo zadání:

 

Pokud jsou v košíku pouze virtuální produkty, potřebujeme, aby se v pokladně zobrazovaly jen nezbytně nutná pole. Pokud jsou v košíku i fyzické produkty, potřebujeme zobrazit více polí. Chceme také přesunout firemní údaje do samostatné sekce, která se zobrazí po kliknutí na checkbox.

 

Potřebné jsou především dva filtry:

woocommerce_checkout_fields

filtr, který umožňuje měnit parametry polí v checkoutu (např. label, třídy atd.) a přidávat / odebírat pole

woocommerce_default_address_fields

filtr, který je potřeba, pokud chcete upravovat parametry některých výchozích polí, především „město“, „ulice“, „psč“

 

Na kompletní kód, který takovou funkcionalitu zařídí, se můžete podívat níže, a dozvíte se z něj, jak přidat polím třídy, změnit jejich pořadí, vytvořit nové pole i jak zařídit, aby se pole s detaily firmy zobrazily až po kliknutí na checkbox.

Výsledek si samozřejmě můžete také vyzkoušet sami na webu paleosnadno.cz.

[php]
/**
* Edit checkout fields
*/
add_filter( ‚woocommerce_checkout_fields‘ , ‚paleo_override_checkout_fields‘,999,1 );

function paleo_override_checkout_fields( $fields ) {
// Remove some checkout fields
unset($fields[‚billing‘][‚billing_address_2‘]);
unset($fields[‚shipping‘][‚shipping_address_2‘]);

// Adjust billing fields
$fields[‚billing‘][‚billing_first_name‘][‚class‘] = [‚form-row-wide‘];
$fields[‚billing‘][‚billing_last_name‘][‚class‘] = [‚form-row-wide‘];
$fields[‚billing‘][‚billing_city‘][‚class‘] = [‚form-row-first‘];
$fields[‚billing‘][‚billing_postcode‘][‚class‘] = [‚form-row-last‘];

$fields[‚billing‘][‚billing_email‘][‚priority‘] = 21;
$fields[‚billing‘][‚billing_phone‘][‚priority‘] = 22;
$fields[‚billing‘][‚billing_company‘][‚priority‘] = 92;
$fields[‚billing‘][‚billing_ic‘][‚priority‘] = 93;
$fields[‚billing‘][‚billing_dic‘][‚priority‘] = 94;

// Adjust shipping fields
$fields[‚shipping‘][‚shipping_first_name‘][‚class‘] = [‚form-row-wide‘];
$fields[‚shipping‘][‚shipping_last_name‘][‚class‘] = [‚form-row-wide‘];
$fields[‚shipping‘][‚shipping_city‘][‚class‘] = [‚form-row-first‘];
$fields[‚shipping‘][‚shipping_postcode‘][‚class‘] = [‚form-row-last‘];
$fields[‚billing‘][‚billing_company‘][‚class‘] = [‚form-row-wide company-details‘];
$fields[‚billing‘][‚billing_ic‘][‚class‘] = [‚form-row-first company-details‘];
$fields[‚billing‘][‚billing_dic‘][‚class‘] = [‚form-row-last company-details‘];
$fields[‚billing‘][‚billing_dic‘][‚clear‘] = true;

// Add custom checkbox for company details
$fields[‚billing‘][‚company_details_trigger‘] = array(
‚type‘ => ‚checkbox‘,
‚label‘ => __(‚Chci zadat firemní údaje‘, ‚woocommerce‘),
‚class‘ => array(‚form-row-wide‘),
‚clear‘ => true,
‚priority‘ => 91
);

// Remove checkout fields if there are only virtual products in cart
if (paleo_only_virtual_in_cart()) {
unset($fields[‚billing‘][‚billing_phone‘]);
$fields[‚billing‘][‚billing_address_1‘][‚class‘] = [‚form-row-wide company-details‘];
$fields[‚billing‘][‚billing_city‘][‚class‘] = [‚form-row-first company-details‘];
$fields[‚billing‘][‚billing_postcode‘][‚class‘] = [‚form-row-last company-details‘];
$fields[‚billing‘][‚company_details_trigger‘][‚label‘] = ‚Chci zadat firemní údaje na fakturu‘;
}

return $fields;
}

/**
* Remove checkout fields if there are virtual only products in cart
*/
add_filter( ‚woocommerce_default_address_fields‘, ‚custom_default_address_fields‘, 20, 1 );
function custom_default_address_fields( $fields ) {
if (paleo_only_virtual_in_cart()) {
$fields[‚address_1‘][‚priority‘] = 95;
$fields[‚city‘][‚priority‘] = 96;
$fields[‚postcode‘][‚priority‘] = 97;

$fields[‚address_1‘][‚required‘] = false;
$fields[‚city‘][‚required‘] = false;
$fields[‚postcode‘][‚required‘] = false;
}

return $fields;
}

/**
* Check if there are only virtual products in cart
* @return bool
*/
function paleo_only_virtual_in_cart() {
global $woocommerce;
$items = $woocommerce->cart->get_cart();

$virtual_only = true;
foreach($items as $item => $values) {
$_product = wc_get_product( $values[‚data‘]->get_id());
if (!$_product->is_virtual()) {
$virtual_only = false;
break;
}
}

return $virtual_only;

}

[/php]

Přidat komentář