SO网友:J.D.
首先,重要的是要考虑为什么要限制访问wp-admin
. 如果您这样做主要是为了美观,那么下面提供的解决方案就可以了。但是,如果您这样做是因为不希望用户能够执行通过后端提供的某些功能,那么您应该改用WordPress的内置角色和功能API。为您的用户提供一个角色,该角色仅具有您希望他们拥有的功能。否则,授予对Ajax操作的访问权可能会允许他们执行您试图阻止他们执行的操作。
这就引出了你问题的原因。Ajax参与上传图像,以及Ajax处理程序(wp-admin/admin-ajax.php
) 从技术上讲是后端的,即使从前端调用也是如此。所以你的代码\'admin_init\'
正在触发。您需要做的是检查该函数中的请求是否是Ajax请求,如果不是,则仅退出/重定向。从WP 4.7开始,您现在可以使用wp_doing_ajax()
函数。
function redirect_non_admin_users() {
if ( wp_doing_ajax() ) {
return; // Don\'t block Ajax requests.
}
if ( ! current_user_can( \'manage_options\' ) && \'/wp-admin/admin-ajax.php\' != $_SERVER[\'PHP_SELF\'] ) {
wp_redirect( home_url() );
exit;
}
}
add_action( \'admin_init\', \'redirect_non_admin_users\' );
如果您只想允许用户访问上载附件,您可以将条件更改为:
if ( wp_doing_ajax() && isset( $_POST[\'action\'] ) && \'upload-attachment\' === $_POST[\'action\'] ) {
return; // Don\'t block attachment upload requests.
}
然而,请注意,许多插件也提供自己的Ajax操作,在这种情况下,这些操作将被阻止。因此,如上所述,您最好使用角色和功能API。