Here is how you can Show and Hide elements on the Page based on whether or not your Business is currently OPEN or CLOSED.
The more robust solution
For a more thorough solution, I put together this video below where I go through coding this.
The video is below and you can grab all the code from the blog post, too!
And here is the code below.
Create Your WordPress Website (without a developer)
Your Advanced Custom Fields need to match mine
NOTE: You will need to create the Options Page in Advanced Custom Fields with EXACTLY the same names for each field as I have below and in the video above.
<?php
function is_store_open(){
$open = false; // the store is closed by default
$acf_exceptions_repeater = get_field('c_exception_business_hours_repeater', 'option');
// pre_dump($acf_exceptions_repeater, "green");
// get the current time of Susan's business = Settings > General
$wp_timezone_obj = wp_timezone(); // timezone object from settings > general
// pre_dump($wp_timezone_obj);
$wp_timezone_name = $wp_timezone_obj->getName(); // Australia/Sydney
// pre_dump($wp_timezone_name, 'black');
$local_datetime_obj = new DateTimeImmutable("now", new DateTimeZone($wp_timezone_name));
// pre_dump($local_datetime_obj, "green");
$local_date = $local_datetime_obj->format("d M"); // 19 Feb
$local_time = $local_datetime_obj->format("Hi"); // 1320
$local_day_of_the_week = $local_datetime_obj->format("D"); // Mon, Tue, Wed etc
// pre_dump($local_date, "purple");
// pre_dump($local_time, "red");
// pre_dump($local_day_of_the_week, "black");
// check if our store is closed today because of the day of the week.
$acf_general_business_hours_repeater = get_field('c_general_business_hours_repeater', 'option');
// FUNCTION OPTION 1 - CHECKING WITH BOOLEAN
// $current_day_found = false;
// foreach($acf_general_business_hours_repeater as $acf_general_business_hours_day_of_week){
// $acf_day_of_week = $acf_general_business_hours_day_of_week['c_general_business_hours_day_of_the_week'];
// if($acf_day_of_week == $local_day_of_the_week){
// $current_day_found = true;
// // echo 'Today has been found. The day is ' . $acf_day_of_week;
// }
// else{
// // echo 'day not found.';
// }
// }
// if($current_day_found == false){
// return $open;
// }
// OPTION 2 - using ARRAY check with in_array()
$acf_days_of_week_array = array();
foreach($acf_general_business_hours_repeater as $acf_general_business_hours_day_of_week){
$acf_days_of_week_array[] = $acf_general_business_hours_day_of_week['c_general_business_hours_day_of_the_week'];
}
// pre_dump($acf_days_of_week_array, 'green');
if( in_array($local_day_of_the_week, $acf_days_of_week_array) ){
// echo 'Today is a normal trading day for this business.';
}
else{
return $open; // $open = false by default returned
// echo 'today we are normally closed';
}
// check if the current local timezone from wp date matches a date in ACF exception days
$exception_day_found = false;
foreach($acf_exceptions_repeater as $acf_exceptions_child){
if($acf_exceptions_child['c_exception_business_hours_date'] == $local_date){
if($exception_day_found !== true){
$exception_day_found = true;
}
// handling when we are closed ALL-DAY due to an Exception day
if($acf_exceptions_child['c_exception_business_hours_closed_allday'] == true){
// echo 'we are closed all day today';
return $open; // $open = false;
}else{ // we are not closed all day i.e. we are closed half day etc
// pre_dump($acf_exceptions_child['c_exception_business_hours_open'], "green");
// pre_dump($acf_exceptions_child['c_exception_business_hours_close'], "red");
if( $local_time >= $acf_exceptions_child['c_exception_business_hours_open'] &&
$local_time < $acf_exceptions_child['c_exception_business_hours_close']
){
// echo 'we are currently open during the current timeframe for today';
return $open = true;
}
else{
// echo 'we are currently CLOSED during the current timeframe for today';
}
}
// echo 'date found';
}
else{
// echo 'date not found';
}
}
if($exception_day_found){
// there were exception days that matched the current date
// but the current time did not match one of the timeframes, thus we have closed today
return $open = false;
}
// echo 'hello';
// handle if our store is OPEN today but there are no exceptions
// check if current time is within default trading hours for this day of the week.
// pre_dump($acf_general_business_hours_repeater, "blue");
foreach($acf_general_business_hours_repeater as $acf_general_business_hours_repeater_item){
if($acf_general_business_hours_repeater_item['c_general_business_hours_day_of_the_week'] == $local_day_of_the_week){
$opentime = $acf_general_business_hours_repeater_item['c_general_business_hours_opening_time'];
$closingtime = $acf_general_business_hours_repeater_item['c_general_business_hours_closing_time'];
if( $local_time >= $opentime && $local_time < $closingtime){
// we are open on this day
// echo 'we are open on this day. the day is currently ' . $acf_general_business_hours_repeater_item['c_general_business_hours_day_of_the_week'];
return $open = true;
}
else{
// echo 'we are currently closed. the day is currently ' . $acf_general_business_hours_repeater_item['c_general_business_hours_day_of_the_week'];
}
}
}
}
// FUNCTIONS FOR TESTING
if(!is_admin()){
is_store_open();
}
function pre_dump($variable, string $color = 'red'){
echo "<pre style='color:" . $color . "'>";
var_dump($variable);
echo "</pre>";
}
Code language: PHP (php)
Hopefully that helps!
The Simple Code (no options page)
Below is the code you can copy and paste if you just need very simple functionality.
<?php
// adapted code from here
// https://stackoverflow.com/questions/14904864/determine-if-business-is-open-closed-based-on-business-hours
function wpirate_business_hours() {
// force business hours status for debugging content on frontend
if ( isset( $_GET['businesshours'] ) ) {
$status = $_GET['businesshours'];
return $status;
}
$status = 'closed';
$storeSchedule = [
'Mon' => ['08:00 AM' => '05:00 PM'],
'Tue' => ['08:00 AM' => '05:00 PM'],
'Wed' => ['08:00 AM' => '05:00 PM'],
'Thu' => ['5:00 AM' => '9:00 AM', '12:00 PM' => '12:15 PM'],
'Fri' => ['11:00 AM' => '05:00 PM']
];
// get current time, change the timezone to what you need
// https://www.php.net/manual/en/timezones
$timeObject = new DateTime('Australia/Sydney');
$timestamp = $timeObject->getTimeStamp();
$currentTime = $timeObject->setTimestamp($timestamp)->format('H:i A');
// comment out the below 3 lines on live site, I just added them for debugging
$currentDay = date('D', $timestamp);
//echo 'the current day is ' . $currentDay . '<br>';
//echo 'the current time is ' . $currentTime . '<br>';
// loop through time ranges for current day
foreach ($storeSchedule[date('D', $timestamp)] as $startTime => $endTime) {
// create time objects from start/end times and format as string (24hr AM/PM)
$startTime = DateTime::createFromFormat('h:i A', $startTime)->format('H:i A');
$endTime = DateTime::createFromFormat('h:i A', $endTime)->format('H:i A');
//echo 'the start time for today is ' . $startTime . '<br>';
//echo 'the end time for today is ' . $endTime . '<br>';
// check if current time is within the range
if (($startTime < $currentTime) && ($currentTime < $endTime)) {
$status = 'open';
break;
}
}
return $status;
}
Code language: PHP (php)
Leave a Reply