phpでformを作っていて、google reCAPTCHA v3 を使うと、requiredを使って必須入力項目のチェックができません。(2分以内の送信に限ればrequiredが使えるけど・・・)
そこで、下記の流れで処理します。
submit(送信)
↓↓↓
サニタイズ
↓↓↓
エラー確認(必須項目の入力チェック)
↓↓↓
エラーがあるなら、入力画面に戻す
エラーがあるとき、入力画面に戻るとき、<input>要素なら、
<input type="text" name="zipcode" class="p-postal-code" size="8" maxlength="8" value="<?php if ( ! empty( $clean['zipcode'] ) ) { echo esc_attr( $clean['zipcode'] ); } ?>">
こんな風に、valueに書き込みます。
※$clean['zipcode']
は、$_POST['zipcode']
や$_GET['zipcode']
をサニタイズ処理したものです。esc_attr()はWordPressでHTML 要素の属性(alt, value, title, class など)の値に出力する文字をエスケープします。サニタイズ処理が2重になっている感じがありますが、esc_attr()は既にエスケープ処理されている場合はそのままですので、速度が遅くなりサーバーに負担がちょっとかかりますが問題ありません。
チェックボックスなら、こんな感じです。(input要素にcheckedを入れればOK)
<input id="ck1" type="checkbox" name="ck1" <?php if ( ! empty( $clean['ck1'] ) ) { echo 'checked'; } ?> >
select はちょっとコツがいる
selectは、option要素にselectedを入れることで、選択状態を保持できます。
1つ1つにphpを入れて判定させても、良いのですが何個もあると大変です。
<select name="mi"> <option value="なし" <?php if ( ! empty( $clean['mi'] ) ) { if ( 'なし' === $clean['mi'] ) { echo 'selected'; } } ?>>なし</option> <option value="あり" <?php if ( ! empty( $clean['mi'] ) ) { if ( 'あり' === $clean['mi'] ) { echo 'selected'; } } ?>>あり</option> </select>
そこで、選択項目を連想配列にして、foreachを使って簡単に処理しちゃいましょう。
<select name="pref" class="p-region-id"> <option value=""></option> <?php foreach ( $prefs as $key => $pref ) { if ( ! empty( $clean['pref'] ) ) { if ( $key === $clean['pref'] ) { echo '<option value="' . $key . '" selected>' . $pref . '</option>'; } else { echo '<option value="' . $key . '">' . $pref . '</option>'; } } else { echo '<option value="' . $key . '">' . $pref . '</option>'; } } ?> </select>
説明がちょっと難しいのですが・・・
$prefsはキーが数字、値が都道府県の連想配列です。
$prefs = array( '1' => '北海道', '2' => '青森県', '3' => '岩手県', ・・・ '47' => '沖縄県', );
連想配列をforeachで回して、optionを作ります。
最初は、$clean['pref']
があるなしをif ( ! empty( $clean['pref'] ) )
で判断します。
これをしないとエラーが出ます。
送信ボタンを押すと、optionのvalueの値が、$_POST['pref']
や$_GET['pref']
に入るので、サニタイズ処理して$clean['pref']
。
$clean['pref']
が該当する(選択したもの)がforeachで回ってきたら、selectedがある方が出力されて、選択状態を保持できます。
説明が難しい・・・
ちなみに、郵便番号を入力すると自動で入力してくれるyubinbango.jsを使って、都道府県をプルダウン表示する目的で作っています。
option要素のvalueと表示する文字列が同じなら、配列でもOKです。
<?php $k_array = array( '責任者', 'A士', 'B師', 'その他' ); ?> <select name="k"> <option value=""></option> <?php foreach ( $k_array as $value ) { if ( ! empty( $clean['k'] ) ) { if ( $value === $clean['k'] ) { echo '<option value="' . $value . '" selected>' . $value . '</option>'; } else { echo '<option value="' . $value . '">' . $value . '</option>'; } } else { echo '<option value="' . $value . '">' . $value . '</option>'; } } ?> </select>