##やりたい事
コンタクトフォーム7で
[list_date not_week=0,2 start_day=2 end_day=60]
上記のようなショートコードを作成して日付のリストボックスを作成したい
##作成途中のコード
php
1// 日付をセレクトボックスに変換してショートコード化 2 3wpcf7_add_form_tag( 'list_date', 'list_date' ,true ); 4wpcf7_add_form_tag( 'list_date*', 'list_date' ,true ); 5function list_date($tag){ 6 //オプション項目読み込み 7 $t = new WPCF7_Shortcode( $tag ); 8 $start_day = $t->get_option('start_day', 'int', true ); 9 $end_day = $t->get_option( 'end_day', 'int', true ); 10 $not_week = explode(",", $t->get_option( ', 'string', true )); 11 //$not_week = $t->get_option( 'not_week', 'string', true ); 12 13 //デフォルト値判定 14 if($start_day===false)$start_day=5; 15 if($end_day===false)$end_day=30; 16 if($not_week===false)$not_week=array(0,); 17 18//曜日を日本語にする準備変数 19 $week = [ 20 '日', //0 21 '月', //1 22 '火', //2 23 '水', //3 24 '木', //4 25 '金', //5 26 '土', //6 27 ]; 28//日付設定 29 date_default_timezone_set('Asia/Tokyo'); 30 $year = date('Y'); 31 $month = date('n'); 32 $day = date('j'); 33//日付ループ 34 for ($i=$start_day; $i<$end_day; $i++){ 35 #曜日抽出 36 $date = date('w', mktime(0, 0, 0, $month, $day + $i, $year)); 37 if(in_array($date, $not_week)) { 38 //何もしない 39 } 40 else{ 41 $tags2[]=date("Y年 m月 d日"."(".$week[$date].")", mktime(0, 0, 0, $month, $day + $i, $year)); 42 } 43 } 44 $html = '<style>select option[value*="土"] {background: aqua;}</style>'; 45 $html .='<span class="wpcf7-form-control-wrap '.esc_attr($tag['name']).'">'; 46 $html .= '<select class="list_date" name="list_date"><option value="">ご予約希望日を選択</option>'; 47 foreach( $tags2 as $tag2 ) { 48 $html .= '<option value="'.$tag2.'">'.$tag2.'</option>'; 49 } 50 $html .= '</select></span>'; 51 return $html; 52 } 53 // バリデート 54add_filter( 'list_date*', 'list_date_validation', 10, 2 ); 55function list_date_validation( $result, $tag ) { 56 $type = $tag['type']; 57 $name = $tag['name']; 58 if($type=='from_birth_year' || $type=='from_birth_year*'){ 59 $year =isset($_POST[$name])?trim($_POST[$name]):''; 60 if (!$year) { 61 if (method_exists($result, 'invalidate')) { 62 $result->invalidate($tag,'入力必須の項目が入力されていません。');//エラーメッセージ 63 }else{ 64 $result['valid'] = false; 65 $result['reason'] = array($name=>'入力必須の項目が入力されていません。');//エラーメッセージ 66 } 67 } 68 } 69 return $result; 70}
##知りたい事
参考サイト
上記参考サイトを参考に試行錯誤してここまで作成したがどうしても解らないので質問させて頂きました。
<問題点>
1.オプションの値を読み込ませたいが読み込まない
2.バリデーションチェック機能も入れたが動作せず、エラーが出ずそのまま進んでしまう
##進捗状況
[list_date not_week=0,2 start_day=2 end_day=60]
から
[list_date list_date start_day:2 end_day:60]
に変更して、start_dayとend_dayの値は読み込めたが
下記にすると
[list_date not_week:0,2 start_day:2 end_day:60]
start_dayとend_dayが読み込まなくなる
not_weekの入れるの指定の仕方にもんだいがあるのかも?
>>12/3日追記
文字列から配列で受け取るというアドバイスを頂いたので
検索してexplode関数を見つけたので
$not_week = explode(",", $t->get_option( ', 'string', true ));
としてみたが、動作せずでした
##完全に行き詰ったので、有料での回答をお待ちしております。
https://www.lancers.jp/work/detail/3868797
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/03 07:56