質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

175閲覧

Contact Form 7とAdvanced Custom Fieldsで、予約フォームの希望日時欄を作成したい

saburo__su

総合スコア1

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/12/13 11:12

実現したいこと

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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

別件で使っていたコードを使いまわしているので無駄なコードもあるかもしれません。
どなたかご教授お願い致します。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問