Einfaches Kontaktformular mit Feldvalidierung

Ich suche einen sehr einfachen Kontakt, den ich mit einem Shortcode ausgeben kann. Ich habe den folgenden Code, aber er scheint nicht korrekt zu validieren und lässt Sie sogar das Formular senden, ohne irgendwelche Details einzugeben. Jede Chance, dass jemand erklären könnte, wie man das Formular bestätigt. Ich würde auch gerne eine Honigtopf Falle hinzufügen, da diese besser sind als Captures imo, aber ich bin ziemlich neu in PHP. Jede Hilfe wäre großartig, danke.

function html_form_code() { echo '
'; echo '

'; echo 'Your Name (required)
'; echo ''; echo '

'; echo '

'; echo 'Your Email (required)
'; echo ''; echo '

'; echo '

'; echo 'Your Message (required)
'; echo ''; echo '

'; echo ''; echo '

'; echo '
'; } function deliver_mail() { $errors = new WP_Error(); if ( isset( $_POST[ 'content' ] ) && $_POST[ 'content' ] !== '' ) { $errors->add( 'cheater', 'Sorry, this field should not be filled. Are you trying to cheat?' ); } if ( isset( $_POST[ 'cf-name' ] ) && $_POST[ 'cf-name' ] == '' ) { $errors->add('error', 'Please fill in a valid name.' ); } if ( isset( $_POST[ 'cf-email' ] ) && $_POST[ 'cf-email' ] == '' ) { $errors->add('error', 'Please fill in a valid email.' ); } if ( isset( $_POST[ 'cf-message' ] ) && $_POST[ 'cf-message' ] == '' ) { $errors->add('error', 'Please fill in a valid message.' ); } if ( empty( $errors->errors ) ){ deliver_mail(); } else { echo 'Please fill the required fields'; } // if the submit button is clicked, send the email if ( isset( $_POST['cf-submitted'] ) ) { // sanitize form values $name = sanitize_text_field( $_POST["cf-name"] ); $email = sanitize_email( $_POST["cf-email"] ); $message = esc_textarea( $_POST["cf-message"] ); // get the administrator's email address $to = get_option( 'admin_email' ); $headers = "From: $name " . "\r\n"; // If email has been process for sending, display a success message if ( wp_mail( $to, $message, $headers ) ) { echo '
'; echo '

Thank you for contacting us '. $name .', a member of our team will be in touch with you shortly.

'; echo '
'; } else { echo '
'; echo '

An unexpected error occurred

'; echo '
'; } } } function cf_contact_form() { ob_start(); deliver_mail(); html_form_code(); return ob_get_clean(); } add_shortcode( 'contact_form', 'cf_contact_form' );

Also wäre es wie oben? Vielen Dank

Ich erhalte diesen Fehler auch, wenn ich versuche, die Feldprüfungen auszuführen.

 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes) in /Applications/MAMP/htdocs/centenary-framework/wp-content/themes/cent_framework/assets/inc/core/contact-form.php on line 147 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes) in /Applications/MAMP/htdocs/centenary-framework/wp-includes/load.php on line 671 

Ich bin mir nicht sicher, was das bedeutet. = (

BEARBEITEN

Diese Probleme wurden behoben. Ich gebe den Arbeitscode unten in der Hoffnung ein, dass es jemandem in der Zukunft helfen wird. Vielen Dank an alle, die geholfen haben !!

 // Form markup function html_form_code() { ?> <form action="" method="post"> 

Your Name (required)
<input type="text" name="cf-name" pattern="[a-zA-Z0-9 ]+" value="" size="40" />

Your Email (required)
<input type="email" name="cf-email" value="" size="40" />

Your Message (required)

add('cheater', 'Sorry, this field should not be filled. Are you trying to cheat?'); } if (isset($_POST[ 'cf-name' ]) && $_POST[ 'cf-name' ] == '') { $errors->add('name_error', 'Please fill in a valid name.'); } if (isset($_POST[ 'cf-email' ]) && $_POST[ 'cf-email' ] == '') { $errors->add('email_error', 'Please fill in a valid email.'); } if (isset($_POST[ 'cf-message' ]) && $_POST[ 'cf-message' ] == '') { $errors->add('message_error', 'Please fill in a valid message.'); } return $errors; } // Form delivery function deliver_mail($args = array()) { // This $default array is a way to initialize some default values that will be overwritten by our $args array. // We could add more keys as we see fit and it's a nice way to see what parameter we are using in our function. // It will only be overwritten with the values of our $args array if the keys are present in $args. // This uses WP wp_parse_args() function. $defaults = array( 'name' => '', 'email' => '', 'message' => '', 'to' => get_option('admin_email'), // get the administrator's email address ); $args = wp_parse_args($args, $defaults); $headers = "From: {$args['name']} "."\r\n"; // Send email returns true on success, false otherwise if (wp_mail($args['to'], $args['message'], $headers)) { return; } else { return false; } } // Form sanitize function my_sanitize_field($input) { return trim(stripslashes(sanitize_text_field($input))); } // Form succsess message function my_form_message() { global $errors; if (is_wp_error($errors) && empty($errors->errors)) { echo '
'; echo '

