1. ゴールイメージ
| before | after |
|---|
[mwform_select] を置くと手入力の “固定選択肢” だけ | 年が 最新(今年)→100 年前 まで自動で並ぶ 新年になっても放置で OK |
基本コンセプト
- フォーム側
- いつものタグジェネレーターで
mwform_select を挿入
- children(選択肢)欄は空にする
- テーマ側(functions.php)
mwform_choices_{フォームID} フィルタで 選択肢配列を差し替え
date('Y') から range() で 動的に年を生成
フォーム編集画面での設定
- WordPress ダッシュボード → MW WP Form → フォーム編集
- タグジェネレーターから セレクトボックス を挿入 htmlコピーする編集する
[mwform_select name="birth_year" show_error="true"]
- children は空欄
- 必須チェックを入れたい場合は htmlコピーする編集する
[mwform_validation_rules name="birth_year" rules="required"]
functions.php に追記するコード
/**
* birth_year の選択肢を動的に生成
*
* フィルタ名の末尾「123」はフォームIDに置き換えてください。
* 例)フォームID=5 → 'mwform_choices_mw-wp-form-5'
*/
add_filter( 'mwform_choices_mw-wp-form-123', function ( $choices, $atts ) {
// 該当フィールド以外はスルー
if ( $atts['name'] !== 'birth_year' ) {
return $choices;
}
// 今年から100年前までの配列を作成
$current = date( 'Y' ); // 例:2025
$years = range( $current, $current - 100 );
// ラベル => 値 の連想配列に変換
// 例) [2025 => 2025, 2024 => 2024, ...]
return array_combine( $years, $years );
}, 10, 2 );
コード解説
| 行 | ポイント |
|---|
$atts['name'] !== 'birth_year' | 同フォーム内の 他のセレクト には干渉しない安全策 |
date('Y') | 毎年 1 月 1 日の 0:00 に 自動で更新 |
range( $current, $current - 100 ) | 降順 (start > end) にすると 自動で大きい順 |
array_combine() | MW WP Form が求める ['ラベル' => '値'] 形式へ一発変換 |
もっとカスタマイズしたいときは?
| 目的 | 変更ポイント |
|---|
| 年の並びを昇順(古い→新しい) | range() を range( $current - 100, $current ) に |
| 2000 年以降だけで良い | $years = range( $current, 2000 ); |
| 初期値を空欄にしたい | array_unshift( $years, '' ); → array_combine() へ |
動作確認 & デバッグ TIPS
- フォームを保存 → プレビュー
- ドロップダウンに 最新年(例:2025)~1925 が表示されれば成功
- うまくいかない場合は…
フォームID の数字を間違えていないか?
birth_year の name 属性 が一致しているか?
- キャッシュ系プラグインが選択肢を握りつぶしていないか?
まとめ
- MW WP Form 公式タグ を崩さずに “動的選択肢” を実装
- 毎年の 手作業メンテ がゼロに
- PHP 初心者でも 約 20 行 で完結!
来年・再来年と年が進んでも放置で OK。
「あのフォーム、年が古いまま…」問題 にサヨナラしましょう!
よくある質問
| 質問 | 回答 |
|---|
| Q. 確認画面やメールには何と書けばいい? | [birth_year] と書くだけ。選択値(数値)が出力されます。 |
| Q. プルダウンの CSS を変えたい | class="year-select" をタグジェネレータで追加し、CSS で .year-select { … } を指定。 |