Übermittlung von WordPress- und Ajax-Formularen

Lesezeit: 6 Minuten

Benutzer-Avatar
Zametsv

Ich bin hier total verloren. Kann jemand überprüfen, was mit dem Formular, das ich hier zu erstellen versuche, schief geht? Es sollte Daten mit Ajax im benutzerdefinierten WP-Design senden, ohne etwas in der DB zu erzählen.

Die Konsole gibt mir einen Fehler, dass “firstname is not defined”, Zeile 67 von jQuery – data:{name:firstname, email:email, message:comment,action:'validate_form'} aber wirklich, ich glaube, es wird mehr als das sein.

<form class="form">
      <div class="form__item form__item_no-margin">
        <input type="text" name="firstname" placeholder="What's your name?*" class="firstname" required>
        <p class="error-message">This is field is required!</p>
      </div>
      <div class="form__item">
        <input type="text" name="email" placeholder="What's your email address?*" class="email" required>
        <p class="error-message">This is field is required!</p>
      </div>
      <div class="form__item">
        <textarea name="comment" placeholder="Please, leave a message!*" class="textarea" required></textarea>
        <p class="error-message">This is field is required!</p>
      </div>
      <div class="form__item">
        <input type="button" name="submit" value="Send" class="submit-btn">
        <p class="error-message error-message_main val-error">All the required fields have to be filled out.</p>
        <p class="success-message val-success">Thanks. I'll contact you ASAP!</p>
      </div>
    </form>

Und etwas jQuery:

 jQuery(document).ready(function(){
  jQuery(".submit-btn").click(function(e){
  e.preventDefault();
  var name = jQuery(".firstname").val();
  var email = jQuery(".email").val();
  var message = jQuery(".textarea").val();
  var ajaxUrl = "/wp-admin/admin-ajax.php";

if(name === "" || email === "" || message === "") {
  jQuery(".val-error, .error-message").show();
  jQuery("html, body").animate({
    scrollTop: jQuery(".val-error").offset().top
}, 700)
}
else {
  jQuery.ajax({
    url: ajaxUrl, 
    method:"POST",
    data:{name:firstname, email:email, message:comment,action:'validate_form'},
    success: function(data) {
      jQuery("form").trigger("reset");
      jQuery(".val-success").show(fast);
        }
      });
    }
  });
});

PHP in der Datei functions.php:

add_action('wp_ajax_myaction', 'my_action_callback');
add_action('wp_ajax_nopriv_myaction', 'my_action_callback');


function my_action_callback(){
 $name= trim($_POST["firstname"]);
 $email = trim($_POST["email"]);
 $comment = trim($_POST["comment"]);

 $page_title = "New form submission";
 $message = "Name: $name \nEmail: $email \nMessage: $comment";
 mail('[email protected]', $page_title, $message, "Content-type: text/plain; charset=\"utf-8\"\n From: [email protected]" );
wp_die();

}

AKTUALISIEREN

Beigefügt ist die frische Version in Codepen. PHP ist unten.

https://codepen.io/anon/pen/RVWaJY

add_action('wp_ajax_myaction', 'validate_form_callback');
add_action('wp_ajax_nopriv_myaction', 'validate_form_callback');


function validate_form_callback(){
$name= trim($_POST["firstname"]);
$email = trim($_POST["email"]);
$comment = trim($_POST["comment"]);

$page_title = "New form submission";
$message = "Name: $name \nEmail: $email \nMessage: $comment";
mail('[email protected]', $page_title, $message, "Content-type: 
text/plain; charset=\"utf-8\"\n From: [email protected]" );
wp_die();

}

  • Es gibt buchstäblich Tausende von Tutorials zu Ajax in WordPress. Ich habe es sogar hier gemacht: stackoverflow.com/questions/31587210/…. Erstmal nie anrufen ajaxurl dieser Weg. Lokalisieren Sie es. Zweitens, wo ist Ihre Variable firstname in dem data Objekt? Und schließlich, warum benutzt du nicht $ anstatt überall einzukleben jQuery. Fügen Sie es einfach in Ihr ` jQuery(document).ready(function($){. Is your jquery in a separate script, dependent on jQuery`?

    – dingo_d

    17. April 2017 um 6:18 Uhr

  • Hey Kumpel. Danke für deine Antwort. Die Sache ist, dass ich kein Techniker bin. Ich habe buchstäblich 3 Tage gebraucht, um den Code, den ich oben eingereicht habe, zumindest mit der Validierung zum Laufen zu bringen. Jetzt bin ich an dem Punkt, an dem ich nicht weiß, wohin ich gehen soll. Deshalb bitte ich um Hilfe. Codex-Dokumentation für WP wird mir überhaupt nicht helfen.

    – zametsv

    18. April 2017 um 1:22 Uhr

  • @zametsv – was ist jetzt das eigentliche Problem? (CodePen zeigt nur an, dass kein jQuery vorhanden ist und daher nicht funktioniert)

    – bestesProgrammderWelt

    18. April 2017 um 5:10 Uhr


  • @bestprogrammerintheworld Das Problem ist jetzt, dass, obwohl ich Daten in Formularfeldern habe, sie immer noch mit einer Fehlermeldung validiert werden, wenn nichts vorhanden ist. Und es sendet keine Daten an die angegebene E-Mail-Adresse in PHP.

    – zametsv

    19. April 2017 um 2:08 Uhr

