我正在尝试使用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'); function action_cb() { $platform = 'test'; echo json_encode($platform); wp_die(); };
我的问题是:如何解决这个问题并防止它继续发生?我想返回实际结果,而不是0
。
答案 0 :(得分:1)
根据wordpress文档:
https://codex.wordpress.org/AJAX_in_Plugins(参考"错误返回值")
当Wordpress操作与使用add_action定义的WordPress挂钩不匹配时返回0(' wp_ajax_(action)',....)
要检查的事项:
您在哪里定义add_action(' wp_ajax_action_cb',' action_cb');? 具体来说,你的插件代码的哪一部分?
你是否登录了wordpress?您提到了管理区域,所以我假设是这样,但如果您不这样做,则必须使用add_action(' wp_ajax_nopriv_ {action}',....)
此外,您没有分享与此相关的功能: ADD_ACTION(' admin_footer'' ajax_action&#39);
最后,你为什么要使用" json"作为数据类型?如果您尝试回显HTML,请将数据类型更改为' html'。然后,您可以直接回显到页面(或作为您正在做的值)。目前,您尝试将JSON对象作为值格式回显...
所以你的代码看起来像这样:
function action_cb(){$ platform =' test&#39 ;; echo $ platform; 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>
答案 1 :(得分:0)
可能你需要添加
@Effect() login$ = this.updates$
// Listen for the 'LOGIN' action
.whenAction('LOGIN')
// Map the payload into JSON to use as the request body
.map(update => JSON.stringify(update.action.payload))
.switchMap(payload => this.http.post('/auth', payload)
// If successful, dispatch success action with result
.map(res => ({ type: 'LOGIN_SUCCESS', payload: res.json() }))
// If request fails, dispatch failed action
.catch(() => Observable.of({ type: 'LOGIN_FAILED' }));
);
https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)
答案 2 :(得分:0)
只需对AJAX
进行少量更改即可。我假设你以管理员身份登录。
使用action
data:"action=action_cb",
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);
});
答案 3 :(得分:0)
为了防止WP在响应中添加零,我始终使用 wd_die();
的 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调用功能时,请使用操作:&#39; action_cb&#39;
答案 4 :(得分:0)
希望这会有所帮助。我已经解释了在wp中使用ajax的标准方法。
答案 5 :(得分:0)
好的,我现在已经在我自己的项目中重新创建了你的代码,并注意到你共享的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();
});
我希望这些评论足以说明它是如何运作的。请注意我是如何使用 $ j 而不是jQuery.noConflict模式的$。
答案 6 :(得分:0)
对于那些“加载更多”问题。
通常使用 "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();