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.