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

Sin*_*eta 12 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
Run Code Online (Sandbox Code Playgroud)

编辑:问题是主题可能做什么来重定向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
Run Code Online (Sandbox Code Playgroud)

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

解决方案:非常感谢Ronald Huerecaadd_action( 'init'解决方案,这正是违规重定向挂钩的地方,以保护管理区域.现在我只需要在这里找到一个安全的解决方案,不会影响主题的管理区域,但也不会阻止其他插件允许用户发出匿名的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'));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 19

我在主题中发生了类似的事情.原始编码器试图阻止非管理员用户看到/ 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'
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

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

如果对解释不感兴趣,让我们更快地编写代码:

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' );
Run Code Online (Sandbox Code Playgroud)

解释:这个问题的原因是一些已安装的插件将非管理员用户重定向到主页或任何页面,当他们尝试访问 wp-admin 时,如http://localhost/project/wp-admin。所以这造成了问题。

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