設定画面やメタボックスでフォームを作るとき、「保存済みの値に合わせてチェックを入れておく」「選択肢を選択状態にしておく」といった処理が必要になります。これを if 文で毎回書くと、コードが読みにくくなりがちです。WordPress には、この定番処理を1行で書ける checked()・selected()・disabled() というヘルパー関数が用意されています。この記事では、3つの関数の使い方と共通の仕組み、設定画面での実践例までを解説します。
目次
checked・selected・disabled とは
この3つは、2つの値を比べて、一致していれば対応するHTML属性を出力するヘルパー関数です。何を出力するかがそれぞれ異なります。
| 関数 | 一致したときに出力する属性 | 主な用途 |
|---|---|---|
checked() | checked="checked" | チェックボックス・ラジオボタン |
selected() | selected="selected" | select の option |
disabled() | disabled="disabled" | 入力欄・ボタンの無効化 |
いずれも既定では属性をその場に出力(echo)するので、フォーム部品のタグの中に <?php ... ?> として差し込むだけで使えます。
checked() でチェック状態を反映する
もっともよく使うのが checked() です。保存済みの値と、そのチェックボックスの値が一致していれば checked 属性を出力します。次の例では、保存された設定が '1' のときにチェックが入った状態で表示されます。
<?php $notify = get_option('my_notify'); // 保存済みの値(例: '1') ?>
<label>
<input type="checkbox" name="my_notify" value="1"
<?php checked($notify, '1'); ?>>
お知らせを受け取る
</label>
$notify が '1' なら checked($notify, '1') が checked="checked" を出力し、チェック済みで表示されます。値が違えば何も出力されず、チェックは外れたままになります。
selected() で選択状態を反映する
プルダウン(select)では、各 option の中で selected() を使い、保存値と一致する選択肢を選択状態にします。
<?php $plan = get_option('my_plan'); // 例: 'pro' ?>
<select name="my_plan">
<option value="free" <?php selected($plan, 'free'); ?>>無料</option>
<option value="pro" <?php selected($plan, 'pro'); ?>>プロ</option>
</select>
この例では $plan が 'pro' なので、「プロ」の option に selected が付いて選択された状態で表示されます。
disabled() で操作を無効にする
disabled() は、条件に応じて入力欄やボタンを無効化したいときに使います。たとえば権限のないユーザーには保存ボタンを押させたくない、という場合に便利です。
<?php
// 権限がない(false)ときに disabled を出力する
$can_edit = current_user_can('manage_options');
?>
<input type="submit" value="保存"
<?php disabled($can_edit, false); ?>>
disabled($can_edit, false) は「$can_edit が false と一致するとき」、つまり権限がないときに disabled を出力します。権限があれば何も出力されず、ボタンは通常どおり押せます。
3つに共通する引数の仕組み
3つの関数は引数の並びが共通で、次の3つを受け取ります。
| 引数 | 説明 |
|---|---|
| 第1引数 | 比較したい値(保存値など) |
| 第2引数 | 比較の基準になる値。省略すると true |
| 第3引数 | true なら出力、false なら文字列を返す。省略時は true |
比較は「等しいか」をゆるやかな比較(==)で判定します。第2引数を省略すると true との比較になるため、値が '1' や 1 のようなチェックボックスでは checked($notify) のように第1引数だけでも書けます。
第3引数を false にすると、出力せずに属性の文字列を返すので、変数に受け取って組み立てることもできます。
<?php
// 第3引数 false で、出力せず文字列として受け取る
$attr = checked($notify, '1', false); // ' checked="checked"' など
echo "<input type='checkbox'{$attr}>";
if 文で書くより読みやすく安全
同じことは if 文でも書けますが、フォーム部品ごとに条件分岐を挟むとコードが長くなり、属性の書き忘れやスペースの過不足といったミスも起きやすくなります。これらのヘルパーは属性を 属性名="属性名" の形で正しく組み立ててくれるため、短く書けるうえにミスも減らせます。WordPress のコア自身も管理画面のフォームでこれらを使っており、テーマやプラグインでフォームを作るときの定番として覚えておくとよいでしょう。
なお、読み取り専用にする readonly 属性用のヘルパーもあります。かつては readonly() という名前でしたが、PHP 8.1 の readonly キーワードと衝突するため、WordPress 5.9 以降は wp_readonly() を使います。使い方は他の3つとまったく同じです。
まとめ
checked()・selected()・disabled() は、2つの値を比べて一致していれば対応するHTML属性を出力する、フォーム用のヘルパー関数です。第1引数に保存値、第2引数に基準値を渡し、既定ではその場に属性を出力します。第2引数を省略すると true との比較になり、第3引数を false にすると文字列として受け取れます。if 文を書くより短く安全にフォームの状態を反映できるので、設定画面やメタボックスを作るときにぜひ活用してみてください。