Come bloccare il checkout in Dokan quando il venditore è chiuso
· di Daniel
Qualche aggiornamento fa Dokan ha introdotto una funzione con cui i venditori possono impostare gli orari di apertura del proprio negozio. Questa funzione però si limita a mostrare gli orari. Se vuoi bloccare l’aggiunta al carrello o il checkout quando un venditore, ad esempio un ristorante, è chiuso, ti serve del codice personalizzato. Il codice qui sotto mostra ai clienti un messaggio di errore se vogliono completare l’ordine con prodotti di un venditore chiuso. Inseriscilo nel file functions.php del tuo tema child.
add_action( 'woocommerce_checkout_process', 'check_shop_open' );
add_action( 'woocommerce_check_cart_items' , 'check_shop_open' );
function check_shop_open()
{
$vendorId = false;
// Set vendor ID based on cart items
$cartItems = WC()->cart->get_cart();
foreach ( $cartItems as $cartItemKey => $cartItem ) {
$vendorId = get_post_field( 'post_author', $cartItem['product_id'] );
$vendorInfo = dokan_get_store_info( $vendorId );
}
if(!$vendorId) {
return;
}
if(empty($vendorInfo)) {
return;
}
if(!isset($vendorInfo['dokan_store_time']) || empty($vendorInfo['dokan_store_time']) ) {
return;
}
// Get All Vendor Opening Hours
$wpTimezone = wp_timezone();
$vendorName = $vendorInfo['store_name'];
$storeOpeningHours = $vendorInfo['dokan_store_time'];
$dateFormat = 'd.m.Y';
$currentDate = DateTime::createFromFormat($dateFormat, date($dateFormat), $wpTimezone);
$currentDay = strtolower( $currentDate->format('l') );
if(!isset($storeOpeningHours[$currentDay]) || empty($storeOpeningHours[$currentDay])) {
return;
}
// Set current Day Vendor Opening Hours
$storeOpeningHoursCurrentDay = $storeOpeningHours[$currentDay];
// Store Closed Today
if(isset($storeOpeningHoursCurrentDay['status']) && $storeOpeningHoursCurrentDay['status'] == "close") {
show_cart_checkout_message( sprintf( __('Oh sorry. %s is closed today! Please return another day.', 'flatsome-child'), $vendorName ) );
return false;
}
// Store not open
if(isset($storeOpeningHoursCurrentDay['opening_time']) && !empty($storeOpeningHoursCurrentDay['opening_time'])) {
$storeOpeningHoursCurrentDayOpeningTime = $storeOpeningHoursCurrentDay['opening_time'];
$storeOpeningHoursCurrentDayOpeningTimeObject = DateTime::createFromFormat('H:i', $storeOpeningHoursCurrentDayOpeningTime, $wpTimezone);
if($currentDate <= $storeOpeningHoursCurrentDayOpeningTimeObject) { show_cart_checkout_message( sprintf( __('Oh sorry! %s opens at %s o\'clock. Please return another day.', 'flatsome-child'), $vendorName, $storeOpeningHoursCurrentDayOpeningTime) ); return false; } } // Store closed time if(isset($storeOpeningHoursCurrentDay['closing_time']) && !empty($storeOpeningHoursCurrentDay['closing_time'])) { $storeClosingHoursCurrentDayClosingTime = $storeOpeningHoursCurrentDay['closing_time']; $storeClosingHoursCurrentDayClosingTimeObject = DateTime::createFromFormat('H:i', $storeClosingHoursCurrentDayClosingTime, $wpTimezone); if($currentDate >= $storeClosingHoursCurrentDayClosingTimeObject) {
show_cart_checkout_message( sprintf( __('Oh sorry! %s is closed since %s o\'clock. Please return another day.', 'flatsome-child'), $vendorName, $storeClosingHoursCurrentDayClosingTime) );
return false;
}
}
}
// Show a custom WC error mesagge (cart + checkout)
function show_cart_checkout_message($message)
{
if(empty($message)) {
return;
}
if( is_cart() ) {
wc_print_notice(
$message, 'error'
);
} else {
wc_add_notice(
$message, 'error'
);
wp_redirect( wc_get_cart_url() );
}
}