実現したいこと
Contact Form 7とAdvanced Custom Fieldsを使って、予約フォームの希望日時欄を作成したいです。
ワードプレスの管理画面で予約可能な日付と時間をそれぞれ設定できるように、なおかつ予約が入った特定の日時が選択欄から消えてほしいです。
発生している問題・分からないこと
現在予約可能な日時を設定するところまではできたのですが、どうしても選択不可の日時が設定できません。
例えば、
開催日時が12/1~12/15(10時/13時/15時)で、12/10の10時に予約が入った場合は、12/10を選択したら13時と15時しか選べないようにしたいです。
【Advanced Custom Fieldsで設定していること】
◆◆◆イベント開催日時◆◆◆
フィールドタイプ:繰り返し(フィールド名:date_range)
サブフィールド:
①日付選択ツール『受付開始日(フィールド名:start / 表示形式:Y/m/d)』
②日付選択ツール『受付終了日(フィールド名:end / 表示形式:Y/m/d)』
③繰り返しフィールド『受付時間(フィールド名:time_tr)』
・サブフィールド『フィールド名:time_item / 表示形式:H:i』
◆◆◆受付を行わない日付と時間の設定◆◆◆
フィールドタイプ:繰り返し(フィールド名:booked)
サブフィールド:
①日付選択ツール『日付(フィールド名:date_booked / 表示形式:Y/m/d)』
②時間選択ツール『時間(フィールド名:time_booked / 表示形式:H:i)』
該当のソースコード
HTML
1<div class="form_block"> 2 <label class="form_c_label" for="datetime1"><span class="form_label_req">必須</span>希望日時</label> 3 <div class="form_c_item"> 4 <label class="select_item">[select* selDate id:selDate class:selDate placeholder "日付を選択"]</label> 5 <label class="select_item">[select* selTime id:selTime class:selTime placeholder "時間を選択"]</label> 6 </div>
JavaScript
1var result = Object.keys(date_time).map(function(key) { 2 return [key, date_time[key]]; 3}); 4 5window.addEventListener('DOMContentLoaded',function(){ 6 var _date = document.getElementById('selDate'); 7 var _time = document.getElementById('selTime'); 8 if(result.length && _date && _time) { 9 var option = ''; 10 Array.prototype.forEach.call(result,function(el,k){ 11 if(k == 0) { 12 _time.innerHTML = ''; 13 _time.innerHTML = el[1]; // 初期時間選択肢 14 } 15 option += '<option value="'+el[0]+'">'+el[0]+'</option>'; 16 }) 17 _date.innerHTML = option; 18 _date.addEventListener('change',function(){ 19 Array.prototype.forEach.call(result,function(el){ 20 if(el[0] == _date.value) { 21 _time.innerHTML = ''; 22 _time.innerHTML = el[1]; // 日付が選ばれた後、対応する時間選択肢を表示 23 } 24 }) 25 }) 26 } 27}) 28
function.php
1// ===================== 2// contactform7 日付表示 3// ===================== 4add_action( 'wp_footer', 'enqueue_script', 5 ); 5 6function enqueue_script() { 7 $home = home_url() . '/'; 8 global $post; 9 if ( is_singular( 'event' ) || in_category( 'event' ) ) { 10 wp_enqueue_script( 'detail_event', get_template_directory_uri() . '/js/tour_event.js', '1.0', 1 ); 11 $event = get_event_date_time(); 12 wp_localize_script( 'detail_event', 'date_time', $event ); 13 } 14} 15 16function get_event_date_time() { 17 global $post; 18 $return = array(); 19 // 予約済みデータの取得 20 $booked = get_field('booked', $post->ID); 21 22 if (get_field('booking') == 'Date Step') { 23 while (have_rows('date_step')): the_row(); 24 new DateTimeZone('Asia/Tokyo'); 25 $date = date_create(get_sub_field('date')); 26 $d = date_format($date, 'Y/m/d'); 27 $currDate = date("Y/m/d"); 28 29 // time_trの中から時間を取得 30 if (have_rows('time_tr')) { 31 while (have_rows('time_tr')): the_row(); 32 $time_item = get_sub_field('time_item'); 33 $time_booked = get_sub_field('time_booked'); 34 35 // 予約済み時間と照合 36 $is_booked = false; 37 if ($booked) { 38 foreach ($booked as $booking) { 39 if ($booking['date_booked'] == str_replace('/', '', $d) && $booking['time_booked'] == $time_item) { 40 $is_booked = true; // 予約済み 41 break; 42 } 43 } 44 } 45 46 // 予約済みでない場合、選択肢に追加 47 if (!$is_booked && $time_item) { 48 $options .= '<option value="' . $time_item . '">' . $time_item . '</option>'; 49 } 50 endwhile; 51 } 52 53 // 今日以降の日付のみ表示 54 if (strtotime($d) > strtotime($currDate)) { 55 if ($options) { 56 $return[$d] = $options; 57 } 58 } 59 endwhile; 60 } else { 61 while (have_rows('date_range')): the_row(); 62 new DateTimeZone('Asia/Tokyo'); 63 $start = get_sub_field('start'); 64 $end = get_sub_field('end'); 65 $currDate = date("Y/m/d"); 66 $ignore = array(); 67 while (have_rows('specials')): the_row(); 68 array_push($ignore, strtotime(get_sub_field('holiday'))); 69 endwhile; 70 71 // 日付範囲をチェックして、time_trの時間オプションを表示 72 while (strtotime($start) <= strtotime($end)) { 73 if (strtotime($start) >= strtotime($currDate) && !in_array(strtotime($start), $ignore)) { 74 $date = date_create($start); 75 $d = date_format($date, 'Y/m/d'); 76 $options = ''; 77 if (have_rows('time_tr')) { 78 while (have_rows('time_tr')): the_row(); 79 $time_item = get_sub_field('time_item'); 80 $time_booked = get_sub_field('time_booked'); 81 82 // 予約済み時間と照合 83 $is_booked = false; 84 if ($booked) { 85 foreach ($booked as $booking) { 86 if ($booking['date_booked'] == str_replace('/', '', $d) && $booking['time_booked'] == $time_item) { 87 $is_booked = true; 88 break; 89 } 90 } 91 } 92 93 // 予約済みでない場合、選択肢に追加 94 if (!$is_booked && $time_item) { 95 $options .= '<option value="' . $time_item . '">' . $time_item . '</option>'; 96 } 97 endwhile; 98 } 99 if ($options) { 100 $return[$d] = $options; 101 } 102 } 103 $start = date("Y-m-d", strtotime("+1 day", strtotime($start))); 104 } 105 endwhile; 106 } 107 return $return; 108} 109 110 111add_action( 'wpcf7_before_send_mail', 'before_send_mail' ); 112 113function before_send_mail( $wpcf7 ) { 114 global $post; 115 $contact_form = WPCF7_Submission::get_instance(); 116 $sdata = $contact_form->get_posted_data(); 117 $booked = array(); 118 $booked = get_field( 'booked', $_POST[ 'postID' ] ); 119 if ( in_category( 'event', $_POST[ 'postID' ] ) ) { 120 $selDate = $_POST[ 'selDate' ]; 121 $selTime = $_POST[ 'selTime' ]; 122 $booked = get_field( 'booked', $_POST[ 'postID' ] ); 123 $row = array( 124 'date_booked' => str_replace( '/', '', $selDate ), 125 'time_booked' => $selTime 126 ); 127 array_push( $booked, $row ); 128 update_field( 'booked', $booked, $_POST[ 'postID' ] ); 129 // add_row('booked',$row,$_POST['postID']); 130 } 131} 132//CF7エラー対策 133remove_action( 'wpcf7_swv_create_schema', 'wpcf7_swv_add_select_enum_rules', 20, 2 ); 134?>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
別件で使っていたコードを使いまわしているので無駄なコードもあるかもしれません。
どなたかご教授お願い致します。
補足
特になし
あなたの回答
tips
プレビュー