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.

/**
 * 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;

}


Přidat komentář