Отображение «мы вновь откроемся завтра в ____» с использованием PHP clock

#javascript #php #wordpress #datetime #woocommerce

#javascript #php #wordpress #дата и время #woocommerce

Вопрос:

Итак, у меня есть часы, которые я в настоящее время использую для выполнения многих задач в магазине Woocommerce. Он отлично работает и выполняет свою работу.

Я использую ‘open’, ‘closed’ и ‘last_call’ для отображения сообщений в разных областях сайта. Это также отключает определенные вещи в оформлении заказа в зависимости от открытого статуса и т.д.

Что я хотел бы сделать, так это использовать эту функцию для отображения «Мы снова откроемся завтра в 9:00 утра» или, если время открытия достаточно близко, «Мы снова откроемся в 9:00 утра (через 1 час и 23 минуты)».

Это код, который у меня есть. Нужно ли мне повторно использовать эту функцию и, по сути, дублировать большую ее часть или есть более чистый способ добиться этого?

(PS. Часы хранения извлекаются из поля даты / времени ACF на странице пользовательских параметров)

TIA

 // -------------------------------------------
// STORE CLOCK
// -------------------------------------------
function store_clock() {

    $weekday_open = get_field('weekday_open', 'options');
    $sat_open = get_field('sat_open', 'options');
    $sun_open = get_field('sun_open', 'options');
    $weekday_close = get_field('weekday_close', 'options');
    $sat_close = get_field('sat_close', 'options');
    $sun_close = get_field('sun_close', 'options');
    $store_closed = get_field('close_store', 'options');

    $store_times = array(
        array( //Sunday
            'open' => $sun_open,
            'close' => $sun_close,
        ), 
        array( //Monday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Tuesday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Wednesday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Thursday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Friday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ),
        array( //Saturday
            'open' => $sat_open,
            'close' => $sat_close,
        ), 
    );

    $current_day = date( 'w', current_time('timestamp') ); //Numeric representation of the day (0 for Sunday, 6 for Saturday)
    $current_date = date( 'd F Y', current_time('timestamp') );

    if ( $store_times[$current_day] !== false amp;amp; $store_closed !== true ) {

        $opening_time = strtotime( sprintf( '%s %s', $current_date, $store_times[$current_day]['open'] ) );
        $closing_time = strtotime( sprintf( '%s %s', $current_date, $store_times[$current_day]['close'] ) );

        if ( $closing_time - current_time('timestamp') > 0 amp;amp; $closing_time - current_time('timestamp') < 1800 ) {

            return 'last_call';

        } elseif  ( $opening_time > current_time('timestamp') || $closing_time < current_time('timestamp') ) {

            return 'closed';

        } else {

            return 'open';

        }
    } else {
        return 'closed';
    }
}
 

Ответ №1:

Я бы предложил повторно использовать этот фрагмент кода для возврата массива, возвращая как текущий статус, так и статус на следующий день. Вы также можете учитывать дату следующего открытия для расширенных периодов закрытия,

 // -------------------------------------------
// STORE CLOCK
// -------------------------------------------
function store_clock() {

    $weekday_open = get_field('weekday_open', 'options');
    $sat_open = get_field('sat_open', 'options');
    $sun_open = get_field('sun_open', 'options');
    $weekday_close = get_field('weekday_close', 'options');
    $sat_close = get_field('sat_close', 'options');
    $sun_close = get_field('sun_close', 'options');
    $store_closed = get_field('close_store', 'options');

    $store_times = array(
        array( //Sunday
            'open' => $sun_open,
            'close' => $sun_close,
        ), 
        array( //Monday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Tuesday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Wednesday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Thursday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ), 
        array( //Friday
            'open' => $weekday_open,
            'close' => $weekday_close,
        ),
        array( //Saturday
            'open' => $sat_open,
            'close' => $sat_close,
        ), 
    );

    $current_day = date( 'w', current_time('timestamp') ); //Numeric representation of the day (0 for Sunday, 6 for Saturday)
    $current_date = date( 'd F Y', current_time('timestamp') );

    if ( $store_times[$current_day] !== false amp;amp; $store_closed !== true ) {

        $opening_time = strtotime( sprintf( '%s %s', $current_date, $store_times[$current_day]['open'] ) );
        $closing_time = strtotime( sprintf( '%s %s', $current_date, $store_times[$current_day]['close'] ) );

        if ( $closing_time - current_time('timestamp') > 0 amp;amp; $closing_time - current_time('timestamp') < 1800 ) {

            return array('last_call', null);

        } elseif  ( $opening_time > current_time('timestamp') || $closing_time < current_time('timestamp') ) {

            return array('closed', (isset($store_times[$current_day   1]) ? $store_times[$current_day   1]['open'] : $store_times[0]['open']));

        } else {

            return array('open', null);

        }
    } else {
        return array('closed', (isset($store_times[$current_day   1]) ? $store_times[$current_day   1]['open'] : $store_times[0]['open']));
    }
}