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

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

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

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

-----------БОЛЬШЕ ИНФОРМАЦИИ-----------

Хорошо, я понял, что когда я включаю WordPress wp-blog-header.php файл в скрипте Ajax, я получаю ошибку. Кроме того, когда-то эти скрипты работали, и я на 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

6 ответов

Решение

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

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

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

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

Никто другой не опубликовал это как ответ, так что стоит отметить. Вы должны быть в том числе 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 как указано.

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

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

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

Вроде взломать, но это сработало.

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

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

Исправление

Изменить:

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

Для того, чтобы:

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

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

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

Другие вопросы по тегам