我通过jQuery AJAX将一些数据发布到PHP脚本,并且一切都正确执行,但它返回404错误。在我的Firebug控制台中,PHP脚本的响应是正确的。我不明白脚本如何响应,它仍然抛出404错误。 jQuery“error”回调方法触发,“success”方法不触发。
PHP脚本执行的所有语句都能正常工作,因为我可以看到数据库正在更新等等。
我在Dreamhost托管的WordPress 3.x网站上使用jQuery 1.4.2。
-----------更多信息-----------
好的,我已经发现当我在Ajax脚本中包含WordPress的wp-blog-header.php
文件时,我收到错误。此外,曾几何时这些脚本工作,我90%肯定他们在WP 3.0更新后停止工作。我将粘贴Firebug的响应头文件。
来自PHP的此标头响应包含wp-blog-header.php并在Firebug中返回404错误...
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并在Firebug中返回200 OK ...
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 :(得分:47)
当您包含wp-blog-header.php
时,您最终会引导整个WordPress设置例程。调用函数wp()
,调用$wp->main()
,后者又调用各种设置函数。
其中一个是$wp->query_posts()
,调用$wp_the_query->query()
,后者又调用WP_Query
的{{1}}函数。我怀疑在那里生成了404指示(你的AJAX页面不是WP帖子,或类似的东西),后来被parse_query()
转换为实际的404响应头,$wp->handle_404()
中query_posts()
之后调用的函数。
我不是百分之百确定main()
是明确的罪魁祸首,但我建议你看看是否可以只包括parse_query()
,因为我相信它可以完成创建对象的实际工作你想要访问的。
同样,我实际上并没有使用WordPress,所以我无法确定,但从源代码看,这似乎是最可能的情况,从我所知道的。
答案 1 :(得分:3)
我在WordPress模板中添加了一个ajax.php
文件,但遇到了这个问题。
我只是在ajax.php
header('Response: HTTP/1.1 200 OK');
有点黑客,但它有效。
答案 2 :(得分:3)
没有人将此作为答案发布,所以值得注意。您应该包含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' );
}
如果您只是为AJAX操作输出json,那么不需要包含template-loader.php
。这会产生不必要的开销,然后当然会提供404错误。
对于当前和未来版本的WordPress,此“解决方法”是必需的。我假设任何超过3.0的内容都应该包含wp-load.php
。
答案 3 :(得分:1)
总的来说,WordPress没有大量的地方会返回404.我建议为这些地方点击源树,并放置一些调试代码来追踪它为什么会发生。
答案 4 :(得分:0)
根据Tim的回答,我在我的插件中将我从“wp”捕获的钩子改为“init”,它停止给我404.
答案 5 :(得分:0)
我遇到了同样的问题。
修复。
更改:
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();
如果您想在WP之外设置页面,这也将修复HTTP标头错误。