Lokaal Afhalen als verzendmethode afdwingen in WooCommerce

WooCommerce biedt een scala aan verzendmethoden, maar soms wilt u bepaalde producten alleen laten afhalen. Dit kan nodig zijn voor grote of zware artikelen die niet praktisch zijn om te verzenden. In deze blogpost bespreken we een aangepaste code om lokaal afhalen als verzendmethode af te dwingen voor specifieke verzendklassen in WooCommerce.

Waarom lokaal afhalen?

Lokaal afhalen kan verschillende voordelen bieden:

  • Kostenbesparing: Het verzenden van grote of zware artikelen kan duur zijn.
  • Logistieke eenvoud: Het vermijden van complexe verzendlogistiek.
  • Klanttevredenheid: Klanten kunnen hun producten sneller en zonder verzendkosten ophalen.

De code

Hier is een overzicht van de code die u kunt gebruiken om lokaal afhalen af te dwingen voor specifieke verzendklassen:

				
					/**
 * Lokaal afhalen als verzendmethode afdwingen
 *
 * @return	bool				TRUE als we afhalen willen afdwingen, anders FALSE
 */
function afhalen_afdwingen() {

	$verzendklassen_voor_afhalen = [
		'grote artikelen',
		'zware artikelen'
	];

	// We gaan er vanuit dat we afhalen niet hoeven af te dwingen
	$alleen_afhalen = false;

	// Controleer alle producten in de winkelmand
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
		$product = $cart_item['data'];
		$class   = $product->get_shipping_class();

		if( in_array( $class, $verzendklassen_voor_afhalen ) ) {
			$alleen_afhalen = true;
			break;
		}
	}

	return $alleen_afhalen;
}

/**
 * Zoek alle 'afhalen' verzendmethoden
 *
 * @param	array	$verzendmethoden		Array van verzendmethoden
 * @return	array							Array van afhalen-verzendmethoden
 */ 
function zoek_afhaal_verzendmethoden( $verzendmethoden ) {
	$afhalen  = array();
	foreach ( $verzendmethoden as $verzendmethode_id => $verzendmethode ) {
		if ('local_pickup' === $verzendmethode->method_id ) {
            $afhalen [ $verzendmethode_id ] = $verzendmethode;
        }
	}
	return $afhalen ;
}

/**
 * Zijn er 'afhalen'-verzendmethoden EN willen we afhalen afdwingen?
 * Dan overschrijven we de beschikbare verzendmethoden
 *
 * @param	array	$verzendmethoden 		Array van verzendmethoden
 * @param	array	$pakket					Array van cart-items gebundeld in een pakket
 * @return	array							Array van verzendmethoden die beschikbaar moeten zijn
 */
function controleer_alleen_afhalen( $verzendmethoden , $pakket ) {
	
	// Willen we afhalen afdwingen?
	$alleen_afhalen  = afhalen_afdwingen();
	
	// Zijn er afhalen-verzendmethoden beschikbaar?
	$afhalen  = zoek_afhaal_verzendmethoden( $verzendmethoden  );
	if ( !empty( $afhalen ) && ( $alleen_afhalen == true ) ) {
		return $afhalen ;
    } else {
        return $verzendmethoden ;
    }
}
add_filter( 'woocommerce_package_rates', 'controleer_alleen_afhalen', 100, 2 );

/**
 * Toon in de winkelmand en bij het afrekenen een melding dat alleen afhalen mogelijk is
 *
 * @param	WC_Checkout object	$afrekenen		WC_Checkout instance
 */
function toon_afhaal_melding( $afrekenen = null ) {
	$alleen_afhalen  = afhalen_afdwingen();
	if( $alleen_afhalen === true ) {
		wc_print_notice( 'Voor deze order is alleen afhalen mogelijk', 'notice' );
	}
}
add_action('woocommerce_before_cart_totals', 'toon_afhaal_melding', 1, 0 );	
add_action('woocommerce_before_checkout_form', 'toon_afhaal_melding',99, 1 );

/**
 * Toon bij artikelen die alleen afgehaald kunnen worden een melding
 *
 * @param	array	$item_data		Array met data van artikel in de winkelmand
 * @param	array	$cart_item		Item in de WC_Cart
 * @return 	array					Array met data van artikel in de winkelmand
 */
function toon_afhaal_melding( $item_data, $cart_item ) {

	$verzendklassen_voor_afhalen = [
		'grote artikelen',
		'zware artikelen'
	];
	
	// Mag dit artikel alleen afgehaald worden?
	$_product = $cart_item['data'];
	$verzend_klasse = $_product->get_shipping_class();
	$alleen_afhalen = false;
	if( in_array( $verzend_klasse, $verzendklassen_voor_afhalen ) ) {
		$alleen_afhalen = true;
	}

	// Toon een melding bij artikelen die alleen afgehaald mogen worden
	if( $alleen_afhalen === true ) {
		$item_data[] = array(
			'key'   => __( 'Verzending', 'plus-king-woocommerce' ),
			'value' => 'Alleen beschikbaar via afhalen',
		);
	}
	return $item_data;
}
add_filter( 'woocommerce_get_item_data', 'toon_afhaal_melding', 10, 2);

/**
 * Overschrijf de waarde die aangeeft of een bestelling een verzendadres nodig heeft
 * Hiermee kunnen we het verzendadres in de winkelmand en bij het afrekenen verbergen.
 *
 * @param	bool	$value		Boolean die aangeeft of een bestelling een verzendadres nodig heeft
 * @return	bool				Boolean die aangeeft of een bestelling een verzendadres nodig heeft
 */
add_filter( 'woocommerce_cart_needs_shipping_address', function( $value ) {
	$alleen_afhalen = afhalen_afdwingen();
	if( $alleen_afhalen === true ) {
		$value = false;
	}
	return $value;
}, 10, 1);

/**
 * Overschrijf de waarde die aangeeft of het berekenen van de verzendkosten getoond moet worden
 *
 * @param	string	$value		Een string die aangeeft of het berekenen van de verzendkosten getoond moet worden
 * @return	string				Een string die aangeeft of het berekenen van de verzendkosten getoond moet worden
 */
add_filter( 'option_woocommerce_enable_shipping_calc', function( $value ) {
	$alleen_afhalen = afhalen_afdwingen();
	if( $alleen_afhalen === true ) {
		$value = 'no';
	}
	return $value;
});
				
			
Foto van Harm Jakob Tolsma

Harm Jakob Tolsma

Harm Jakob werkt sinds 2017 bij Plus Automatisering als PHP developer. Met opleidingen in Technische Informatica en Media Management versterkt Harm Jakob de afdeling Webdiensten door WordPress en WooCommerce plugins te schrijven, maar ook maatwerkapplicaties in CodeIgniter zijn voor hem gesneden koek. Met name aan de technische kant van het werk als developer vindt Harm Jakob zijn plezier. Je zult hier daarom vaak technische blogposts van hem tegenkomen.