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;
});