WordPress Ajax всегда возвращает ошибку 404
Я только что взял этот код из обучающего материала. Не могу заставить его работать.
HTML (home.php)
<form name="myform" id="myform" action="" method="POST">
<!-- Поле формы для имени -->
<label for="name" id="name_label">Имя</label>
<input type="text" name="name" id="name" size="30" value=""/>
<br>
<!-- Поле формы для email -->
<label for="email" id="email_label">Email</label>
<input type="text" name="email" id="email" size="30" value=""/>
<br>
<!-- Кнопка отправки -->
<input type="submit" name="submit" value="Отправить">
</form>
<!-- Здесь мы выведем результаты из process.php -->
<div id="results"><div>
PHP (function.php)
function myform(){
echo "Форма успешно отправлена: <br>Ваше имя <b>".$_POST['name']."</b> и ваш 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: "Пожалуйста, сообщите нам, кто вы.",
email: "Действительный email поможет нам связаться с вами.",
},
submitHandler: function(form) {
// выполнить другие действия для валидной формы
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
</script>

Это было очень неприятно разобраться. Я потратил часы на эту проблему и обнаружил, что ваша ошибка находится в этом поле ввода:
<input type="text" name="name" id="name" size="30" value=""/>
Попробуйте изменить имя поля ввода на любое другое, кроме "name", например:
<input type="text" name="user_name" id="name" size="30" value=""/>

Да, существует список зарезервированных имен, и если вы используете одно из них в своих формах, WordPress может выдать ошибку, обычно без внятного объяснения.

Невероятно. WordPress не принимает этот термин в качестве имени свойства тела POST и выдает 404?!?!?! Это просто глупо.

Вот они: https://codex.wordpress.org/Reserved_Terms

Если вы получаете ошибку 404 при AJAX-запросе, значит, указан неправильный путь. Вместо жесткого прописывания пути, используйте функцию admin_url
для его формирования.
jQuery.post(<?php admin_url('admin-ajax.php') ?>, // ...
Лучше передать URL админки в JavaScript-переменную через wp_localize_script
, чем выводить его напрямую в шаблоне. Например:
wp_enqueue_script('jquery');
wp_localize_script( 'jquery', 'my_ajax_vars', array(
'ajaxurl' => admin_url( 'admin-ajax.php' )
);
Как правило, лучше регистрировать и подключать скрипты, а не прописывать их напрямую в шаблонах, особенно в header.php
. В текущем виде ваш JavaScript загружается на каждой странице, а вряд ли он нужен везде.

В первую очередь, санируйте все ваши данные.
Во-вторых, я бы сделал так:
jQuery(function($){
$("#myform").validate({
debug: false,
rules: {
name: "required",
email: {
required: true,
email: true
}
},
messages: {
name: "Пожалуйста, сообщите нам, кто вы.",
email: "Действительный email поможет нам связаться с вами.",
},
submitHandler: function(form) {
// выполните другие действия для валидной формы
// если ваш скрипт не локализован и вы добавите его в header.php (не лучшая практика)
$.post(
'<?php echo admin_url('admin-ajax.php); ?>',
form.serialize(),
function(data){
// просто для проверки данных
console.log(data);
$('#results').html(data);
}
});
jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
jQuery('#results').html(data);
});
}
});
});
И в вашем php-файле (functions.php):
Не забудьте добавить die(); в конце функций.
function myform(){
echo "Форма успешно отправлена: <br>Ваше имя <b>".$_POST['name']."</b> и ваш email <b>".$_POST['email']."</b><br>";
die();
}
add_action('wp_ajax_myform', 'myform');
add_action('wp_ajax_nopriv_myform', 'myform');
