我有一个网站,要求用户有一个帐户才能使用它。我不希望某些用户角色有权访问wp admin。所有帐户更改都应在前端帐户管理模板上进行。如果用户试图访问wp admin,我想将其重定向回站点主页。
function redirect_user(){
//...some code...
//Have tried:
//if(empty(DOING_AJAX) && $users_role ==\'somerandomrole\') //this works on frontend but allows access to wp-admin
//if(is_admin() && $users_role ==\'somerandomrole\') //stops access to wp-admin but then frontend stops working
if((is_admin() || !empty(DOING_AJAX)) && $users_role ==\'somerandomrole\')
{
wp_safe_redirect(home_url());
exit;
}
}
add_action(\'admin_init\', \'redirect_user\');
我遇到的问题是,我们的站点有一些动态组件,例如通过管理ajax发出请求的搜索工具。php,但由于逻辑原因,会重定向请求(即没有搜索结果)。有没有办法做到这一点?
Edit:好吧,有一种解决方案似乎确实可行,但感觉不太对劲,那就是:
if($_SERVER[\'PHP_SELF\'] != \'/wp-admin/admin-ajax.php\' && $users_role ==\'somerandomrole\'){
//...code...
}
这样做是否有不良副作用?
SO网友:cybmeta
你不需要检查is_admin
因为函数连接到admin_init
, 所以is_admin()
始终是true
在回调中;这就是原因( is_admin() || !empty(DOING_AJAX) )
始终验证为true
. 您只需检查常量DOING_AJAX
未定义,或者如果已定义false
(这两种情况都不是AJAX请求),结合用户角色。例如,只允许AJAX和访问administrator
角色:
add_action( \'admin_init\', \'redirect_user\' );
function redirect_user() {
$user = wp_get_current_user();
if( ( !defined(\'DOING_AJAX\') || ! DOING_AJAX ) && ( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) ) {
wp_safe_redirect(home_url());
exit;
}
}
此外,您可以考虑检查功能而不是角色。例如:
add_action( \'admin_init\', \'redirect_user\' );
function redirect_user() {
if( ( !defined(\'DOING_AJAX\') || ! DOING_AJAX ) && ( ! current_user_can(\'manage_options\') ) ) {
wp_safe_redirect(home_url());
exit;
}
}