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ář