WordPress 中的 AJAX 只返回 0
Posted
技术标签:
【中文标题】WordPress 中的 AJAX 只返回 0【英文标题】:AJAX in WordPress only returns 0 【发布时间】:2017-01-01 21:08:43 【问题描述】:我正在尝试利用 WordPress 的 admin-ajax 功能为插件构建动态管理面板选项集。从本质上讲,一旦从下拉菜单(选择/选项菜单)中选择了一个选项,php 函数就会排序并显示更多位于其上方下拉菜单下的下拉菜单。我从一个简单的返回开始,我希望以后可以使用它,但我似乎无法在不遇到unidentified
问题的情况下打印出文本。
我设置的 AJAX 显示 200 状态,但响应从未建立,我的结果是 0
。代码如下:
JS/jQuery 内置于 PHP 函数 ajax-action()
$ = jQuery;
$('#platform').change(function(e)
var data =
action: 'action_cb',
type: 'POST',
dataType: 'json',
error: function(XMLHttpRequest, textStatus, errorThrown)
console.log(errorThrown);
,
success: function(response)
$('#user_id').val(response);
;
$.ajax(ajaxurl, data, function(data)
$('#user_id').val(data);
);
e.preventDefault();
);
PHP 函数和添加操作
add_action('wp_ajax_action_cb','action_cb'); add_action('admin_footer','ajax_action'); 函数 action_cb() $platform = 'test';回声 json_encode($platform); wp_die(); ;
我的问题是:我该如何解决这个问题并防止它继续发生?我想返回实际结果而不是0
。
【问题讨论】:
我不认为这是导致问题的原因,但您的 action_cb 函数中有错字。它应该是 wp_die() 而不是 p_die()。我会尽快看看这个。 尝试在您的$.ajax
语句之前放置一个 $.support.cors = true;
,因为这可能是由于 CORS 问题
@lassemt 是的,我最初尝试过 die() 但在发布此内容后在我的机器上对其进行了编辑并忘记了 w 在这里对其进行修改。更新了帖子以反映这一变化
@DavidR 没有雪茄。我可能不得不走老式路线并使用大量 .show() 和 .hide()。
【参考方案1】:
根据 wordpress 文档:
https://codex.wordpress.org/AJAX_in_Plugins(参考“错误返回值”)
当 Wordpress 操作与使用 add_action('wp_ajax_(action)',....) 定义的 WordPress 挂钩不匹配时,返回 0
检查事项:
你在哪里定义你的 add_action('wp_ajax_action_cb','action_cb');? 具体来说,插件代码的哪一部分?
您是否已登录 wordpress?你提到了管理区域,所以我假设是这样,但如果你不是,你必须使用 add_action('wp_ajax_nopriv_action', ....)
此外,您没有共享与此相关的功能: add_action('admin_footer','ajax_action');
最后,你为什么使用“json”作为数据类型?如果您尝试直接回显 html,请将数据类型更改为“html”。然后您可以直接在页面上回显(或作为您正在执行的值)。目前,您正在尝试将 JSON 对象作为表单中的值回显...
所以你的代码看起来像这样:
function action_cb() $platform = 'test';回声$平台; p_die(); ;
...你的 AJAX 可能是:
<script type = "text/javascript">
jQuery.ajax(
url: ajaxurl,
type: 'post',
data: 'action' : 'action_cb',
success: function (data)
if (data != '0' && data != '-1')
YOUR SUCCESS CODE
else
ANY ERROR HANDLING
,
dataType: 'html'
);
</script>
试试这个:
<script>
$ = jQuery;
$('#platform').change(function(e)
var data =
data: 'action' : 'action_cb',
type: 'POST',
dataType: 'json',
error: function(XMLHttpRequest, textStatus, errorThrown)
console.log(errorThrown);
,
success: function(response)
$('#user_id').val(response);
;
$.ajax(ajaxurl, data, function(data)
$('#user_id').val(data);
);
e.preventDefault();
);
</script>
【讨论】:
函数 ajax_action() 是 Javascript/jQuery。由于 *** 的格式限制和我缺乏耐心,我将两者分开。此外,$platform 是一个 json 文件,但为了我自己的理智,我现在只使用一个词。 但是您得到 0 的原因是因为您似乎没有将“动作”POST 变量传递给 WP,因此它认为您的动作挂钩未定义。注意我是如何传递 "action" : 'action_cb' 作为 AJAX 调用的数据的。如果你需要使用 JSON,只需将我使用的 dataType 更改为 'json',你会得到 JSON 作为回报。 与将操作作为早期变量传递有何不同?如果在 var 数据中定义了动作,它的读法不一样吗? 我不是格式化 AJAX 调用的所有不同方法的专家,但我在 WP 中做同样的事情,我可以告诉你我发布的上述代码将 100% 工作.我不相信您可以将 action: 作为数据变量中的 AJAX 选项传递,这不是可接受的 Ajax 选项。您将要发布到服务器的数据放在 Ajax 选项的“数据”部分。 我试了一下,没有任何调整使它工作。我正在检查 AJAX 状态请求,但从未创建任何响应。【参考方案2】:可能你需要添加
add_action('wp_ajax_nopriv_action_cb', 'action_cb');
https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)
【讨论】:
该操作适用于前端用户和未登录用户。我将整个操作保留在管理面板中。不过感谢您的建议!【参考方案3】:只需在您的 AJAX
中做些小改动。我假设您以管理员身份登录。
用data:"action=action_cb",
替换数据对象中的action
var data =
data:"action=action_cb",
type: 'POST',
dataType: 'json',
error: function(XMLHttpRequest, textStatus, errorThrown)
console.log(errorThrown);
,
success: function(response)
$('#user_id').val(response);
;
$.ajax(ajaxurl,data,function(data)
$('#user_id').val(data);
);
【讨论】:
【参考方案4】:为了防止 WP 在响应中添加零,我总是使用 die(); insted of wp_die();
及注册功能:
add_action( 'wp_ajax_action_cb', 'action_cb_init' );
add_action( 'wp_ajax_nopriv_action_cb', 'action_cb_init' );
function action_cb_init()
使用 AJAX 调用函数时,使用 action: 'action_cb'
【讨论】:
【参考方案5】:希望这会有所帮助。我已经解释了在 wp 中使用 ajax 的标准方法。
Wordpress: Passing data to a page using Ajax
【讨论】:
【参考方案6】:好的,我现在在我自己的项目中重新创建了您的代码,并注意到您共享的 javascript 返回了 ajax-object 而不是结果。所以我想出的是有点重写,但是当我尝试它时效果很好。
$j = jQuery.noConflict();
$j('#platform').change(function(e)
$j.ajax(
url: ajaxurl,
type: 'POST',
dataType: 'json',
data:
action: 'action_cb',
).done(function( data )
// When ajax-request is done.
if(data)
$j('#user_id').val(data);
else
// If 0
).fail(function(XMLHttpRequest, textStatus, errorThrown)
// If ajax failed
console.log(errorThrown);
);
e.preventDefault();
);
我希望 cmets 能很好地解释它是如何工作的。请注意我如何使用 $j 而不仅仅是 $ 用于 jQuery.noConflict 模式。
【讨论】:
【参考方案7】:对于那些被“加载更多”问题的人。
通常使用"0"
代替false
。
我找到了这样的解决方案。
这样0
就不会来了。用false
试试这个代码。
PHP
ob_start(); // start the buffer to capture the output of the template
get_template_part('contents/content_general');
$getPosts[] = ob_get_contents(); // pass the output to variable
ob_end_clean(); // clear the buffer
if( $read == $articles->found_posts )
$getPosts[] = false;
JS
if( posts[i] == false )
$(".load_more_button").fadeOut();
【讨论】:
以上是关于WordPress 中的 AJAX 只返回 0的主要内容,如果未能解决你的问题,请参考以下文章