首页 > 解决方案 > 使用 PHP 时钟显示“我们明天在 _____ 重新开放”

问题描述

所以我有一个时钟,我目前在整个 Woocommerce 商店都用它来做很多事情。它完美地运行并完成它的工作。

我使用“open”、“close”和“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 && $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 && $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';
    }
}

标签: javascriptphpwordpressdatetimewoocommerce

解决方案


我建议重用这段代码来返回一个数组,同时返回当前状态和未来几天的状态。您可能还需要考虑下一次开放的日期以延长关闭时间,

// -------------------------------------------
// 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 && $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 && $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']));
    }
}

推荐阅读