0

私は非常に基本的なものでのみphpに触れます。

しかし、ワードプレスのテーマを作成するときは、常にエラーや通知を避けたいと思っています。

分類用語を一覧表示するために作成した単純な関数を以下に示します。

$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

2つ目は、より効率的な方法になります。

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

2番目のアプローチは、私の経験ではより一般的です。もちろん、次のように、三項演算子を使用してこれを短縮することもできます。

$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

2番目のオプションは、変数値がループごとに実際に変化することを確認するための最良のアプローチです。そうでない場合、前のループの値が現在のループに影響を与える可能性があります。

たとえば、アクティブな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 に答える