AJAX仅在我以管理员身份登录时才起作用

时间:2015-04-24 作者:whitenoisedb

我想对每个select值更改发出AJAX请求,以更新数据库中的实际值。我在一个短代码中编码functions.php. 我有一个select 下面这样的元素,

echo \'<select name="changeValue" onchange="changeValue(\' . $user->ID . \', this.options[this.selectedIndex])">\'
在短代码的末尾,我会:

?>
    <script type="text/javascript">
        function changeValue(id, valueElement) {
            jQuery.post(
                "<?php echo admin_url(\'admin-ajax.php\'); ?>", 
                {
                    \'action\': \'update_value\',
                    \'data\':  {
                        user_id: id,
                        value: valueElement.value
                    }
                }, 
                function(response){
                    console.log(response)
                }
            );
        }
    </script>
<?
}
add_shortcode(\'the_shortcode\', \'the_shortcode\');

function update_value() {
    $user_id = $_POST[\'data\'][\'user_id\'];
    $value= $_POST[\'data\'][\'value\'];
    echo $user_id . \' - \' . $empresa;

    //return update_user_meta($user_id , \'value\', $value);
    wp_die();
}
add_action( \'wp_ajax_update_value\', \'update_value\' );
add_action( \'wp_ajax_nopriv_update_value\', \'update_value\' );
我的代码works when I\'m logged as Admin. 但是如果我以其他用户身份登录,console.log(response) 返回整个HTML页面内容。我做错了什么?

编辑:另一个区别是,当以管理员身份登录时,admin-ajax.php 退货200 OK, 而当以用户身份登录时,它会返回302 Found.

2 个回复
SO网友:Ahmed Mostafa

如果使用json,您将使用什么类型的响应

$.post( ajaxurl , data , function(res){
// your code 
},\'json\');
拆下wp\\U模具()并更换为模具()

SO网友:Leon Magee

使用时admin-ajax.php 这个admin_init 钩子被激发,那么在管理中运行的许多函数在使用ajax时也会运行。在这种情况下,一些代码通过将非管理员用户重定向到其他地方,将其锁定在管理员之外。这可能是主题的一部分,也可能来自插件。

当重定向触发时,它会将主页的html“返回”到ajax请求,这就是为什么会看到html而不是预期的响应。

需要修改重定向以忽略ajax请求:

if ( ( ! current_user_can( \'level_5\' ) ) && ( $_SERVER[\'PHP_SELF\'] != \'/wp- admin/admin-ajax.php\' ) )  {
    wp_redirect( site_url() );
}
您还可以使用RESTAPI而不是ajax来避免此问题。

结束

相关推荐

将加载AJAX的帖子添加到现有帖子

我设法让Ajax加载到wordpress帖子。但我的问题是,当我单击“下一篇帖子”按钮时,它会用新帖子替换上一篇帖子。但我想在已经显示但不替换的帖子下面显示下一组帖子。直到现在。<div id=\"content\"> <div id=\"contentInner\"> <ul class=\"list-group\"> <!-- the loop --> <?php if ( have_posts() ) : whil