Tahák k tvorbě webů

WooCommerce

Pokladna - omezení způsobů dopravy na základě kritérií

Úkol zní:

  • pokud mám v košíku jen běžné produkty, můžu je zaslat pomocí PPL, Zásilkovny nebo osobního vyzvednutí
  • pokud mám v košíku jen stavebniny, můžu je zaslat pomocí Dodavatele nebo osobního vyzvednutí
  • pokud mám v košíku kombinaci běžných produktů a stavebnin, zobrazím info zákazníkovi, že stavebniny mu doručí Dodavatel a ostatní produkty mu budou doručeny zvolenou metodou
  • hmotnostní limit pro Zásilkovnu je 5 kg a pro PPL 31,5 kg. Já počítám i s rezervou na hmotnost samotného obalu.
  • pokud zásilku doručuje Dodavatel, je poplatek za doručení 99 Kč, pokud je cena stavebnin nižší než 1000 Kč.

Řešení

1) Zjistím kombinaci tříd dopravy a celkovou hmotnost zboží v košíku:

<?php
function gog_get_cart_content() {
    $cart_items = WC()->cart->get_cart();
    $res = array(
    	'shipping' => 'default',
    	'weight' => 0
    );

	$shipping_stavebniny = false;
	$shipping_default = false;

	foreach ($cart_items as $item) {
		if ($item['data']->get_shipping_class() == 'stavebniny') {
			$shipping_stavebniny = true;
		}
		else {
			$shipping_default = true;
		}
		$res['weight'] += (int) $item['data']->weight * $item['quantity'];
	}

	if ($shipping_stavebniny && $shipping_default) {
		$res['shipping'] = 'both';
	}
	elseif ($shipping_stavebniny) {
		$res['shipping'] = 'stavebniny';
	}

	return $res;

}

2) Zobrazím info zprávu, pokud jsou košíku produkty s třídou dopravy Stavebniny i bez ní

<?php
function gog_shipping_stavebniny_info() {
	$res = gog_get_cart_content();
	$shipping = $res['shipping'];
	$weight = $res['weight'];

	if ($shipping == 'both') {
		echo '<tr><td colspan="2"><span class="red"><strong>Upozornění!</strong> V košíku máte produkty z kategorie Stavebniny, které vám doručí dodavatel přímo na vaši adresu. Pro ostatní produkty platí vámi zvolený způsob dopravy.</span></td></tr>';
	}
}
add_action('woocommerce_review_order_before_shipping', 'gog_shipping_stavebniny_info', 20);

3) Schovám nepovolené způsoby dopravy

<?php
function gog_hide_shipping_methods($rates, $package) {
	$res = gog_get_cart_content();
	$shipping = $res['shipping'];
	$weight = $res['weight'];

	$zasilkovna_method = 'zasilkovna>z-points';
	$ppl_method = 'flat_rate:7';
	$stavebniny_method = 'flat_rate:13';
	$osobni_method = 'local_pickup:6';

	$ppl_weight = 30;
	$zasilkovna_weight = 4.9;

	if ($shipping == 'both') {
		unset($rates[$stavebniny_method]);
	}
	elseif ($shipping == 'stavebniny') {
		unset($rates[$zasilkovna_method]);
		unset($rates[$ppl_method]);
		unset($rates[$osobni_method]);
	}
	elseif ($shipping == 'default') {
		unset($rates[$stavebniny_method]);
	}

	if ($weight > $ppl_weight) {
		unset($rates[$ppl_method]);
	}
	if ($weight > $zasilkovna_weight) {
		unset($rates[$zasilkovna_method]);
	}

	return $rates;
}
add_filter( 'woocommerce_package_rates', 'gog_hide_shipping_methods', 10, 2);

4) naúčtuji poplatek za dopravu při objednávce stavebnin za méně než 1000 Kč

<?php
function gog_shipping_fee() {
	$res = gog_get_cart_content();
	$shipping = $res['shipping'];

	if ($shipping == 'stavebniny' || $shipping == 'both') {
		if ($res['stavebniny_price'] < 1000) {
			WC()->cart->add_fee('Příplatek za dopravu od smluvního dodavatele', 99); 
		}
	}
}
add_action('woocommerce_cart_calculate_fees','gog_shipping_fee');