hook();} return self::$instance; } public function hook() { add_action('init',array($this,'maybe_process'),20); } public function maybe_process() { if(empty($_POST['wmf_action'])||$_POST['wmf_action']!=='submit') return; if(empty($_POST['wmf_form_id'])) return; if(!session_id()) session_start(); $form_id=intval($_POST['wmf_form_id']); if(!wp_verify_nonce($_POST['wmf_nonce']??'','wmf_submit_'.$form_id)) { $this->fail($form_id,'Sicherheitsüberprüfung fehlgeschlagen.'); return; } $form=get_post($form_id); if(!$form||$form->post_type!=='wmf-form') return; $meta = wmf_get_form_meta($form_id); $fields = $meta['fields']??array(); // Honeypot prüfen if(!empty($meta['honeypot_enabled'])&&$meta['honeypot_enabled']==='1') { if(!empty($_POST['wmf_hp_'.md5($form_id)])) { $this->ok($form_id,$meta); return; } // stille Ablehnung } // Werte sammeln + validieren $values=array(); $errors=array(); foreach($fields as $field) { $type=$field['type']??''; $obj=wmf_get_field($type); if(!$obj) continue; if(in_array($type,array('html','divider'))) continue; $raw=$_POST['wmf_fields'][$field['id']]??''; $val=$obj->sanitize($raw,$field); $valid=$obj->validate($val,$field); $values[$field['id']]=$val; if($valid!==true) $errors[$field['id']]=$valid; } // Datei-Uploads $file_values=array(); if(!empty($_FILES['wmf_files'])) { foreach($fields as $field) { if(($field['type']??'')!=='file') continue; $uploaded=WMF_Field_File::handle_upload($field,$form_id); if(!empty($uploaded)) $file_values[$field['id']]=$uploaded; // Validierung nochmal mit Upload-Ergebnis $valid=wmf_get_field('file')->validate('',$field); if($valid!==true&&!isset($errors[$field['id']])) $errors[$field['id']]=$valid; } } if(!empty($errors)) { $_SESSION['wmf_values_'.$form_id]=$values; $_SESSION['wmf_errors_'.$form_id]=$errors; wp_redirect($this->current_url()); exit; } // Datei-URLs in Werte mergen foreach($file_values as $fid=>$uploads) { $urls=array_map(fn($u)=>$u['url'],$uploads); $values[$fid]=implode(', ',$urls); } // Speichern $submission_id=null; if(!empty($meta['save_submissions'])&&$meta['save_submissions']==='1') { $submission_id=WMF_Submission::save($form_id,$values); } // E-Mails if(!empty($meta['notify_admin'])&&$meta['notify_admin']==='1') { WMF_Mailer::notify_admin($form_id,$meta,$fields,$values,$file_values); } if(!empty($meta['notify_sender'])&&$meta['notify_sender']==='1') { WMF_Mailer::notify_sender($form_id,$meta,$fields,$values); } do_action('wmf_form_submitted',$form_id,$meta,$fields,$values,$submission_id); $this->ok($form_id,$meta); } private function ok($form_id,$meta) { if(!empty($meta['redirect_url'])) { wp_redirect(esc_url_raw($meta['redirect_url'])); exit; } if(!session_id()) session_start(); $_SESSION['wmf_success_'.$form_id]=true; wp_redirect($this->current_url()); exit; } private function fail($form_id,$msg) { if(!session_id()) session_start(); $_SESSION['wmf_errors_'.$form_id]=array('_global'=>$msg); wp_redirect($this->current_url()); exit; } private function current_url() { return (is_ssl()?'https':'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; } }