Я отправляю некоторые данные в 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
Когда вы включаете 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, поэтому я не могу быть уверенным, но, глядя на исходный код, это, пожалуй, самый вероятный случай, из того, что я могу сказать.
Никто не отправил это как ответ, поэтому стоит отметить. Вы должны включить 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');
Вид взлома, но он сработал.
wp-header.php
, IIRC.
В целом нет места, где WordPress вернет 404. Я рекомендую grepping исходное дерево для этих мест и помещать код отладки, чтобы проследить, почему это происходит.
У меня была та же проблема.
Исправление.
Изменить:
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.
Основываясь на ответе от Тима, я сменил крючок, который я ловил от "wp" до "init" в своем плагине, и он прекратил давать мне 404.