web-dev-qa-db-ja.com

Wp-adminへのアクセスを許可しないで、フロントエンドでadmin-ajax要求を満たしたことを許可しますか?

私はそれを使用するためのアカウントを持っていることをユーザーに要求するサイトを持っています。特定のユーザーロールに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...
}

このようにすることに悪い副作用がありますか?

2
Shawn

関数は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;
    }

}
2
cybmeta