Wordpress admin-ajax导致错误302重定向

时间:2012-02-23 06:43:25

标签: ajax wordpress .htaccess

我已经定制了一个插件,可以对admin-ajax.php进行一些ajax调用,但效果很好。我将代码复制到另一个站点,它不再适用于未登录的用户。

来自萤火虫:

POST http://<subdomain>.<server>/wp-admin/admin-ajax.php 302 Moved Temporarily 1.08s    

GET http://<subdomain>.<server>/ 200 OK

编辑:问题是主题可能会为重定向ajax请求做些什么。该插件有两个钩子:

add_action( 'wp_ajax_em_ajax_getEvents', 'em_ajax_getEvents' ); // ajax for logged in users
add_action( 'wp_ajax_nopriv_em_ajax_getEvents', 'em_ajax_getEvents' ); // ajax for not logged in users

它们在大多数网站上都可以正常工作,但是一个主题以某种方式重定向来自未登录用户的请求。由于这些操作特定于插件,因此我不知道从哪里开始查看。

解决方案:非常感谢add_action( 'init'解决方案的Ronald Huereca,这正是违规重定向挂钩的原因所在保护管理区域。现在我只需要在这里找到一个不会危及主题管理区域的安全修复程序,但也不会妨碍其他插件允许用户发出匿名的ajax请求。

// stop users accessing the admin
add_action('init', array( $this, 'prevent_admin_access' ), 0);

function prevent_admin_access() {       

    if (strpos(strtolower($_SERVER['REQUEST_URI']), '/wp-admin') !== false) {
        $current_user = wp_get_current_user(); 

        if(!user_can($current_user->ID, 'administrator') && ( !user_can($current_user->ID, 'contributor') ) ){
            wp_redirect(get_option('siteurl'));
        }
    }
}

4 个答案:

答案 0 :(得分:17)

我在主题中发生了类似的事情。原始编码器试图阻止非管理员用户看到/ wp-admin /区域。

以下是一个例子:

// Block Access to /wp-admin for non admins.
function custom_blockusers_init() {
  if ( is_user_logged_in() && is_admin() && !current_user_can( 'administrator' ) ) {
    wp_redirect( home_url() );
    exit;
  }
}
add_action( 'init', 'custom_blockusers_init' ); // Hook into 'init'

我会检查你的主题是否有类似于我的源代码。

当您找到代码时,只需添加一个额外的条件,以确保在定义 DOING_AJAX 常量时不会重定向用户。

答案 1 :(得分:4)

我知道这仍然是一个老问题,但你可以看看。

如果对描述没有兴趣,请尽快更换代码:

function redirect_non_admin_user(){
    if ( !defined( 'DOING_AJAX' ) && !current_user_can('administrator') ){
        wp_redirect( site_url() );  exit;
    } 
}


add_action( 'admin_init', 'redirect_non_admin_user' );

说明: 出现此问题的原因是,某些已安装的插件会在非管理员用户尝试访问wp-admin(如http://localhost/project/wp-admin时将其重定向到主页或任何页面。所以这导致了问题。

因此,当您重定向非管理员访问管理员时,您可以使用以下代码。这也适用于前端的admin ajax调用。

答案 2 :(得分:0)

将条件更改为

!user_can($current_user->ID, 'administrator') && ( !user_can($current_user->ID, 'contributor') ) && !is_ajax()

添加!is_ajax()

答案 3 :(得分:0)

我遇到了完全相同的问题,这对我有用:

function mt_redirect_admin() {

if ( ! current_user_can( 'manage_options' ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
wp_redirect( site_url() ); 
exit;
}
}

add_action( 'admin_init', 'mt_redirect_admin', 1 );