JQuery Ajax возвращает 404 Ошибка, но правильный ответ

30

Я отправляю некоторые данные в PHP script через jQuery AJAX, и все выполняется правильно, но возвращает ошибку 404. В моей консоли Firebug ответ PHP скрипт верен. Я не понимаю, как может реагировать script, и он все еще бросает ошибку 404. Метод обратного вызова jQuery "error" запускается, а метод "success" не работает.

Все инструкции, выполняемые PHP script, работают точно, потому что я могу видеть обновляемую базу данных и т.д.

Я использую jQuery 1.4.2 на веб-сайте WordPress 3.x, размещенном Dreamhost.

----------- ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ -----------

Хорошо, я понял, что когда я включаю WordPress wp-blog-header.php файл в Ajax script, я получаю ошибку. Кроме того, когда-то эти скрипты работают, и я на 90% уверен, что они перестали работать после обновления WP 3.0. Я буду вставлять заголовки ответов из Firebug.

Этот ответ заголовка PHP, который включает wp-blog-header.php и возвращает ошибку 404 в Firebug...

Date                Tue, 10 Aug 2010 01:44:44 GMT
Server            Apache
X-Powered-By        PHP/5.2.6
X-Pingback        http://www.learnwake.com/xmlrpc.php
Expires          Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control       no-cache, must-revalidate, max-age=0
Pragma            no-cache
Last-Modified       Tue, 10 Aug 2010 01:44:44 GMT
Vary                Accept-Encoding
Content-Encoding    gzip
Content-Length    36
Keep-Alive        timeout=2, max=98
Connection        Keep-Alive
Content-Type        text/html; charset=UTF-8

Этот ответ заголовка от PHP, который не включает wp-blog-header.php и возвращает 200 OK в Firebug...

Date                Tue, 10 Aug 2010 01:44:58 GMT
Server            Apache
X-Powered-By        PHP/5.2.6
Vary                Accept-Encoding
Content-Encoding    gzip
Content-Length    36
Keep-Alive        timeout=2, max=100
Connection        Keep-Alive
Content-Type        text/html
  • 0
    Пожалуйста, проверьте PHP-скрипт, если есть строка, которая отправляет заголовок 404
  • 0
    Вы должны отредактировать это новое открытие в свой оригинальный вопрос.
Показать ещё 1 комментарий
Теги:

6 ответов

44
Лучший ответ

Когда вы включаете wp-blog-header.php, вы завершаете загрузку всей процедуры установки WordPress. Вызывается функция wp(), которая вызывает $wp->main(), которая, в свою очередь, вызывает различные функции настройки.

Один из них - $wp->query_posts(), который вызывает $wp_the_query->query(), который, в свою очередь, вызывает функцию WP_Query parse_query(). Я подозреваю, что там отображается индикация 404 (ваша страница AJAX не является WP-сообщением или что-то в этом роде), а затем преобразуется в фактический заголовок ответа 404 с помощью $wp->handle_404(), функция, вызванная после query_posts() в main().

Я не уверен на 100%, что parse_query() является определенным виновником, но я бы предложил посмотреть, можно ли просто включить wp-load.php вместо этого, так как я считаю, что он действительно работает над созданием объектов, которые вы хотите доступ.

Опять же, я фактически не использую WordPress, поэтому я не могу быть уверенным, но, глядя на исходный код, это, пожалуй, самый вероятный случай, из того, что я могу сказать.

  • 3
    Тим. Я люблю тебя так сильно, что ты понятия не имеешь. Это преследовало меня в течение некоторого времени. Изменение включения на wp-load.php имело значение. Итак, в конце дня, я предполагаю, что это было обновление WordPress, которое вызвало проблему.
  • 1
    Отличный ответ Тим! +1
Показать ещё 4 комментария
3

Никто не отправил это как ответ, поэтому стоит отметить. Вы должны включить wp-load.php вместо wp-blog-header.php.

Если вы откроете wp-blog-header.php, вы увидите, почему:

if ( !isset($wp_did_header) ) {

    $wp_did_header = true;

    require_once( dirname(__FILE__) . '/wp-load.php' );

    wp();

    require_once( ABSPATH . WPINC . '/template-loader.php' );

}

Если вы только выводите json для операции AJAX, вам не нужно включать template-loader.php. Это создаст ненужные накладные расходы, а затем, конечно же, даст ошибку 404.

Это "обходное решение" необходимо для текущих и будущих версий WordPress. Я предполагаю, что что-то в прошлом 3.0 должно включать wp-load.php, как указано.

  • 0
    Это сработало для меня.
3

Я добавил файл ajax.php в шаблон WordPress один раз и имел эту проблему.

Я решил это просто, добавив в начало ajax.php

header('Response: HTTP/1.1 200 OK');

Вид взлома, но он сработал.

  • 0
    Я поместил это как вверху, так и внизу скрипта PHP, но это не помогло.
  • 1
    Это должно быть сразу после включения wp-header.php , IIRC.
Показать ещё 1 комментарий
1

В целом нет места, где WordPress вернет 404. Я рекомендую grepping исходное дерево для этих мест и помещать код отладки, чтобы проследить, почему это происходит.

0

У меня была та же проблема.

Исправление.

Изменить:

require_once('wp-blog-header.php');

To:

require_once('conn.php');
require('wp-config.php');
$wp->init();
$wp->parse_request();
$wp->query_posts();
$wp->register_globals();

Это также устранит ошибки заголовка HTTP, если вы хотите иметь страницу вне WP.

0

Основываясь на ответе от Тима, я сменил крючок, который я ловил от "wp" до "init" в своем плагине, и он прекратил давать мне 404.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню