web-dev-qa-db-ja.com

Wpバックエンドにアクセスできない場合、ユーザーはフロントエンドに画像をアップロードできません。

私はユーザーに投稿を作成させ、 フロントエンド を使ってその投稿に画像をアップロード/添付させます。これはうまくいきます。しかし、私がこのようなコードスニペットでWordpressバックエンド(/ wp-admin /)へのアクセスを制限したとき

function wpse_11244_restrict_admin() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __('You are not allowed to access this part of the site') );
    }
}
add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

または(EDIT)とリダイレクトコード

function redirect_non_admin_users() {
    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' );

メディアアップロードが機能しなくなりました(「エラー」メッセージ)。この問題は 他で議論されています

私はその役割が[バックエンドへの]アクセス権を持っていなければ、フロントエンドでファイルをアップロードする能力を失うこともわかった。

フロントエンドに画像をアップロードする機能を失うことなく、ユーザーがバックエンドにアクセスするのを防ぐ方法はありますか?

ありがとうございました!

7
SPi

まず、なぜあなたが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を使用することをお勧めします。

1
J.D.

それを簡単にしておくと、私があなたが効果的に求めるのと同じことを達成するために使用する2つのプラグインがあります:

  1. WP管理者なし表示 https://wordpress.org/plugins/wp-admin-no-show/

  2. ログイン後にリダイレクト https://wordpress.org/plugins/redirect-after-login/

最初のオプションでは、複数のロールを選択して、それらがwp-adminにアクセスしようとしているときにそれらをリダイレクトすることができます。

お役に立てれば。

0
Chuck G