Ajax вызов PHP-скрипта возвращает ошибку 404 - PullRequest
12 голосов
/ 23 апреля 2011

Я дизайнер 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, чтобы увидеть, почему обработчик успеха не запускается, пихтаebug показывает «ошибка 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\-]+\.)*+[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 ]

28 голосов
/ 26 апреля 2011

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

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

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

2 голосов
/ 11 ноября 2014

Как видно здесь 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();
2 голосов
/ 20 декабря 2012

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

http://codex.wordpress.org/AJAX_in_Plugins

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


Аякс на стороне администрации

Поскольку 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. Это верно только для администрации.

0 голосов
/ 23 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...