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
}
});
}
});
Примечания:
- отправить письмо.php-это корректный скрипт, который отправляет электронную почту с помощью класса PHPmailer.
- код jQuery выше находится в lib / scripts / jfunctions.js (тот же каталог скрипта php)
- весь процесс (ajax и php) отлично работает, как и ожидалось, на многих серверах (протестирован на двух серверах мной и другими серверами моими тематическими пользователями).
Переменная templatePath имеет значение полного пути к шаблону, которое выглядит следующим образом: http://somedomain.com/wp-content/themes/themename
Задача:
В некоторых серверах, обработчик успех не происходит, в то время как Ajax-вызов, чтобы отправка электронных писем отключена.php фактически успешно передается, и скрипт php обрабатывается и отправляется по электронной почте.
Когда я проверяю с чтобы увидеть, почему обработчик успеха не срабатывает, firebug показывает "не найдена ошибка 404", это похоже на ложную тревогу.
Возможные причины:
Я думаю, что некоторые серверы настроены на блокирование таких ajax-вызовов.
Что может быть причиной этой странной проблемы? Как это исправить?
Заранее благодарю.
@nowk: отправить письмо.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-]+.)*+[a-z]{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, странно ха!.
4 ответов:
Поскольку сервер посылает 404 (бог знает по какой причине), есть два способа исправить / обойти это:
- игнорируйте код ответа HTTP и измените
successнаcompleteв вызове ajax jQuery, чтобы обработчик выполнялся при выполнении запроса независимо от ответа сервера. Вы знаете ответ сервера (он всегда работает). HTML по-прежнему должен быть доступен в обработчике jQuerycomplete.- перезаписать 404, который что-то посылает на сервер (вероятно, что-то Wordpress) путем выполнения (перед печатью любого вывода):
header('HTTP/1.1 200 OK'). Так как скрипт выполнен, он перезапишет crazy 404, а jQuery получит эти 200 и выполнит обработчикsuccess.Вы можете попробовать оба =) я почти уверен, что первый будет работать (но это не так чисто). Я также уверен, что 2-й будет работать, но я не знаю 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.
Comments