システム開発・構築の神様

新しいサービスや技術を使った開発や構築。その他不具合解決など

Woocommerceをインストールしたサイトでは、権限グループの購読者ではログインできなくなる

購読者をベースにした、権限をUser Role Editorプラグインで作成し、必要な機能のみ許可して利用を考えていました。例えば、売上レポートのみ確認できるユーザーや、クーポンの発行のみ行えるユーザーなど、最小限の機能のみが利用できるユーザーを作成しました。

想定では、ダッシュボードとプロフィール、そして許可した機能のみが表示される管理画面にアクセスできるはずなのですが、何度ユーザー名とパスワードを入力しても、TOPページに遷移するだけです。

直接ダッシュボードのURLを指定しても、やはりTOPページに戻されてしまいます。はじめは、ログインに必要な権限が付与されていないためにエラーになっているのだと思っておりましたが、いろいろな権限を付与してもやはり管理画面にアクセスすることができません。

functions.phpの内容に誤りがあるのか?そう思い、一時的にコードを削除しても同じ結果になりました。

今度はひとつひとつプラグインを停止して確認すると・・・Woocommerceプラグインが原因だと分かりました。

なぜ?

Woocommerceプラグインのソースコードを調べてみると、原因が分かりました。

function wc_disable_admin_bar( $show_admin_bar ) {
	if ( apply_filters( 'woocommerce_disable_admin_bar', true ) && ! ( current_user_can( 'edit_posts' ) || current_user_can( 'manage_woocommerce' ) ) ) {
		$show_admin_bar = false;
	}
	return $show_admin_bar;
}
add_filter( 'show_admin_bar', 'wc_disable_admin_bar', 10, 1 ); // phpcs:ignore WordPress.VIP.AdminBarRemoval.RemovalDetected

Woocommerce側でadmin_barの表示設定がされています。主にedit_posts権限が無いと、admin_barが非表示になります。

	/**
	 * Prevent any user who cannot 'edit_posts' (subscribers, customers etc) from accessing admin.
	 */
	public function prevent_admin_access() {

		$prevent_access = false;

		if ( apply_filters( 'woocommerce_disable_admin_bar', true ) && ! is_ajax() && isset( $_SERVER['SCRIPT_FILENAME'] ) && basename( sanitize_text_field( wp_unslash( $_SERVER['SCRIPT_FILENAME'] ) ) ) !== 'admin-post.php' ) {
			$has_cap     = false;
			$access_caps = array( 'edit_posts', 'manage_woocommerce', 'view_admin_dashboard' );
			foreach ( $access_caps as $access_cap ) {
				if ( current_user_can( $access_cap ) ) {
					$has_cap = true;
					break;
				}
			}
			if ( ! $has_cap ) {
				$prevent_access = true;
			}
		}

		if ( apply_filters( 'woocommerce_prevent_admin_access', $prevent_access ) ) {
			wp_safe_redirect( wc_get_page_permalink( 'myaccount' ) );
			exit;
		}
	}

同じ用に管理画面へのアクセスも制限されています。

Woocommerceをインストールすると、どうやらedit_postsの権限が無いと管理画面にアクセスすることができないことが分かりました。edit_postsを付与してやれば解決しそうです。ただ、edit_postsを許可すると、管理画面に投稿メニューが表示されたりするので、できれば不要な機能は追加したくない・・・

いろいろと試して悩んだのですが・・・

簡単な解決方法がコード上になっていました・・・

権限に「view_admin_dashboard」を追加してやれば、問題が解決しました。view_admin_dashboard?テスト用でしょうか?

とりあえず、view_admin_dashboard権限を付与すると、管理画面にログインできました

数時間、悩んでしまった時間を返して欲しいところです。

関連記事