Thank you for contacting us '.$_POST['cf-name'].', a member of our team will be in touch with you shortly.

'; echo '
'; //Empty $_POST because we already sent email $_POST = ''; } else { if (is_wp_error($errors) && !empty($errors->errors)) { $error_messages = $errors->get_error_messages(); foreach ($error_messages as $k => $message) { echo '
'; echo '

'.$message.'

'; echo '
'; } } } } // Form shortcode add_shortcode('contact_form', 'cf_contact_form'); function cf_contact_form() { ob_start(); my_form_message(); html_form_code(); return ob_get_clean(); } // Error validation add_action('init', 'my_cf_form'); function my_cf_form() { if (isset($_POST['cf-submitted'])) { global $errors; $errors = my_validate_form(); if (empty($errors->errors)) { $args = array( 'name' => my_sanitize_field($_POST['cf-name']), 'email' => my_sanitize_field($_POST['cf-email']), 'message' => my_sanitize_field($_POST['cf-message']), ); deliver_mail($args); } else { return $errors; } } }

Solutions Collecting From Web of "Einfaches Kontaktformular mit Feldvalidierung"

Sie haben keinen validationsmechanismus.

Deine Logik sollte in etwa so sein

  • Formular abschicken
  • Überprüfen Sie die übermittelten Felder ($ _POST) mit den erwarteten Werten
  • Wenn alles gut aussieht, sende
  • Wenn etwas nicht wie erwartet ist, protokollieren Sie den Fehler (Sie können WP_Error () verwenden) und erstellen Sie das Formular neu, das eine Fehlermeldung anzeigt (und möglicherweise Felder mit vorherigen “guten” Werten neu auffüllt).

Alles, was ich hier sehe, ist, dass Sie die Eingaben bereinigen, aber Sie validieren nicht, ob Ihre Eingaben die erwarteten Werte haben (dh gültige E-Mail, Telefonnummer, Länge des Namens usw.).

Sie senden Ihre E-Mail, unabhängig davon, ob Ihre Felder die erwarteten Werte aufweisen. Ihr anderer wp_mail() NUR einen Fehler aus, wenn wp_mail() fehlschlägt, nicht wenn Ihre tatsächlichen Felder Werte validiert haben oder nicht.

Um einen Honigtopf hinzuzufügen, müssen Sie einfach ein verstecktes Feld in Ihrem Formular hinzufügen, von dem Sie erwarten, dass es leer ist.

Zum Beispiel in Ihrem HTML

  

Wenn Sie dann Ihre Formulareingabe validieren, erwarten Sie, dass dieses Feld leer ist.

Mithilfe der WP_Error class können Sie dem Objekt Fehler hinzufügen, um sie später zu verwenden, um den Benutzer oder den Benutzer darüber zu informieren.

 $errors = new WP_Error(); if ( isset( $_POST[ 'content' ] ) && $_POST[ 'content' ] !== '' ) { $errors->add( 'cheater', 'Sorry, this field should not be filled. Are you trying to cheat?' ); } 

