AJAX запрос возвращает 0: решение проблемы
Несмотря на множество похожих вопросов, предложенные решения не сработали в моем случае.
У меня есть следующий скрипт:
jQuery('#term').keyup(ajaxChange);
function ajaxChange(){
var newFormChange = jQuery("#term").val();
alert (newFormChange);
jQuery.ajax({
type:"POST",
action: "my_test_action",
url: "/wp-admin/admin-ajax.php",
data: newFormChange,
success:function(data){
console.log(data);
}
});
return false;
}
И PHP-код выглядит так:
function my_test_action() {
$var = "this is a test";
wp_send_json($var);
die();
}
add_action( 'wp_ajax_my_test_action', 'my_test_action' );
add_action( 'wp_ajax_nopriv_my_test_action', 'my_test_action' );
Я также пробовал: echo json_encode($var)
или echo $var
вместо wp_send_json()
, но функция всегда возвращает 0 в консоли браузера!
Другие мои AJAX-запросы работают, например, есть другой запрос, который вызывает PHP-скрипт с WP Query для вывода постов - он работает нормально.
ОБНОВЛЕНИЕ: Вот как подключен мой скрипт:
function add_js() {
if (is_page_template()) {
wp_enqueue_script( 'mycustomscript', get_stylesheet_directory_uri().'/js/mycustomscript.js', array('jquery'), '1.0', true );
wp_localize_script('mycustomscript', 'ajaxurl', admin_url( 'admin-ajax.php' ) );
}
}
add_action('wp_enqueue_scripts', 'add_js');
Я думаю, проблема в переменной newFormChange
, потому что jQuery(this).serialize();
изначально не работал, так как форма не отправляется, а меняется только одно её поле. Я заменил его на var newFormChange = jQuery("#term").val();
, но возможно есть проблема с url: "/wp-admin/admin-ajax.php"
Где я ошибся? Спасибо.
Обратите внимание, что action
должен находиться внутри ключа data
. В вашем POST-запросе отсутствует ключ с именем action
, поэтому функция обратного вызова никогда не вызывается.
Рассмотрим следующий пример:
jQuery.ajax({
type:"POST",
url: "/wp-admin/admin-ajax.php",
data: {
action: "my_test_action",
form_data : newFormChange
},
success: function (data) {
console.log(data);
}
});
Также обратите внимание: Никогда не используйте относительный URL для Ajax, такой как /wp-admin/admin-ajax.php
. Вместо этого можно использовать wp_localize_script()
. Смотрите примеры.

отлично, это работает! но странно, у меня есть другой скрипт, где action находится снаружи, и он тоже работает!

Пожалуйста :) Нет, вам нужно перепроверить. action
- это особенность WordPress, а остальные параметры принадлежат jQuery. Вы можете увидеть здесь jQuery Ajax
, что action
не является допустимым ключом.

если я напишу alert(newFormChange), я увижу что-то вроде "term=anything&action=my_test_action". Значит, "особенность WP" action передается как еще одна POST переменная? У меня есть еще один дополнительный вопрос: если я использую $_POST['term'] в my_test_action(), он не распознается. Хотя это правильный способ получения POST переменных с этим методом. Где я ошибаюсь?

Я не уверен, где именно вы разместили alert!, но если вы видите term=anything&action=my_test_action
в alert, значит это GET запрос. Поэтому вы сможете получить доступ к переменной через $_GET
вместо $_POST
, но мне действительно интересно, почему вы видите строку запроса вместо js объекта.

Я вызвал метод serialize() на newFormChange, затем разместил alert сразу после этого. Забавно, что он отображает то, что я написал выше, даже если action определен внутри данных. Я применил ваши рекомендации в других своих скриптах и теперь не могу получить данные через $_POST[]. Странно!

Понял, это было скрытое паразитное поле. Мне очень жаль, это моя ошибка. Тем не менее, я больше не могу получить доступ к своим данным $_POST[]. Когда данные были только "newFormChange", я мог обращаться к ним "нормально". Теперь единственная переменная, к которой я могу получить доступ, это $_POST['newFormChange']. Нужно ли мне парсить ее, чтобы получить отдельные поля?

Именно так! Вам нужно его распарсить. Чтобы увидеть структуру получаемых данных, просто выведите их. Например, print_r($_POST);
, и вы увидите, как можно получить к ним доступ. Если это строка запроса, используйте parse_str(). Надеюсь, это поможет :)

Это работает, еще раз спасибо! Я спрашивал о помощи в другом месте на SE по этой конкретной теме, и мне посоветовали использовать serializeArray(), чтобы правильно получить параметры $_POST[]. Однако у меня все равно не получается. Есть ли у вас какие-то советы по этому поводу? Большое спасибо! http://wordpress.stackexchange.com/questions/225111/retrieve-post-data-from-ajax-call

Похоже, есть проблема с url: "/wp-admin/admin-ajax.php"
, вместо этого попробуйте указать полный путь:
function addajaxurl() {
wp_localize_script( 'frontend-ajax', 'frontendajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
}
add_action( 'wp_enqueue_scripts', 'addajaxurl' );
и используйте переменную в вашей ajax-функции:
jQuery.ajax({
type:"POST",
url: ajaxurl,
data: newFormChange,
success:function(data){
console.log(data);
}
});

спасибо, я протестирую это! но другие мои AJAX-запросы работают, это странно...! смотрите мое редактирование выше, у меня почти то же самое, что и у вас. Кроме того, если URL .php не был найден, в консоли должна была вернуться ошибка, не так ли?

Проблема в параметре action. В вашей JavaScript-функции попробуйте:
var newFormChange = jQuery("#term").val();
jQuery.ajax({
type: "POST",
url: "/wp-admin/admin-ajax.php",
data: {
action: "my_test_action", // Обратите внимание на правильное название экшена
newFormChange: newFormChange
},
success: function(data) {
console.log(data);
alert(data);
}
});
Также вам следует убрать die();
из вашей PHP-функции. Он уже содержится в wp_send_json
.
