WordPress Ajax returnează întotdeauna o eroare 404
Am preluat acest cod dintr-un tutorial. Nu reușesc să îl fac să funcționeze.
HTML (home.php)
<form name="myform" id="myform" action="" method="POST">
<!-- Câmpul pentru Nume -->
<label for="name" id="name_label">Nume</label>
<input type="text" name="name" id="name" size="30" value=""/>
<br>
<!-- Câmpul pentru Email -->
<label for="email" id="email_label">Email</label>
<input type="text" name="email" id="email" size="30" value=""/>
<br>
<!-- Butonul de Trimitere -->
<input type="submit" name="submit" value="Trimite">
</form>
<!-- Aici vom afișa rezultatele din process.php -->
<div id="results"><div>
PHP (functions.php)
function myform(){
echo "Formular trimis cu succes: <br>Numele tău este <b>".$_POST['name']."</b> și emailul tău este <b>".$_POST['email']."</b><br>";
}
add_action('wp_ajax_myform', 'myform');
add_action('wp_ajax_nopriv_myform', 'myform');
Javascript (header.php)
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery("#myform").validate({
debug: false,
rules: {
name: "required",
email: {
required: true,
email: true
}
},
messages: {
name: "Te rugăm să ne spui cine ești.",
email: "Un email valid ne va ajuta să luăm legătura cu tine.",
},
submitHandler: function(form) {
// executăm alte acțiuni pentru un formular valid
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
</script>

A fost foarte frustrant să descoper acest lucru. Am petrecut ore întregi pe această problemă și am descoperit că problema ta este în acest câmp de introducere:
<input type="text" name="name" id="name" size="30" value=""/>
Încearcă să schimbi numele câmpului în orice altceva decât "name", de exemplu:
<input type="text" name="user_name" id="name" size="30" value=""/>

Da, există o listă de numere rezervate, iar dacă folosești unul în formularele tale, WordPress va da eroare, de obicei fără un mesaj util.

De necrezut. WordPress nu acceptă termenul folosit ca nume pentru o proprietate din corpul POST, așa că aruncă o eroare 404?!?!?! Atât de stupid.

Iată-le: https://codex.wordpress.org/Reserved_Terms

Dacă primiți o eroare 404 la cererea AJAX, atunci calea este greșită. Folosiți admin_url
pentru a construi calea în loc să o hard-code-uiți.
jQuery.post(<?php admin_url('admin-ajax.php') ?>, // ...
Este mai bine să afișați adresa URL a administrației într-o variabilă Javascript prin intermediul wp_localize_script
decât să o tipăriți direct în șablon. De exemplu:
wp_enqueue_script('jquery');
wp_localize_script( 'jquery', 'my_ajax_vars', array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
);
De obicei, este mai bine să înregistrați și să încărcați scripturile decât să le scrieți direct în șabloane, mai ales în header.php
. Așa cum este scris acum, scriptul dvs. Javascript se încarcă pe fiecare pagină și este puțin probabil să fie necesar pe toate paginile.

În primul rând, asigură-te că toate datele sunt sanitizate.
În al doilea rând, aș face mai degrabă astfel:
jQuery(function($){
$("#myform").validate({
debug: false,
rules: {
name: "required",
email: {
required: true,
email: true
}
},
messages: {
name: "Te rugăm să ne spui cine ești.",
email: "O adresă de email validă ne va ajuta să luăm legătura cu tine.",
},
submitHandler: function(form) {
// alte acțiuni pentru un formular valid
// dacă nu ai scriptul localizat și îl vei adăuga în header.php (nu e o practică bună)
$.post(
'<?php echo admin_url('admin-ajax.php'); ?>',
form.serialize(),
function(data){
// doar pentru a verifica datele
console.log(data);
$('#results').html(data);
}
});
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
Și în fișierul tău php (functions.php):
Asigură-te că adaugi die(); la sfârșitul funcțiilor.
function myform(){
echo "Formular trimis cu succes: <br>Numele tău este <b>".$_POST['name']."</b> iar adresa ta de email este <b>".$_POST['email']."</b><br>";
die();
}
add_action('wp_ajax_myform', 'myform');
add_action('wp_ajax_nopriv_myform', 'myform');
