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!

Show/Hide Elements based on "Business Opening Hours" - PHP challenge | bricks, acf options page

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)