0

我只在非常基本的东西上接触 php。

但我总是喜欢在制作 wordpress 主题时避免错误/通知。

我在下面有一个简单的函数来列出我的分类术语。

$tax = 'dealer-communications';
$terms = get_terms($tax);
$count = count($terms);
if ( $count > 0 ){
    echo '<li class="nav-header">Dealer communications</li>';
    foreach ( $terms as $term ) {
        if (get_queried_object()->slug == $term->slug) $active = 'class="active"';
        echo '<li '.$active.'><a href="'.get_term_link($term->slug, $tax).'">' . $term->name . '</a></li>';
    }
}


如您所见,我有一个$active变量。

当 my不匹配时,此active变量未定义get_queried_object()->slug$term->slug

如何避免我的活动变量未定义。所以它被定义但为空。

他们唯一能让我的大脑解决问题的方法就是这样做......

$active = null;
if (get_queried_object()->slug == $term->slug) $active = 'class="active"';

或者...

if (get_queried_object()->slug == $term->slug) {
    $active = 'class="active"';
} else {
    $active = '';
}


这是最有效的方法还是有替代的 php 方法?


非常感谢乔希

4

5 回答 5

2

没有替代 php 方法,但为了便于阅读,您不应在if块中声明/初始化变量,例如:

foreach ( $terms as $term ) {
    $active = '';
    if (get_queried_object()->slug == $term->slug) $active = 'class="active"';
    echo '<li '.$active.'><a href="'.get_term_link($term->slug, $tax).'">' . $term->name . '</a></li>';
}

您还可以使用三元运算符(但不是真正可读):

$active = (get_queried_object()->slug == $term->slug) ? 'class="active"' : '';
于 2013-03-25T11:00:32.567 回答
1

根据我的经验,第二种方法更常见。您当然可以使用三元运算符来缩短它,类似于:

$active = (get_queried_object()->slug == $term->slug) ? 'class="active"' : '';
//       if ^                                            ^ do this        ^ else do this    

不过,有些人认为这更令人困惑。我想这归结为个人喜好。

于 2013-03-25T10:58:56.437 回答
1

您也可以使用三元运算符,因为它有点短:

$active = ( get_queried_object()->slug == $term->slug ? 'class="active"' : '' );
于 2013-03-25T10:59:16.910 回答
1

第二个将是更有效的方法:

if (get_queried_object()->slug == $term->slug) {
    $active = 'class="active"';
} else {
    $active = '';
}
于 2013-03-25T10:56:00.997 回答
-1

第二种选择是最好的方法,因为它确保变量值在每个循环中实际发生变化,否则前一个循环的值可能会影响当前循环。

例如,您获得一个活动的 LI,将 $active 设置为正确的值,一切正常。但是,在下一个循环步骤中,LI 不应该处于活动状态,但是因为您没有清除先前的分配,所以 $active 变量仍会将此 LI 设置为活动状态。

编辑: PHP 范围不像 javascript 范围那样工作,对此答案的一些评论似乎需要这个澄清:

$test = array(
  array("name"=>"Is inactive", "active"=>false),
  array("name"=>"Is active", "active"=>true),
  array("name"=>"Is caught by problem", "active"=>false)
);

foreach ($test as $example ){
  if ($example["active"]) $active = true;

  if ($active) {
    echo $example["name"]." was parsed as ACTIVE\n";
  } else {
    echo $example["name"]." was parsed as INACTIVE\n";
  }
}

输出一个通知(因为 $active 在循环的第一步未定义)和以下文本:

Is inactive was parsed as INACTIVE
Is active was parsed as ACTIVE
Is caught by problem was parsed as ACTIVE <--- Problem
于 2013-03-25T10:57:15.810 回答