Denke es könnte nur dieser Tippfehler sein:
var name = jQuery(".firstname").val();
Die an data übergebene Variable
name:firstname,
Lassen Sie mich wissen, ob das Ihr Problem löst. Wenn nicht, schaue ich nochmal. 🙂

Das erste Problem mit dem von Ihnen geposteten Code ist, wie Sie bereits festgestellt haben, der Fehler in der Konsole.

Sie erstellen eine Variable name (ln 4) und dann versuchen, es als zu referenzieren firstname (ln 19). Das Gleiche machen Sie im PHP-Callback. Das Objekt in der AJAX-Anforderung legt den Wert fest als name dennoch versuchen Sie, es mit abzurufen firstname.

Das gleiche Problem gilt für comment. Der beste Ansatz wäre, ein Etikett auszuwählen und es konsequent zu verwenden. Mischen comment und message wird nur zu Verwirrung führen.

Das zweite Problem betrifft die Aktion. Ihr JS-Code legt die Aktion als fest validate_form aber Ihr Rückruf wird ausgelöst myaction.

JS-Updates:

. . .

var firstname = jQuery( ".firstname" ).val();
var email = jQuery(".email").val();
var comment = jQuery(".textarea").val();

. . .

method:"POST",
data: {
    firstname: firstname, 
    email: email,
    comment: comment,
    action: 'validate_form'
},

PHP-Updates:

add_action( 'wp_ajax_validate_form', 'validate_form_callback' );
add_action( 'wp_ajax_nopriv_validate_form', 'validate_form_callback' );

function validate_form_callback() {

  • Nathan, danke. Also habe ich alle von Ihnen vorgeschlagenen Änderungen hinzugefügt, und jetzt ist dieser Fehler in der Konsole verschwunden, aber das Formular sendet die Daten sowieso nicht, und obwohl alle Felder ausgefüllt sind, wird es angezeigt, wenn ich auf die Schaltfläche „Senden“ drücke ein Validierungsfehler, wenn sie nicht ausgefüllt wurden.

    – zametsv

    17. April 2017 um 5:07 Uhr

  • @zametsv – bitte aktualisieren Sie, was Sie in Ihrer ursprünglichen Frage getan haben, damit wir Ihnen weiterhelfen können 🙂

    – bestesProgrammderWelt

    17. April 2017 um 6:48 Uhr

  • @bestprogrammerintheworld Ich habe den obigen Code aktualisiert. Schauen Sie bitte nach.

    – zametsv

    18. April 2017 um 1:23 Uhr

  • Sie haben die Validierungszeile richtig aktualisiert? if(name === "" || email === "" || message === "") { sollte sein if ( firstname ... comment ....

    – Nathan Dawson

    18. April 2017 um 1:37 Uhr

Hallo, Ihr Datenparameter muss stattdessen so sein, Sie haben die Schreibweise umgekehrt, Ihre Variable sollte auf der rechten Seite sein und der Name, den Sie verwenden werden, um sie im PHP-Code aufzurufen, sollte auf der linken Seite stehen Seite:
data:{firstname:name, email:email, comment:message, action:'validate_form'},

Denken Sie daran, dass Ihre Variable, die Sie übergeben, Folgendes ist:
var name = jQuery(".firstname").val(); var email = jQuery(".email").val(); var message = jQuery(".textarea").val();

und in deiner php rufst du so auf:

$name= trim($_POST["firstname"]); $email = trim($_POST["email"]); $comment = trim($_POST["comment"]);

1333870cookie-checkÜbermittlung von WordPress- und Ajax-Formularen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy