php - 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 ?>
解决方案
我注意到了几件事。
首先 - 一个风格上的决定,但我不认为使用如此简单的 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>…</li>
} else if( empty( $ecpt_trail ) ){
// <li>…</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>';
}
推荐阅读
- python - 在 Mac 11.0.1 上运行 Django 站点的 AttributeError
- awk - Comparing column of two files
- css - BigCartel Neat Theme - Home Page Changes
- angularjs - AngularJS + Asp.net WebApi - Cannot get authentication to work due to CORS
- r - 删除数据框中的第二个精确观察
- angular - App Insights for Angular 中无法解释的空依赖和循环依赖
- .net - unexpected element
found in manifest while building the project - xslt - XSL Call Template String param as group-by element value
- ruby-on-rails - acts_as_paranoid gem is not working when we run sql query to delete record
- reactjs - 使用 React 自定义钩子的 API 调用不接受更新的参数