2010-08-10 6 views
31

Je poste des données à un script PHP via jQuery AJAX, et tout s'exécute correctement, mais il renvoie une erreur 404. Dans ma console Firebug, la réponse du script PHP est correcte. Je ne comprends pas comment le script peut répondre, et il lance toujours une erreur 404. La méthode de rappel "error" de jQuery se déclenche et la méthode "success" ne fonctionne pas.jQuery Ajax renvoyant 404 Erreur, mais correcte Réponse

Toutes les déclarations effectuées par le travail de script PHP avec précision, parce que je peux voir la base de données mis à jour, etc.

J'utilise jQuery 1.4.2, sur un site Web hébergé par WordPress 3.x Dreamhost.

----------- ----------- PLUS D'INFO

OK, je l'ai compris que quand je wp-blog-header.php fichier Include de WordPress dans le Script Ajax, j'ai l'erreur. Aussi, il était une fois ces scripts fonctionnent, et je suis sûr à 90% qu'ils ont cessé de travailler après la mise à jour WP 3.0. Je vais coller dans les en-têtes de réponse de Firebug.

Cette réponse d'en-tête de PHP qui inclut le wp-blog-header.php et renvoie une erreur 404 dans 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 

Cette réponse d'en-tête de PHP qui ne comprend pas la wp-blog-header.php et retourne un 200 OK dans 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

Veuillez vérifier le script php s'il y a une ligne qui envoie l'en-tête 404 –

+0

Vous devriez éditer cette nouvelle découverte dans votre question originale. – alex

+0

@alex - Juste fait. Merci pour la contribution/conseil. –

Répondre

46

Lorsque vous incluez wp-blog-header.php, vous finissez par démarrer l'ensemble de la routine d'installation de WordPress. La fonction wp() est appelée, qui appelle $wp->main(), qui à son tour appelle diverses fonctions de configuration.

L'un d'entre eux est $wp->query_posts(), qui appelle $wp_the_query->query(), qui appelle à son tour la fonction de parse_query()WP_Query. I suspecte que l'indication 404 est générée là (votre page AJAX n'est pas un post WP, ou quelque chose comme ça), et est ensuite transformée en un en-tête de réponse 404 par $wp->handle_404(), la fonction appelée après query_posts() en main(). Je ne suis pas sûr à 100% que parse_query() est le coupable définitif, mais je suggère de voir si vous pouvez simplement inclure wp-load.php à la place, car je crois qu'il fait le travail réel de la création des objets que vous souhaitez accéder.

Encore une fois, je ne pas utiliser réellement WordPress, donc je ne peux pas être sûr, mais en regardant le code source cela semble être le cas le plus probable, de ce que je peux dire.

+3

Tim. Je t'aime tellement que tu n'as aucune idée. Cela m'a hanté pendant un certain temps. Changer l'include pour wp-load.php a fait la différence. Donc, à la fin de la journée, je suppose que c'était la mise à jour de WordPress qui a causé le problème. –

+1

Bonne réponse Tim! +1 – alex

+0

Oui, j'aurais aimé avoir trouvé ça plus tôt. Merci Tim! –

3

J'ai ajouté un fichier ajax.php dans un modèle WordPress une fois, et a eu ce problème.

Je l'ai résolu en ajoutant simplement au sommet de ajax.php

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

Une sorte de hack, mais cela a fonctionné.

+0

J'ai placé cela à la fois en haut et en bas du script PHP, mais n'a pas aidé. –

+1

Cela devrait être juste après avoir inclus 'wp-header.php', IIRC. – alex

+0

Yup, essayé. Ça n'a toujours pas marché. Finalement, je l'ai résolu. Merci pour votre temps et votre patience! –

1

Dans l'ensemble il n'y a pas une tonne d'endroits où WordPress retournera un 404. Je recommande grepper l'arbre source de ces endroits et en plaçant un code de débogage pour tracer pourquoi ça se passe.

0

Selon la réponse de Tim, j'ai changé le crochet j'attrapais de « wp » à « init » dans mon plug-in et il a cessé de me donner la 404.

0

J'ai eu le même problème.

La correction.

Change:

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

Pour:

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

Cela corrigera également les erreurs d'en-tête HTTP si vous voulez avoir une page en dehors de WP.

3

Personne d'autre n'a posté cela comme une réponse, il vaut donc la peine de le noter. Vous devriez inclure wp-load.php au lieu de wp-blog-header.php.

Si vous ouvrez wp-blog-header.php vous verrez pourquoi:

if (!isset($wp_did_header)) { 

    $wp_did_header = true; 

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

    wp(); 

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

} 

Si vous ne JSON pour une exportez opération AJAX, vous ne pas besoin d'inclure template-loader.php. Cela va créer une surcharge inutile, et bien sûr fournir l'erreur 404.

Cette solution de contournement est nécessaire pour les versions actuelles et futures de WordPress. Je suppose que tout passé 3.0 devrait inclure wp-load.php comme indiqué.

+0

Cela a fonctionné pour moi. –