Intereting Posts
Отключить боковую панель на странице продукта в разделе «Вид магазина» Выделить сообщение в боковой панели на одной странице Шаблон пользовательской страницы и скрипт в качестве плагина автоматически создавать записи в блоге в зависимости от списка установить термины в категорию и подкатегорию Переписать правила для короткого URL-адреса Создайте тему, объединив родительскую и дочернюю тему Стратегия конфигурации для большого количества одновременных редакторов Он не работает с конкатенацией в function.php Определите параметры по умолчанию на вкладке «Варианты» Авто галерея из содержимого папки Предварительно заполненные гравитационные формы выпадают из столбцов по значению посылки Неустранимая ошибка: Непринятая ошибка: вызов неопределенной функции get_option () Форма заказа клиента Woocommerce Отсутствует ссылка на ссылку 3.02 / 3.03 на панели инструментов

Admin Ajax и HTML5 Formdata

При использовании FormData с помощью WordPress Admin Ajax я возвращаю ответ «0». Обычно это происходит потому, что нет никаких действий, однако я включаю действие и все еще имею проблему. Я видел подобные вопросы здесь, но все они предполагают использование jQuery, и в моем случае это не так.

Javascript:

if ($this.valid()) { var form_data = new FormData(form); form_data.append('security', WP.nonce); form_data.append('action', form.action); console.log(form.action); // console shows http://test.dev/newsletter_signup u.jax.post(WP.ajax, form_data, onSent); function onSent(result) { if (result.success) { $this.html('<p class="form-sent">' + $this.data('success') + '</p>'); } else { $this.html('<p class="form-sent">' + result.data + '</p>'); } } } 

PHP:

 add_action('wp_ajax_newsletter_signup', 'newsletter_signup'); add_action('wp_ajax_nopriv_newsletter_signup', 'newsletter_signup'); 

HTML:

 <form action="newsletter_signup" class="newsletter-signup js-process-form" autocomplete="off"> <div class="field"> <label for="newsletter-email" class="field__label">Your Email Address</label> <input type="email" class="field__input" name="email-address" id="newsletter-email" required data-msg-required="We need to know your email address" value="test@ahoy.co.uk"> <button type="submit" class="field__button">submit</button> </div> </form> 

Единственная проблема, которую я вижу, заключается в том, что действие получает домен, добавленный перед ним. Если я делаю это с помощью jquery ajax, он отлично работает, поэтому код выглядит как javascript. Я могу предоставить функции ajax, но они довольно общие.

Если вам нужен еще один код, сообщите мне.

Благодарю.

Редактировать комментарии:

Я попытался изменить форму на поле ввода скрытых действий, как указано в комментариях:

 <form action=""> <input type="hidden" name="action" value="newsletter_signup"/> <div class="field"> <label>Your Email Address</label> <input type="email" name="email-address"> <button type="submit">submit</button> </div> </form> 

Это formdata отправлено на submit:

 ------WebKitFormBoundarycskAgc8KcinCzpoG Content-Disposition: form-data; name:"action" newsletter_signup ------WebKitFormBoundarycskAgc8KcinCzpoG Content-Disposition: form-data; name="email-address" test@test.co.uk ------WebKitFormBoundarycskAgc8KcinCzpoG-- 

И он отправляется:

http://test.dev/wp-admin/admin-ajax.php

Редактировать # 2:

Отправка запроса на получение:

 u.jax.get('http://test.dev/wp-admin/admin-ajax.php?action=newsletter_si‌​gnup&email-address=t‌​est@test.co.uk', function(s){ console.log(s) }); 

Также дает ответ 0 .

Вот мои функции js ajax, если они дают некоторую ясность:

 // ===== Ajax Utilities // Handles Ajax Responses function _handleResponse(request, success) { request.onreadystatechange = function() { if (request.status >= 200 && request.status < 400) { if (typeof request.responseText == 'string') { data = request.responseText; } else { data = JSON.parse(request.responseText); } success(data); } else { return request.status + ' failed request: '+ JSON.parse(request.responseText); } }; request.onerror = function() { return request.status + ' failed request: '+ JSON.parse(request.responseText); }; } // Ajax GET & POST u.jax = { get: function(url, success) { var request = new XMLHttpRequest(); request.open('GET', url, true); request.send(null); _handleResponse(request, success); }, post: function(url, data, success) { var request = new XMLHttpRequest(); request.open('POST', url, true); request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); request.send(data); _handleResponse(request, success); } }; 

Почтовые заголовки для запроса на получение:

 Cache-Control →no-cache, must-revalidate, max-age=0 Connection →Keep-Alive Content-Length →1 Content-Type →text/html; charset=UTF-8 Date →Fri, 03 Mar 2017 16:16:54 GMT Expires →Wed, 11 Jan 1984 05:00:00 GMT Keep-Alive →timeout=5, max=100 Server →Apache/2.4.20 (Unix) PHP/5.5.35 mod_wsgi/3.5 Python/3.5.1 OpenSSL/1.0.1p X-Content-Type-Options →nosniff X-Frame-Options →SAMEORIGIN X-Powered-By →PHP/5.5.35 X-Robots-Tag →noindex 

Таким образом, оказывается единственной проблемой был тип содержимого заголовка.

Удалив request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); и просто оставив его, он работал нормально. Это также связано с тем, что действие формы захватывается и добавляется.

Ajax call:

 var formData = new FormData(form); formData.append('security', WP.nonce); formData.append('action', form.getAttribute('action')); u.jax.post(WP.ajax, formData, onSent); 

Ajax Функция:

 u.jax.post = function(url, data, success) { var request = new XMLHttpRequest(); request.open('POST', url, true); request.send(data); request.onreadystatechange = function() { if (request.readyState === 4) { if (typeof request.responseText == 'string') { data = request.responseText; } else { data = JSON.parse(request.responseText); } success(data); return; } }; } 

Форма:

 <form action="newsletter_signup"> <div class="field"> <label>Your Email Address</label> <input type="email" name="email-address"> <button type="submit">submit</button> </div> </form> 

PHP:

 function newsletter_signup(){ // Get the email address $email = sanitize_email($_POST['email-address']); // Do what you wish with the email address. //Setup the data to send back $data = array(); // json encode the data to send back echo json_encode($data); exit; } add_action('wp_ajax_newsletter_signup', 'newsletter_signup'); add_action('wp_ajax_nopriv_newsletter_signup', 'newsletter_signup'); 

FormData обрабатывает действие вашего тега формы как часть данных формы, если это не то, что вы хотите отправить admin-ajax.php. Попробуйте найти другой способ отправить «newsletter_signup» как действие для admin-ajax.php, главным образом, создав собственный массив:

 var form_data = new FormData(form); form_data.append('security', WP.nonce); form_data.append('value', form.value); // etc. etc., for each value you want to send var formData = { action: 'newsletter_signup', data: form_data } u.jax.post(WP.ajax, formData, onSent); 

Кроме того, что посылает 0? Это admin-ajax.php, или это die() где-то в вашем php-скрипте, который обрабатывает данные этой формы?