Fatal error: Call to a member function format() on boolean passing in Wordpress ACF Datepicker to template
Fatal error: Call to a member function format() on boolean passing in Wordpress ACF Datepicker to template
这是我的代码:
$original_date = get_field('event_date');
$date = DateTime::createFromFormat('lFdY', strtotime($original_date));
$new_date = $date->format('l, F d, Y');
此代码位于短代码中的自定义 post 循环中,并在 Wordpress 管理员中调用。
我也试过没有 strtotime
。我正在使用 PHP 5.6。
event_date
字段来自高级自定义字段日期选择器。
如果我只传递该字段,我会得到预期的输出(来自自定义 post 管理页面的输入),但没有空格和逗号。我也设置了这个,在 WP 的 acf 中保存和显示值。
这是错误:
Fatal error: Call to a member function format() on boolean on the line
with $new_date variable.
那么如果我使用:
$date = date("l, F d, Y", strtotime($original_date));
循环为 post 的每个实例抛出一个错误,未定义的变量。
您应该将字符串直接传递给 createFromFormat
方法:
$date = DateTime::createFromFormat('lFdY', $original_date);
您收到的 boolean
是因为 createFromFormat
失败并返回 false
。
如果您仍然收到错误,get_field()
可能没有返回您认为的结果。
DateTime::createFromFormat returns false
如果无法使用指定的格式转换输入字符串。
在你的例子中,你正在使用 $original_date
,将其转换为数字时间戳,并试图将其传递给 DateTime::createFromFormat
,这是行不通的,因此错误。您需要改为传递原始日期:
$date = DateTime::createFromFormat('lFdY', $original_date);
PHP 目前无法解析该特定格式字符串。您可以通过一个应该 "obviously" 有效的简单案例来证明这一点。这个:
DateTime::createFromFormat('lFdY', date('lFdY', time()));
returnsfalse
。该问题的具体原因是格式字符串中的 l
和 F
之间以及输入字符串中的 day-of-week 和月份之间缺少 space。
您应该使用不同的日期格式。如果您可以删除 day-of-week 的文本表示(因为实际上没有必要消除日期的歧义),或者至少在 day-of-week 和月份之间得到一个 space,那将是最好的。
由于您的数据库中现有数据的格式无用,您可以编写一个相对简单的 pre-processor 来从输入字符串中删除 day-of-week:
$new_date = substr($original_date, strpos($original_date, 'y') + 1);
$date = DateTime::createFromFormat('FdY', $new_date);
(此示例始终采用小写的英文日期名称,并且输入始终有效。您的实际数据可能需要更复杂的代码。)
细节,细节: 当 PHP processes l
格式化程序(星期几)时,它需要查看以下字符之一:,;:/.-()
、space、制表符或 end-of-string 作为停止阅读位置的指示。
因此,如果您的日期字符串是 FridayJuly082016
,因为输入日期中没有任何 space,代码将继续读取 整个 字符串,然后失败,因为(字面上)FridayJuly082016
不在一周中的几天列表中。
不幸的是,对于您的特定情况,这也不太可能 "fixed"。您有一个非常不寻常的日期格式,并且在代码中使用这个特殊情况会使它变得相当复杂,对于一个有问题和罕见的用例。
尝试使用这个 .. <?php echo date('l, F d, Y', strtotime(get_field('event_date')));?>
它在我这边工作
Make sure your get_field('event_date')
returns you the date in 20160113 format
If not then change the return format from ACF setting in WP back-end.
@jbafford 我找到了解决方案。
首先,我在 ACF 日期选择器字段中将日期格式保存为 yymmdd
然后我用这段代码分别提取年月日然后格式化strtotime结果:
$odate = get_field('event_date');
$y = substr($odate, 0, 4); $m = substr($odate, 4, 2); $d = substr($odate, 6, 2);
$new_date = date('l, F j, Y', strtotime("{$d}-{$m}-{$y}"));
让我感到困惑并让我挂断电话的是我必须将 l 或日期传递到 strtotime 并且我必须将输入与预期的格式化输出相匹配的假设。 PHP date 不需要那么多信息来完成任务。感谢您的所有输入!
这是我的代码:
$original_date = get_field('event_date');
$date = DateTime::createFromFormat('lFdY', strtotime($original_date));
$new_date = $date->format('l, F d, Y');
此代码位于短代码中的自定义 post 循环中,并在 Wordpress 管理员中调用。
我也试过没有 strtotime
。我正在使用 PHP 5.6。
event_date
字段来自高级自定义字段日期选择器。
如果我只传递该字段,我会得到预期的输出(来自自定义 post 管理页面的输入),但没有空格和逗号。我也设置了这个,在 WP 的 acf 中保存和显示值。
这是错误:
Fatal error: Call to a member function format() on boolean on the line with $new_date variable.
那么如果我使用:
$date = date("l, F d, Y", strtotime($original_date));
循环为 post 的每个实例抛出一个错误,未定义的变量。
您应该将字符串直接传递给 createFromFormat
方法:
$date = DateTime::createFromFormat('lFdY', $original_date);
您收到的 boolean
是因为 createFromFormat
失败并返回 false
。
如果您仍然收到错误,get_field()
可能没有返回您认为的结果。
DateTime::createFromFormat returns false
如果无法使用指定的格式转换输入字符串。
在你的例子中,你正在使用 $original_date
,将其转换为数字时间戳,并试图将其传递给 DateTime::createFromFormat
,这是行不通的,因此错误。您需要改为传递原始日期:
$date = DateTime::createFromFormat('lFdY', $original_date);
PHP 目前无法解析该特定格式字符串。您可以通过一个应该 "obviously" 有效的简单案例来证明这一点。这个:
DateTime::createFromFormat('lFdY', date('lFdY', time()));
returnsfalse
。该问题的具体原因是格式字符串中的 l
和 F
之间以及输入字符串中的 day-of-week 和月份之间缺少 space。
您应该使用不同的日期格式。如果您可以删除 day-of-week 的文本表示(因为实际上没有必要消除日期的歧义),或者至少在 day-of-week 和月份之间得到一个 space,那将是最好的。
由于您的数据库中现有数据的格式无用,您可以编写一个相对简单的 pre-processor 来从输入字符串中删除 day-of-week:
$new_date = substr($original_date, strpos($original_date, 'y') + 1);
$date = DateTime::createFromFormat('FdY', $new_date);
(此示例始终采用小写的英文日期名称,并且输入始终有效。您的实际数据可能需要更复杂的代码。)
细节,细节: 当 PHP processes l
格式化程序(星期几)时,它需要查看以下字符之一:,;:/.-()
、space、制表符或 end-of-string 作为停止阅读位置的指示。
因此,如果您的日期字符串是 FridayJuly082016
,因为输入日期中没有任何 space,代码将继续读取 整个 字符串,然后失败,因为(字面上)FridayJuly082016
不在一周中的几天列表中。
不幸的是,对于您的特定情况,这也不太可能 "fixed"。您有一个非常不寻常的日期格式,并且在代码中使用这个特殊情况会使它变得相当复杂,对于一个有问题和罕见的用例。
尝试使用这个 .. <?php echo date('l, F d, Y', strtotime(get_field('event_date')));?>
它在我这边工作
Make sure your
get_field('event_date')
returns you the date in 20160113format
If not then change the return format from ACF setting in WP back-end.
@jbafford 我找到了解决方案。 首先,我在 ACF 日期选择器字段中将日期格式保存为 yymmdd
然后我用这段代码分别提取年月日然后格式化strtotime结果:
$odate = get_field('event_date');
$y = substr($odate, 0, 4); $m = substr($odate, 4, 2); $d = substr($odate, 6, 2);
$new_date = date('l, F j, Y', strtotime("{$d}-{$m}-{$y}"));
让我感到困惑并让我挂断电话的是我必须将 l 或日期传递到 strtotime 并且我必须将输入与预期的格式化输出相匹配的假设。 PHP date 不需要那么多信息来完成任务。感谢您的所有输入!