Die oben beschriebene PHP-Prüfung ist eine Möglichkeit, mit der Sie Ihr Formular validieren können. Sie fügen einfach einige if statementen mit erwarteten Werten Ihres Formulars hinzu (dies kann natürlich erweitert werden, um die Eingabe zu validieren). Wenn Sie dann die WP_Error-class verwenden, indem Sie zum Objekt hinzufügen, wenn Fehler gefunden werden, müssen Sie vor dem Senden nur eine letzte Überprüfung durchführen.

 if ( empty( $errors->errors ) ){ deliver_mail(); } else { // Here you can use your $_POST variable to repopulate the form with accepted // form value (you would have to update your html_form_code() to accept an argument) // or just reload the contact page displaying an error message. } 

BEARBEITEN

Ok, hier ist ein vollständigeres Beispiel

CSS

Fügen Sie dies Ihrem CSS hinzu, damit das Feld im Browser nicht angezeigt wird

 .hpot { display: none; } 

PHP

Hier ist eine andere Möglichkeit, Ihre HTML-function zu schreiben, es ist einfacher zu lesen

 function html_form_code() { ?> 

Your Name (required)
" size="40" />

Your Email (required)
" size="40" />

Your Message (required)

< ?php }

Ihre function deliver_mail sollte nicht auf $_POST und nicht bereinigen. Nebenbei bemerkt, könnte die Verwendung der E-Mail-Adresse des Formulars als Kopfzeile einige Probleme mit einem ISP verursachen, da die E-Mail von Ihrer Domain gesendet wird und jetzt eine E-Mail von Ihrer Domain gesendet wird, aber mit nicht übereinstimmender Domain in der Absenderadresse als Spam angesehen werden). Verwenden Sie hier eine Adresse aus Ihrer Domain (wie z. B. no-reply@example.com) und legen Sie die E-Mail-Adresse des Benutzers im Text der E-Mail (in der Nachricht) fest. Sie können es auch als reply-to für die Benutzerfreundlichkeit festlegen.

 function deliver_mail( $args = array() ) { // This $default array is a way to initialize some default values that will be overwritten by our $args array. // We could add more keys as we see fit and it's a nice way to see what parameter we are using in our function. // It will only be overwritten with the values of our $args array if the keys are present in $args. // This uses WP wp_parse_args() function. $defaults = array( 'name' => '', 'email' => '', 'message' => '', 'to' => get_option( 'admin_email' ), // get the administrator's email address ); $args = wp_parse_args( $args, $defaults ); $headers = "From: {$args['name']} < {$args['email']}>" . "\r\n"; // Send email returns true on success, false otherwise if( wp_mail( $args['to'], $args['message'], $headers ) ) { return; } else { return false; } } 

Ihre validationsfunktion

 function my_validate_form() { $errors = new WP_Error(); if ( isset( $_POST[ 'content' ] ) && $_POST[ 'content' ] !== '' ) { $errors->add( 'cheater', 'Sorry, this field should not be filled. Are you trying to cheat?' ); } if ( isset( $_POST[ 'cf-name' ] ) && $_POST[ 'cf-name' ] == '' ) { $errors->add('name_error', 'Please fill in a valid name.' ); } if ( isset( $_POST[ 'cf-email' ] ) && $_POST[ 'cf-email' ] == '' ) { $errors->add('email_error', 'Please fill in a valid email.' ); } if ( isset( $_POST[ 'cf-message' ] ) && $_POST[ 'cf-message' ] == '' ) { $errors->add('message_error', 'Please fill in a valid message.' ); } return $errors; } 

Ihre Desinfektionsfunktion. Hier ist eine allgemeine Bereinigungsfunktion, die weiße Leerzeichen trimmt und HTML entkommt, aber dies könnte komplexer sein, abhängig von den Eingabefeldern, die Sie haben. Aber ich denke für deinen Zweck ist es genug

 function my_sanitize_field( $input ){ return trim( stripslashes( sanitize_text_field ( $input ) ) ); } 

Wenn Sie Ihre Erfolgs- / Fehlermeldung anzeigen, können Sie damit das WP_Error-Objekt abrufen

 function my_form_message(){ global $errors; if( is_wp_errors( $errors ) && empty( $errors->errors ) ){ echo '
'; echo '

Thank you for contacting us '. $_POST['cf-name'] .', a member of our team will be in touch with you shortly.

'; echo '
'; //Empty $_POST because we already sent email $_POST = ''; } else { if( is_wp_errors( $errors ) && ! empty( $errors->errors ) ){ $error_messages = $errors->get_error_messages(); foreach( $error_messages as $k => $message ){ echo '
'; echo '

' . $message . '

'; echo '
'; } } }

Endlich deine Shortcode-function

 add_shortcode( 'contact_form', 'cf_contact_form' ); function cf_contact_form() { ob_start(); my_form_message(); html_form_code(); return ob_get_clean(); } 

Und hooking zu init , um nach $_POST zu lauschen, bevor wir unser Formular rendern und die $_POST ausgeben $errors wenn wir etwas finden oder senden, wenn alles in Ordnung ist.

 add_action( 'init', 'my_cf_form'); function my_cf_form(){ if( isset( $_POST['cf-submitted'] ) ) { global $errors; $errors = my_validate_form(); if( empty( $errors->errors ) ){ $args = array( 'name' => my_sanitize_field( $_POST['cf-name'] ), 'email' => my_sanitize_field( $_POST['cf-email'] ), 'message' => my_sanitize_field( $_POST['cf-message'] ), ); deliver_mail( $args ); } else { return $errors; } } } 

Denken Sie daran, Ihre functionen immer mit Präfixen zu versehen, damit Sie nicht mit anderen Plugins-functionsnamen in Konflikt geraten.

Da Sie etwas neu in PHP sind, ist hier ein schönes Beispiel für einen einfachen Server Side Honeypot .

Was Sie tun werden, ist ein verstecktes Textfeld in Ihrem Formular einzurichten und zu überprüfen, ob es nicht leer ist, um den Spam zu fangen.

Form HTML

   

CSS

 .bot { display:none } 

PHP (vereinfacht)

  if ( $_POST() ) { $name = strip_tags(urldecode(trim($_POST['name']))); // OR $name = test_input($_POST['name']; $honeypot = $_POST('honeypot'); // Only checks IF something is in it. if ($honeypot){ $msg = "You are a bot"; } else { $msg = "Success"; // Additional processing if ($name){ mail(...) } } echo $msg; } 

Nach einer kurzen Suche habe ich auch diese function gefunden, die Sie verwenden könnten.

 function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; }