我正在使用wordpress ajax调用从wordpress主题functions.php中的函数返回简单内容。但是,会返回一个完整的html页面。
这是ajax调用
<?php
$ajax_nonce = wp_create_nonce("iwhq_beginner_select_course");
?>
<script type="text/javascript" language="javascript">
jQuery(document).ready(function(){
jQuery("#beg_golf_course").change(function() { //do this when course changes
//in Wordpress ajaxurl always points to admin-ajax.php
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
var course_id = 4;
//Do the ajax
jQuery.ajax({
type: "POST",
url: ajaxurl,
//NOTE - the action parameter calls the function in functions.php
data: { action: 'select_course_aj', course_id: course_id, _ajax_nonce: '<?php echo $ajax_nonce; ?>' },
//display alert on success
success: function(html){
alert(html);
}
}); //close jQuery.ajax(
return false;
});
});
</script>
这是functions.php中的函数
function select_course_func(){
echo $_POST["course_id"];
die();
}
add_action('wp_ajax_select_course_aj','select_course_func');
包含jquery ajax调用的页面的HTML实际上显示在alert而不是echo中。
那里的任何天才都能告诉我为什么?
由于 标记
答案 0 :(得分:4)
好的,问题解决了。看看我上面的3条评论加上......
!defined('DOING_AJAX')是一个常量,可用于测试用户未执行ajax请求。我将此与我的逻辑相结合,将非管理员重定向到前端,现在可以正常工作。
/* check the role of current loged in user for redirection */
add_action('admin_init','rt_checkRole');
function rt_checkRole() {
global $wp_roles;
$currentrole ='';
foreach ( $wp_roles->role_names as $role => $name ) {
if ( current_user_can( $role ) ){
$currentrole = $role;
}
}
if(!defined('DOING_AJAX') && (!$currentrole || ($currentrole != 'administrator' && $currentrole != 'editor'))){
wp_redirect (site_url().'/front-end-login/');
}
}
找到了!!('DOING_AJAX')
感谢所有评论的人。
答案 1 :(得分:0)
如果你想为非管理员用户做ajax调用,你应该使用下面的代码,这将禁止非管理员用户使用wp-admin,但允许每个用户,登录或注销用户进行ajax调用
function my_admin_init(){
if( !defined('DOING_AJAX') && !current_user_can('administrator') ){
wp_redirect( home_url() );
exit();
}
}
add_action('admin_init','my_admin_init');