JQuery Ajax возвращает 404 Ошибка, но правильный ответ - PullRequest
31 голосов
/ 10 августа 2010

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

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

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

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

ОК, я понял, что когда я включаю файл wp-blog-header.php WordPress в скрипт 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 ]

47 голосов
/ 10 августа 2010

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

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

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

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

3 голосов
/ 20 июля 2012

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

3 голосов
/ 10 августа 2010

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

Я решил ее, просто добавив вверху ajax.php

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

Вроде хак, но это сработало.

1 голос
/ 10 августа 2010

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

0 голосов
/ 23 ноября 2011

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

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

Изменение:

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.

0 голосов
/ 12 сентября 2010

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

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