PHP/Wordpress: IF/ELSE同时执行两个条件


PHP/Wordpress: IF/ELSE executing both conditions

已经阅读了多个类似的问题,并多次检查了我的语法,但我不明白为什么我的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>