WordPress Ajax restituisce sempre un errore 404
Ho appena preso questo codice da un tutorial. Non riesco a farlo funzionare.
HTML (home.php)
<form name="myform" id="myform" action="" method="POST">
<!-- Campo del modulo Nome -->
<label for="name" id="name_label">Nome</label>
<input type="text" name="name" id="name" size="30" value=""/>
<br>
<!-- Campo del modulo Email -->
<label for="email" id="email_label">Email</label>
<input type="text" name="email" id="email" size="30" value=""/>
<br>
<!-- Pulsante Invia -->
<input type="submit" name="submit" value="Invia">
</form>
<!-- Qui mostreremo i risultati da process.php -->
<div id="results"><div>
PHP (functions.php)
function myform(){
echo "Modulo inviato con successo: <br>Il tuo nome è <b>".$_POST['name']."</b> e la tua email è <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: "Per favore, facci sapere chi sei.",
email: "Un'email valida ci aiuterà a metterci in contatto con te.",
},
submitHandler: function(form) {
// esegue altre operazioni per un modulo valido
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
</script>

È stato molto frustrante capirlo. Ho passato ore su questo problema e ho scoperto che il tuo problema è in questo input:
<input type="text" name="name" id="name" size="30" value=""/>
Prova a cambiare il nome del campo di input con qualsiasi cosa tranne "name", ad esempio:
<input type="text" name="user_name" id="name" size="30" value=""/>

Sì, esiste una lista di nomi riservati, e se ne usi uno nei tuoi form, WP si bloccherà, solitamente senza un buon messaggio di errore.

Incredibile. WP non accetta il termine usato come nome per una proprietà nel body della POST e restituisce un 404?!?!?! Così stupido.

Eccoli qui: https://codex.wordpress.org/Reserved_Terms

Se stai ricevendo un errore 404 sulla richiesta AJAX, allora il tuo percorso è sbagliato. Utilizza admin_url
per costruire il percorso invece di inserirlo manualmente.
jQuery.post(<?php admin_url('admin-ajax.php') ?>, // ...
Probabilmente è meglio stampare l'URL di amministrazione in una variabile Javascript tramite wp_localize_script
piuttosto che stamparlo direttamente nel template. Ad esempio:
wp_enqueue_script('jquery');
wp_localize_script( 'jquery', 'my_ajax_vars', array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
);
Di solito è preferibile registrare e accodare gli script invece di scriverli direttamente nei template, specialmente in header.php
. Così com'è, il tuo javascript viene caricato in ogni pagina e dubito che sia necessario su tutte le pagine.

Prima di tutto, sanifica tutti i tuoi dati.
In secondo luogo, preferirei fare così:
jQuery(function($){
$("#myform").validate({
debug: false,
rules: {
name: "required",
email: {
required: true,
email: true
}
},
messages: {
name: "Per favore facci sapere chi sei.",
email: "Un'email valida ci aiuterà a metterci in contatto con te.",
},
submitHandler: function(form) {
// fai altre operazioni per un form valido
// se non hai localizzato il tuo script e lo aggiungerai in header.php (non una buona pratica)
$.post(
'<?php echo admin_url('admin-ajax.php); ?>',
form.serialize(),
function(data){
// solo per controllare i dati
console.log(data);
$('#results').html(data);
}
});
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
E nel tuo file php (functions.php):
Assicurati di aggiungere die(); alla fine delle funzioni.
function myform(){
echo "Form inviato con successo: <br>Il tuo nome è <b>".$_POST['name']."</b> e la tua email è <b>".$_POST['email']."</b><br>";
die();
}
add_action('wp_ajax_myform', 'myform');
add_action('wp_ajax_nopriv_myform', 'myform');
