首页 > 解决方案 > PHP 多 elseif WP 查询

问题描述

好的,伙计们,我的智慧到此为止。我知道我很接近,但有些事情是不对的。下面是我的条件语句的代码,但它不能正常工作。

本质上,在我的 WP 网站上,我有两组评论,我在 WordPress 之前所做的评论和之后的评论。当我搬到 WP 时,我使用了一种内容类型(Easy Content Types),它为字段提供了一个 ecpt_ 前言。这留下了使用 WordPress 自定义字段的其他人(WordPress 之前的)。

即对于上述内容,“新”字段将是ecpt_trail而旧字段将是Trail

这些是 DVD 评论,所以本质上(用简单的英语)应该说“如果它是带有预告片的 WordPress(新)评论,则打印出“新的带戏剧预告片”,如果是新的没有,打印“新 w /o Theatrical Trailer"。否则它会假定它是具有相同逻辑的旧评论。

简而言之,这在新评论中运行良好,但在旧评论中,它没有显示预告片(我通过一个我知道有的小部件将它放在评论中)。代码有什么问题?

<?php
global $wp_query;
$postid = $wp_query->post->ID;
if( get_post_meta($postid, 'ecpt_trail', true)) { ?>
<li><i class="fa fa-plus-circle fa-lg"></i>  New w/ Theatrical Trailer</li>
<?php } 
 elseif(empty($ecpt_trail)) { 
?>
<li class="minus"><i class="fa fa-minus-circle fa-lg"></i>  New w/o  Theatrical Trailer</li>
<?php } 
 elseif( get_post_meta($postid, 'Trail', true)) { 
?>
<li><i class="fa fa-plus-circle fa-lg"></i>   Old w/ Theatrical Trailer</li>
<?php } 
else(empty($Trail)) 
?>
<li class="minus"><i class="fa fa-minus-circle fa-lg"></i>  Old w/o Theatrical Trailer</li>
<?php  ?>

标签: phpwordpressif-statement

解决方案


我注意到了几件事。

首先 - 一个风格上的决定,但我不认为使用如此简单的 HTML,它需要关闭和重新打开 PHP,而您可以/应该只echo输出代码。

第二 - 另一种风格决定,但通常ID变量更常见地定义为$post_id。绝对无关紧要,但我在我的例子中改变了它。

第三 - 你真的需要访问global $wp_query而不是仅仅通过使用函数定义帖子ID get_the_ID(),甚至global $post直接访问吗?我把它留在那里,以防你出于特定原因使用它,但我会考虑你是否需要调用它,只需将前两行替换为$post_id = get_the_ID();

第四 - 您的最后陈述是一个else陈述,但您将条件传递给它。如果您通过条件,它需要是一个else if语句,else语句只是承载一个默认值,前提是所有其他if else语句在该点之前都返回 false。它需要是} else {} else if( empty( $Trail ) ){

第五 - 您的代码末尾有奇怪的空打开/关闭 PHP 标记。你不需要那些。

第六 - 现在我已经用东西轰炸了你(对不起!)我会开始解决你的问题。其中一部分是您实际上并没有定义您的$ecpt_trail$Trail变量。如果你想定义它们,你可以在你的if语句中定义它们,如下所示:

if( $ecpt_trail = get_post_meta( $post_id, 'ecpt_trail', true ) ){
    // <li>…&lt;/li>
} else if( empty( $ecpt_trail ) ){ 
    // <li>…&lt;/li>
}

这是该代码的样子:

<?php
    global $wp_query;
    $post_id = $wp_query->post->ID;

    if( $ecpt_trail = get_post_meta( $post_id, 'ecpt_trail', true ) ){
        echo '<li><i class="fa fa-plus-circle fa-lg"></i>  New w/ Theatrical Trailer</li>';
    } else if( empty( $ecpt_trail ) ){ 
        echo '<li class="minus"><i class="fa fa-minus-circle fa-lg"></i>  New w/o  Theatrical Trailer</li>';
    } else if( $Trail = get_post_meta( $post_id, 'Trail', true ) ){ 
        echo '<li><i class="fa fa-plus-circle fa-lg"></i>   Old w/ Theatrical Trailer</li>';
    } else if( empty( $Trail ) ){
        echo '<li class="minus"><i class="fa fa-minus-circle fa-lg"></i>  Old w/o Theatrical Trailer</li>';
    }
?>

话虽如此,您实际上也可能没有通过第二个if语句,这可以解释为什么您没有看到旧预告片,考虑到您基本上是在处理第一个 if 语句的两种可能结果。如果第一个if语句返回 true,它会停在那里并输出New w/ Trailer,如果不是;因为您实际上并没有定义$ecpt_trailer;第二个返回 true,然后停止输出New w/o Trailer。这些是这一条件的仅有的两个结果。

现在,我还认为您在这里有很多冗余可以清除 - 您也可以通过使用旧元键遍历所有旧帖子并使用add_post_meta()克隆值来使自己更容易做到这一点。然后你只需要担心一个元密钥,并且可以丢弃旧的。

此外,失败时get_post_meta()会返回false,您可以利用它来发挥自己的优势,而不用担心它是否empty成功,因为它也会返回成功的真实值。

以下是我会考虑这样做的方式 - 因为两种故障条件都不会告诉您no trailer实际上是没有新的还是没有的旧:

<?php
    $post_id = get_the_ID();

    if( $trailer = get_post_meta( $post_id, 'ecpt_trail', true ) ){
        // New Trailer Exists, $trailer now defined as `ecpt_trail` value
        echo '<li><i class="fa fa-plus-circle fa-lg"></i>  New w/ Theatrical Trailer</li>';
    } else if( $trailer = get_post_meta( $post_id, 'Trail', true ) ){
        // New Trailer not there, $trailer now defined as `Trail` value
        echo '<li><i class="fa fa-plus-circle fa-lg"></i>  Old w/ Theatrical Trailer</li>';
    } else {
        // Neither Trailer exists, $trailer now defined as `false`
        echo '<li class="minus"><i class="fa fa-minus-circle fa-lg"></i>  Either w/o Theatrical Trailer</li>';
    }

推荐阅读