已经阅读了多个类似的问题,并多次检查了我的语法,但我不明白为什么我的PHP代码执行这两个条件。
我试图用自定义字段中的字符串替换元素的url,如果该字段不为空。如果字段为空,我希望正常输出永久链接。发生的情况是,当字段不为空时,代码将来自自定义字段的字符串和永久链接连接起来。如果我删除字段中的字符串,它工作得很好。
<div class="profile-content">
<a href="
<?php
if ( the_field('direct_resource_link') != '') {
the_field('direct_resource_link');
} else {
the_permalink($id);
} ?>
"><h5><?php the_title(); ?></h5></a>
<div class="profile-footer">
谢谢!丹。
在原海报评论后编辑
我最初的评估(如下图所示)是正确的。您正在使用将print
/echo
内容而不是return
内容的功能。你的if总是求值为false,因为你调用的函数什么都不返回;PHP认为nothing和empty string是一样的
当字段为空时,您没有看到这一点,因为the_field()
对于空字段打印空字符串(或什么都没有),即它没有以任何方式修改the_permalink()
打印的值/
根据ACF文档,the_field()
与get_field()
一起返回值而不是打印。
你的代码应该是这样的:
<div class="profile-content">
<a href="
<?php
if ( get_field('direct_resource_link') ) {
the_field('direct_resource_link');
} else {
the_permalink($id);
} ?>
"><h5><?php the_title(); ?></h5></a>
<div class="profile-footer">
我的初始帖子
发生的是你运行函数the_field('direct_resource_link')
并比较它的返回值为";如果该值为空,则运行the_permalink($id);
。
很难说the_field()
是什么以及它应该做什么,但我猜它是print
的值而不是return
的值。因此,如果field为空,则不打印任何内容,从而导致the_permalink()
的纯运行。如果field不为空,则输出内容,不返回任何内容。由于没有什么等于空字符串,PHP继续执行else
分支,并调用the_permalink()
来打印额外的信息。
解决方法:修改the_field()
使其返回值而不是打印值,或者编写额外的函数来查询并返回值,并在if语句中使用该函数
Miroslaw Zalewski已经在这里回答了你的问题,所以这只是向你展示解决问题所需的代码:
function get_the_field($field) {
ob_start();
the_field($field);
return ob_get_clean();
}
这段代码将启动一个输出缓冲区(它将捕获所有回显数据),运行the_field
并返回(并删除)输出缓冲区(来自the_field
的回显数据)。这意味着您可以简单地执行以下操作:
...
<?php
$theField = get_the_field('direct_resource_link');
if ( $theField != '') {
echo $theField;
} else {
the_permalink($id);
}
?>
...
这些都可以简化。the_field()
回显一个元值。你不会想要那样的……相反,您希望在有条件地回显该值之前对其进行return
检查。您可以使用get_field()
来做到这一点。
<a href="<?php get_field('direct_resource_link') ? the_field('direct_resource_link') : the_permalink($id); ?>">
<h5><?php the_title(); ?></h5>
</a>