动态开放时间简码总是显示关闭

Dynamic Opening Times shortcode always displaying Closed

我创建的用于提取商店营业时间并根据营业时间数组显示 'Open' 或 'Closed' 状态的简码存在问题。

我曾经让它工作过,或者我曾经这么想过,但它似乎已经停止工作了。我不相信我已经用它改变了很多,我也尝试了这个 SO post 中提到的一些替代方法:Determine If Business Is Open/Closed Based On Business Hours

替代方法要么不起作用,要么只是标记了错误。

我希望它设置为 Europe/London 时间戳,因为该商店仅位于英国。知道我在这里做错了什么吗?

在此期间我会继续加班,不过对我来说似乎很奇怪。

我知道我使用的原始代码是基于这里的旧 post(大约 6 岁),所以我想知道它是否已经过时 PHP。我们的服务器是 运行 PHP 7.

//open/closing times
function opening_times() {
ob_start();
$storeSchedule = [
'Sun' => ['10:00 AM' => '15:00 PM'],
'Mon' => ['10:00 AM' => '17:00 PM'],
'Tue' => ['10:00 AM' => '17:00 PM'],
'Wed' => ['00:00 AM' =>  '00:00 AM'],
'Thu' => ['10:00 AM' => '17:00 PM'],
'Fri' => ['10:00 AM' => '17:00 PM'],
'Sat' => ['09:00 AM' => '17:00 PM']
];

// current OR user supplied UNIX timestamp
$timeObject = new DateTime('Europe/London');
$timestamp = $timeObject->getTimeStamp();

// default status
$status = 'closed';

// get current time object
$currentTime = (new DateTime())->setTimestamp($timestamp);

// loop through time ranges for current day
foreach ($storeSchedule[date('D', $timestamp)] as $startTime => $endTime) {

// create time objects from start/end times
$startTime = DateTime::createFromFormat('h:i A', $startTime);
$endTime   = DateTime::createFromFormat('h:i A', $endTime);

// check if current time is within a range
if (($startTime < $currentTime) && ($currentTime < $endTime)) {
    $status = 'open';
    break;
    }
}

echo '<div><i class="far fa-clock fa-3x"></i><span class="open-times"><small>We are ' . $status . '</small><br>';
return ob_get_clean();
}
add_shortcode( 'open_times', 'opening_times' );

它在某种程度上起作用,因为状态不断显示为 "Closed",如果商店未营业,这应该是默认状态。

它只是不再在任何时候显示为 "Open" 状态。满足开场时间的条件,应该显示为"Open"。

不确定你为什么选择在你自己创建的数组中使用 AM 和 PM 时间格式,但基本上没有 17:00 PM 它应该是 5:00 PM 所以只需修复你的数组代码将起作用。

问题是试图从这一行的 17:00 PM 创建 DateTime。基本上每次都失败

$endTime   = DateTime::createFromFormat('h:i A', $endTime);

所以只需修复您的数组以使用有效时间,代码就可以工作了。

$storeSchedule = [
    'Sun' => ['10:00 AM' => '03:00 PM'],
    'Mon' => ['10:00 AM' => '05:00 PM'],
    'Tue' => ['10:00 AM' => '05:00 PM'],
    'Wed' => ['00:00 AM' => '00:00 AM'],
    'Thu' => ['10:00 AM' => '05:00 PM'],
    'Fri' => ['10:00 AM' => '05:00 PM'],
    'Sat' => ['09:00 AM' => '05:00 PM']
];