tags:

views:

86

answers:

4

I'm posting some data to a PHP script via jQuery AJAX, and everything executes correctly, but it returns a 404 error. In my Firebug console the response from the PHP script is correct. I don't understand how the script can respond, and it is still throwing a 404 error. The jQuery "error" callback method triggers, and the "success" method doesn't.

All statements performed by the PHP script work accurately, because I can see the database being updated, etc.

I'm using jQuery 1.4.2, on a WordPress 3.x website hosted by Dreamhost.

-----------MORE INFO-----------

OK, I've figured out that when I include WordPress's wp-blog-header.php file in the Ajax script, I get the error. Also, once upon a time these scripts work, and I am 90% sure they stopped working after the WP 3.0 update. I'll paste in the Response headers from Firebug.

This header response from PHP that includes the wp-blog-header.php and returns a 404 error 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

This header response from PHP that doesn't include the wp-blog-header.php and returns a 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
+1  A: 

I've added an ajax.php file in a WordPress template once, and had this problem.

I solved it simply by adding at the top of ajax.php

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

Kind of a hack, but it worked.

alex
I placed that both at the top and bottom of the PHP script, but didn't help.
mikemick
It should be just after you include `wp-header.php`, IIRC.
alex
Yup, tried. Still didn't work. Finally got it resolved. Thanks for your time and patience!
mikemick
+1  A: 

Overall there aren't a ton of places where WordPress will return a 404. I recommending grepping the source tree for those places and placing some debug code to trace why it's happening.

Adam Backstrom
+5  A: 

When you include wp-blog-header.php, you end up bootstrapping the whole WordPress setup routine. The function wp() is called, which calls $wp->main(), which in turn calls various setup functions.

One of these is $wp->query_posts(), which calls $wp_the_query->query(), which in turn calls WP_Query's parse_query() function. I suspect that the 404 indication is generated in there (your AJAX page isn't a WP post, or anything like that), and is later transformed into an actual 404 response header by $wp->handle_404(), the function called after query_posts() in main().

I'm not 100% sure that parse_query() is the definite culprit, but I would suggest seeing if you can just include wp-load.php instead, since I believe it does the actual work of creating the objects that you want to access.

Again, I don't actually use WordPress, so I can't be sure, but looking at the source code this seems to be the most likely case, from what I can tell.

Tim Stone
Tim. I love you so much you have no idea. This has haunted me for some time. Changing the include to wp-load.php made the difference. So, at the end of the day, I assume it WAS the WordPress upgrade that caused the issue.
mikemick
Great answer Tim! +1
alex
A: 

Based on the answer from Tim, I changed the hook I was catching from "wp" to "init" in my plugin and it stopped giving me the 404.

Jage