私はそれを使用するためのアカウントを持っていることをユーザーに要求するサイトを持っています。特定のユーザーロールに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');
私が抱えている問題は、admin-ajax.phpを介してリクエストを行うが、ロジックのためにリクエストをリダイレクトする検索ツールなど、私たちのサイトには動的なコンポーネントがあることです(つまり検索結果がない)。これを機能させる方法はありますか?
編集: Ok正しいとは思われないがうまくいくように思われる解決策の1つは次のとおりです。
if($_SERVER['PHP_SELF'] != '/wp-admin/admin-ajax.php' && $users_role =='somerandomrole'){
//...code...
}
このようにすることに悪い副作用がありますか?
関数はis_admin
にフックされているので、admin_init
をチェックする必要はありません。そのため、コールバックではis_admin()
は常にtrue
です。そのため( is_admin() || !empty(DOING_AJAX) )
は常にtrue
として検証されます。ユーザーロールと組み合わせて、定数DOING_AJAX
が定義されていないか、定義されていてfalse
(どちらの場合もAJAX requestではない)かどうかを確認するだけで済みます。たとえば、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;
}
}