MW WP Form:チェックやセレクトの選択肢を投稿カスタムフィールドから動的に変更させる
Tag: MW WP Form
以前に投稿の情報(タイトルやカスタムフィールドの値)をフォームのフィールドに入れるという記事を書きましたが、今回はカスタムフィールドで作った内容を使ってチェックボックスやセレクトボックスの選択肢を動的に変えてみます。
用途としてはイベント申し込みフォームなんかですかね。
それぞれのイベントの投稿に設定した複数のイベント開催日を選択肢として設定してみます。
作るデータ
例として「イベント①」「イベント②」という記事を作成し、その記事にカスタムフィールド(event_date)で開催日を設定します。
カスタムフィールドのプラグインはCustom Field Suiteというのを使ってみました。
繰り返し対応のプラグインです。
入力欄はこんな感じ。
データはこんな感じで作ります。
イベント①のevent_date Array ( [0] => 2023-05-31 [1] => 2023-06-12 ) イベント②のevent_date Array ( [0] => 2023-08-15 [1] => 2023-08-22 )
プラグインによって違いはあると思いますので、get_post_metaで出力した結果こうなるように作ってみてください。
投稿IDをパラメーターに
ここは前回と一緒です。
まぁこれがないと参照するデータがわからないわけですしね。
<a href="https://securavita.net/event_form/?post_id=100">イベント参加申し込み</a> 動的の場合は <a href="<?php echo esc_url( home_url( '/event_form/?post_id='.get_the_ID() ) ); ?>">イベント参加申し込み</a>
フォームの設定
フォームには予め空のフィールドを用意しておきます。
<p>メールアドレス</p> [mwform_email name="email"] <p>イベント開催日</p> [mwform_select name="event_date" post_raw="true"] [mwform_submitButton name="submit_btn" confirm_value="確認画面へ" submit_value="送信する"]
こんな感じのフォームになります。
セレクトボックスには何も入ってないので空になってます。
あとURL引数を有効にするにはチェックを入れておいてください。
これにチェックが入っていないとURL設定を使用している場合うまく動作しません。
値を取り出して選択肢にセット
選択肢にの中身を書き換えるにはmwform_choices_mw-wp-form-xxxというフィルターフックを使います。
function sv_set_options_event_date( $children, $atts ) { if ( $atts['name'] == 'event_date' ) { $post_id = ( isset( $_GET['post_id'] ) && $_GET['post_id'] ) ? $_GET['post_id'] : false; if( $post_id ) { $event_date = get_post_meta( $post_id, 'event_date' ); if( $event_date ) { foreach( $event_date as $date ) { $children[$date] = $date; } } } } return $children; } add_filter( 'mwform_choices_mw-wp-form-xxx', 'sv_set_options_event_date', 10, 2 );
URLパラメータのpost_idを取得し、そのIDのカスタムフィールド「event_date」があればそれを選択肢として返しています。
Custom Field Suiteを使っているので「get_post_meta( $post_id, ‘event_date’ )」ですが他のプラグインだと「get_post_meta( $post_id, ‘event_date’, true )」になる場合もあるので注意してください。
なのでイベント①からリンクした場合は
イベント②からリンクした場合は
とそれぞれ違う値がセレクトボックスに入ってます。
$childrenのキーが送信値、値が表示値になります。
表示形式を変更したい場合はここで行ってください。
選択肢が設定されていない場合は
if( $event_date ) { foreach( $event_date as $date ) { $children[$date] = $date; } } else { $children[''] = '日程が設定されていません' }
とやることで送信値が空の項目をセットできます。
フォームの設定で必須にしておけば日程が設定されていないイベントは送信できないという処理ができるようになります。
必須のチェックや送信値・表示値で分ける場合はフォームに「post_raw=”true”」の」設定をお忘れなく。
例としてセレクトボックスでやりましたがチェックボックスやラジオボタンも同じ方法でOKです。
- Category: Works , WordPress , Plugins
- Tag: MW WP Form