Wordpress Ajax 从 functions.php 返回完整的 html 页面,而不是 echo


Wordpress Ajax returns full html page from functions.php, not echo

我正在使用wordpress ajax调用从wordpress主题函数中的函数返回简单内容.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>

这就是函数中的函数.php

function select_course_func(){
echo $_POST["course_id"];
die();
}
add_action('wp_ajax_select_course_aj','select_course_func');

包含 jquery ajax 调用的页面的 HTML 实际上显示在警报中,而不是 echo 中。

有天才能告诉我为什么吗?

谢谢马克

好的,问题解决了。请参阅我上面的最后 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/');
        }
}

在 https://wordpress.stackexchange.com/questions/26100/redirect-out-of-wp-admin-without-losing-admin-ajax-php 找到关于!defined('DOING_AJAX')

感谢所有发表评论的人。

如果你想为非管理员用户做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');