2010-08-10 8 views
31

Ich poste einige Daten in ein PHP-Skript über jQuery AJAX, und alles wird korrekt ausgeführt, aber es wird ein 404-Fehler zurückgegeben. In meiner Firebug-Konsole ist die Antwort vom PHP-Skript korrekt. Ich verstehe nicht, wie das Skript reagieren kann, und es gibt immer noch einen 404-Fehler. Die jQuery-Rückrufmethode "error" wird ausgelöst, die Methode "success" hingegen nicht.jQuery Ajax Rückgabe 404 Fehler, aber korrekte Antwort

Alle durch die PHP-Skript durchgeführten Arbeiten Anweisungen genau, weil ich die Datenbank sehen werden aktualisiert, usw.

Ich bin mit jQuery 1.4.2, auf einem Wordpress 3.x Website von Dreamhost gehostet.

----------- MEHR INFO -----------

OK, habe ich herausgefunden, dass, wenn ich schließen wp-blog-header.php Datei Wordpress in der Ajax-Skript, ich bekomme den Fehler. Außerdem funktionieren diese Skripte einmal und ich bin zu 90% sicher, dass sie nach dem WP 3.0-Update nicht mehr funktionieren. Ich werde die Antwort-Header von Firebug einfügen.

Dieser Header Antwort von PHP, die die wp-blog-header.php und gibt einen 404-Fehler in 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 

Dieser Header Antwort von PHP, die das beinhaltet nicht beinhaltet wp-blog-header.php und gibt eine 200-OK in 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

Pls überprüfen Sie das PHP-Skript, wenn es eine Zeile, Header senden 404 –

+0

Sie sollten diese neue Entdeckung in Ihre ursprüngliche Frage bearbeiten. – alex

+0

@alex - Gerade tat. Danke für die Eingabe/Beratung. –

Antwort

46

Wenn Sie wp-blog-header.php einschließen, wird die WordPress-Setup-Routine gestartet. Es wird die Funktion wp() aufgerufen, die $wp->main() aufruft, die wiederum verschiedene Setup-Funktionen aufruft.

Eines davon ist $wp->query_posts(), die $wp_the_query->query() nennt, die wiederum ruft WP_Query ‚s parse_query() Funktion. Ich verdächtigen, dass die 404-Anzeige dort generiert wird (Ihre AJAX-Seite ist kein WP-Post oder ähnliches), und wird später in eine tatsächliche 404 Antwortheader von $wp->handle_404(), die Funktion nach query_posts() in main() aufgerufen.

Ich bin nicht 100% sicher, dass parse_query() der eigentliche Übeltäter ist, aber ich würde vorschlagen, wenn Sie nur wp-load.php stattdessen einschließen, da ich glaube, dass es die eigentliche Arbeit der Erstellung der Objekte, die Sie zugreifen möchten.

Auch hier benutze ich WordPress eigentlich nicht, also kann ich mir nicht sicher sein, aber wenn ich mir den Quellcode anschaue, dann scheint das der wahrscheinlichste Fall zu sein, von dem, was ich sagen kann.

+3

Tim. Ich liebe dich so sehr, dass du keine Ahnung hast. Das hat mich für einige Zeit verfolgt. Das Ändern des Includes zu wp-load.php machte den Unterschied. Am Ende des Tages vermute ich, dass das WordPress-Upgrade das Problem verursacht hat. –

+1

Große Antwort Tim! +1 – alex

+0

Ja, wünschte, ich hätte das früher gefunden. Danke Tim! –

3

ich habe eine ajax.php Datei in einem Wordpress-Vorlage einmal zugegeben, und hatte dieses Problem.

Ich löste es einfach durch ajax.php

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

Art einer Kerbe an der Spitze der Zugabe, aber es funktionierte.

+0

Ich habe das sowohl am Anfang als auch am Ende des PHP-Skripts platziert, aber das hat nicht geholfen. –

+1

Es sollte gleich nach dem Einfügen von 'wp-header.php', IIRC sein. – alex

+0

Yup, versucht. Es hat immer noch nicht funktioniert. Endlich wurde es gelöst. Danke für deine Zeit und Geduld! –

1

Insgesamt gibt es nicht viele Orte, an denen WordPress einen 404 zurückgibt. Ich empfehle, den Source-Tree für diese Orte zu bereinigen und Debug-Code zu platzieren, um herauszufinden, warum es passiert.

0

Basierend auf der Antwort von Tim, änderte ich den Haken ich wurde von „wp“ auf „init“ in meiner Plugin zu kontrollieren und es hielt mir an die 404.

0

Ich hatte das gleiche Problem zu geben.

Der Fix.

Wechsel:

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

An:

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

Dies wird auch HTTP-Header-Fehler beheben, wenn Sie eine Seite außerhalb WP haben wollen.

3

Niemand sonst gepostet dies als eine Antwort, so ist es erwähnenswert. Sie sollten wp-load.php anstelle von wp-blog-header.php einschließen.

Wenn Sie wp-blog-header.php eröffnen Sie werden sehen, warum:

if (!isset($wp_did_header)) { 

    $wp_did_header = true; 

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

    wp(); 

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

} 

Wenn Sie nur json für eine AJAX Operation zur Ausgabe sind, was Sie tun nichttemplate-loader.php umfassen müssen. Dies erzeugt unnötigen Overhead und liefert dann natürlich den 404-Fehler.

Dieser 'Workaround' ist für aktuelle und zukünftige Versionen von WordPress erforderlich. Ich gehe davon aus, dass alles, was über 3.0 hinausgeht, wp-load.php enthalten sollte.

+0

Das hat bei mir funktioniert. –