Ajax-вызов для php-скрипта возвращает ошибку 404

Я дизайнер WordPress, я разработал контактную форму для одной из моих тем, которая проверена с помощью jQuery.

Проверьте код ниже, затем прочитайте примечания ниже.

$('.submitemail') .click(function() { //VALIDATION CODE GOES HERE if ( /*VALIDATED SUCCESSFULLY*/ ) { $.ajax({ type: 'POST', url: templatePath+'/lib/scripts/sendEmail.php', data: 'visitorname=' + visitorname + '&visitoremail=' + visitoremail + '&visitormessage=' + visitormessage, success: function(contactResults) { //SUCCESS CODE } }); } }); 

Заметки:

  • sendEmail.php – это правильный скрипт, отправляющий электронную почту с использованием класса PHPmailer.
  • Переменная templatePath имеет значение полного шаблона шаблона, который выглядит следующим образом: http://somedomain.com/wp-content/themes/themename
  • Код jQuery выше расположен в lib / scripts / jfunctions.js (тот же каталог скрипта php)
  • Весь процесс (ajax и php) работает отлично, как ожидалось, на многих серверах (тестируется на двух серверах мной и другими серверами пользователями моей темы).

Проблема:

На некоторых серверах обработчик успеха не запускается, а вызов ajax для sendEmail.php фактически успешно передается и обрабатывается скрипт php и отправляется сообщение электронной почты.

Когда я проверяю с помощью firebug, чтобы понять, почему обработчик успеха не запускается, firebug показывает «не найденная ошибка 404», это похоже на ложную тревогу.

Возможные причины:

Я думаю, что некоторые серверы настроены на блокировку таких вызовов ajax.

Что может быть причиной этой странной проблемы? Как это исправить?

Заранее спасибо.

@nowk: код sendEmail.php:

 <?php // Code for loading WordPress environment goes here // $themeName_optionTree = get_option('option_tree'); $name = trim($_POST['visitorname']); $email = $_POST['visitoremail']; $message = $_POST['visitormessage']; $site_owners_email = $themeName_optionTree['owner_email']; $site_owners_name = $themeName_optionTree['owner_name']; $email_subject = $themeName_optionTree['email_subject']; $success_message = '<p class="success-box">' . $themeName_optionTree['success_message'] . '</p>'; if (strlen($name) < 2) { $error['name'] = 1; } if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[az]{2}/is', $email)) { $error['email'] = 1; } if (strlen($message) < 2) { $error['message'] = 1; } if (!$error) { require_once('PHPMailer_v5.1/class.phpmailer.php'); $mail = new PHPMailer(true); try { $mail->From = $email; $mail->FromName = $name; $mail->Subject = $email_subject; $mail->AddAddress($site_owners_email, $site_owners_name); $mail->Body = $message; $mail->Send(); echo $success_message; } catch (phpmailerException $e) { echo '<p class="warning-box">' . $e->errorMessage() . '</p>'; } catch (Exception $e) { echo '<p class="warning-box">' . $e->getMessage() . '</p>'; } } ?> 

Обратите внимание, что приведенный выше код отлично работает, даже когда ajax возвращает 404, странно.

Поскольку сервер отправляет 404 (бог знает, в чем причина), есть два способа исправить / обойти это:

  1. Игнорируйте код ответа HTTP и измените success чтобы complete вызов jQuery ajax, чтобы обработчик выполнялся, когда запрос выполняется независимо от ответа сервера. Вы знаете ответ сервера (он всегда работает). HTML все равно должен быть доступен в complete обработчике jQuery.
  2. Перезапишите 404, что что-то отправляет на сервер (возможно, что-то WordPress) путем выполнения ( перед печатью любого вывода ): header('HTTP/1.1 200 OK') . Поскольку сценарий выполняется, это перезапишет сумасшедший 404, а jQuery получит 200 и выполнит обработчик success .

Вы можете попробовать оба =) Я уверен, что первый будет работать (но это не так чисто). Я также уверен, что второй будет работать, но я не знаю WordPress достаточно хорошо, чтобы делать обещания =)

Я предполагаю, что это потому, что WordPress уже имеет встроенный механизм AJAX и не позволяет вам реализовать его самостоятельно. На этой странице объясняется, как добавить AJAX к плагинам:

http://codex.wordpress.org/AJAX_in_Plugins

Вот фрагмент со страницы:


Ajax на стороне администрирования

Поскольку Ajax уже встроен в основные окна администрирования WordPress, добавление функциональности Ajax на стороне администратора для вашего плагина довольно просто, и в этом разделе описывается, как это сделать.

Вот краткий пример. Все это будет в одном файле.

Во-первых, добавьте javascript, который вызовет запрос AJAX:

 <?php add_action('admin_print_scripts', 'my_action_javascript'); function my_action_javascript() { ?> <script type="text/javascript" > jQuery(document).ready(function($) { var data = { action: 'my_action', whatever: 1234 }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php $.post(ajaxurl, data, function(response) { alert('Got this from the server: ' + response); }); }); </script> <?php } 

Затем настройте функцию PHP, которая будет обрабатывать этот запрос:

 <?php add_action('wp_ajax_my_action', 'my_action_callback'); function my_action_callback() { global $wpdb; // this is how you get access to the database $whatever = intval( $_POST['whatever'] ); $whatever += 10; echo $whatever; die(); // this is required to return a proper result } 

Это оно! Вам нужно будет добавить несколько деталей, таких как проверка ошибок и проверка того, что запрос пришел из нужного места (с помощью check_ajax_referer ()), но, надеюсь, приведенного выше примера будет достаточно, чтобы вы начали свой собственный плагин Ajax на стороне администрирования , ПРИМЕЧАНИЕ. Начиная с версии 2.8, глобальную переменную javascript ajaxurl можно использовать в том случае, если вы хотите отделить свой код javascript от php-файлов в только файлы javascript. Это верно только для администрации.

Как показано здесь, https://cooltrainer.org/fixing-false-404-headers-on-external-pages-including-wp-blog-header-php/ это решение проверено и работает хорошо:

 require_once("path/to/wp-config.php"); $wp->init(); $wp->parse_request(); $wp->query_posts(); $wp->register_globals(); $wp->send_headers(); 

Не вникая в проблему, вы можете проверить, что запрос ajax действительно идет туда, где вы думаете, что это происходит. Здесь может быть несколько вещей, например, сервер настроен для перенаправления любых запросов на / wp-content / где-то еще.

Захватите некоторую информацию заголовка с помощью firebug и, возможно, заголовков livehttp.