【发布时间】:2014-04-30 01:00:54
【问题描述】:
我正在尝试在 WordPress 插件中执行 AJAX 请求。该请求是在使用自定义短代码嵌入文章的首页上发起的。
我尝试合并来自the documentation 和this tutorial 的信息。
但是,在测试该方法时出了点问题……没有调用 AJAX 查询挂钩。
这就是调用我的page.php 脚本以进行短代码交付的方式:
add_shortcode('testshortcode', 'TestShortCodeFunction');
function TestShortCodeFunction($attributes)
{
ob_start();
include(__DIR__.'/page.php');
return ob_get_clean();
}
这是我的压缩测试脚本page.php:
<?php
add_action('wp_ajax_test', 'Test');
add_action('wp_ajax_nopriv_test', 'Test');
// do_action('wp_ajax_nopriv_test'); this calls Test()
function Test()
{
echo 'Hallo';
die();
}
?>
<script type='text/javascript'>
jQuery(document).ready(function() {
console.log("JS query started");
// The following does not call test()
jQuery.ajax({
type: "POST",
url: "http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=test",
success: function(data) {
console.log("Query returned: "+data);
}
});
});
</script>
控制台上的输出是:
JS query started
Query returned: 0
根据 PHP 调试器,永远不会调用 Test() 函数。
admin-ajax.php 根据网络监视器(URL http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=test)执行,但返回0。
admin-ajax.php里面do_action('wp_ajax_test')是根据PHP调试器调用的。
【问题讨论】:
-
您可以编辑问题以包含您的 js 吗?
-
查看我更新的问题。但是我不确定这是否重要,因为我的 PHP 调试器捕获了正确的 admin-ajax.php 调用。这就是为什么我认为JS没问题。你知道 do_action() 的内部结构吗?如果它在贴出的代码行返回是什么意思?
-
如果你只是去看看 /wp-admin/admin-ajax.php?action=querydata 的任何内容,它是否有效?这并不总是正确的道路。看看 core 是怎么做的,或者用 wp_localize_script 看看流行的插件和主题。获取路径的正确 php 函数是 admin_url('admin-ajax.php') btw。如果这是在管理部分,你也只有 ajaxurl 可用。 console.log() 看看是不是一样的输出。
-
结果是127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=querydata。如果我直接调用它,则与重新加载插件页面时发生的情况相同...调用 admin-ajax.php,使用“querydata”调用 do_action(),但不调用连接的回调。这让我抓狂。我所有的钩子以前都工作过:-(
-
把js放到一个单独的文件中,使用jQuery(document).ready(function() {});而不是 ext 的东西,并用 wp_enqueue_script 正确地包含它,那么应该可以工作。我在基本的 wordpress 安装上做到了这一点,它运行良好。我不熟悉 extjs,所以我不确定它实际上是如何处理文档准备的。
标签: javascript php ajax wordpress extjs