WordPressでサイトを作る際にぜひやってみたい機能の1つが「会員制(登録制)サイト」の構築。会員専用のフォーラム(掲示板)を設置したり、会員しか見れないコンテンツを作ったり、会員しかダウンロードできないコンテンツを作ったりといろいろできることが広がりますね。
WordPressの4.6未満のバージョンではユーザー登録するにあたってフロントエンド(閲覧画面)に設置した登録フォームからユーザー登録すれば、ユーザー名とパスワードの入ったメールが送信されて登録完了!となっていましたが、4.6以降は一度メールを送信してパスワード変更画面にアクセスしてもらって更新することで登録が完了する「ダブルオプトイン」方式になりました。
これによっていわゆる捨てメールアドレスや架空のメールアドレスによる登録がしにくくなった一方で、バックエンドのログイン画面(厳密にはパスワード変更画面)へアクセスする必要が出てきました。そしてパスワード変更後は管理者が使うログイン画面が表示され、ログインするとユーザー編集画面が開くようになっているため、管理画面(バックエンド)へユーザーが間違って行ってしまわないための措置が必要になります。
何も対策をしていない場合、登録したユーザーへいきなりユーザー編集画面が表示されたらびっくりするでしょうし、故意にバックエンドへ入られてしまうと不都合が生じることがありますから、特定の権限以外のユーザーは絶対にバックエンドを表示しないという工夫が必要です。
措置としてはフロントエンドですべての作業を行ってもらうのが基本ですから
- 表示する権限のないユーザーは管理バーを非表示にする
- 表示する権限のないユーザーが管理画面の各ページを直接URL入力しても開かないようにする
- 表示する権限のないユーザーはログイン後にトップページへ飛ばす
ということが必要となります。
内容を簡単に説明すると、権限のないユーザーがログインしたときに3でトップページへ飛ばし、管理画面へ行けるようになる1を行います。そして、WordPressのファイル構造を理解している人がURLを直接入力しても管理画面その他へ行けないように2を設定します。
この機能を備えたプラグインとして
がありますが、もうこれ以上プラグインを増やしたくないという人も多いと思いますので、ここではテーマのfunctions.phpへ追記するだけで、プラグインが行っている機能を包括できるコードを3つ紹介します。
※テーマのfunctions.phpは重要なファイルなので、編集に失敗したり他のプラグインとの競合などにより不具合が生じたりして、最悪の場合画面が真っ白になって管理画面にも入れないという状況になることもありますから、編集を行う前にコードのチェックをしてくれるようになったWordPressのバージョン4.9以降に更新してから行うことをおすすめします
※同様の機能のプラグインを探すときは、WordPressのバージョン4.9に対応していることを確認した上で、導入後に必ずテストをすることをおすすめします
※当サイトでもこのコードを使っており正常に機能していますが、環境によっては動作しない場合や不具合が生じる場合もありますから、適用後はいろいろな権限で実際に登録や管理をしてみるなど必ずテストを行ってください。
表示する権限のないユーザーは管理バーを非表示にするコードと設定例
/******* 表示する権限のないユーザーは管理バーを非表示にする *******/
add_action( 'after_setup_theme', 'subscriber_hide_admin_bar' );
function subscriber_hide_admin_bar() {
$user = wp_get_current_user();
if ( isset( $user->data ) && !$user->has_cap( '「Capabilityを設定」' ) ) {
show_admin_bar( false );
}
}
許可される権限を限定するためのCapability例
権限レベルを判断するための機能を設定するための例です。コード内の「Capabilityを設定」という文字列を変更することで、実際に有効になる権限レベルを設定することができます
- 管理者だけ有効にする
‘switch_themes’ - 編集者・管理者だけ有効にする
‘edit_others_posts’ - 投稿者・編集者・管理者だけ有効にする
‘publish_posts’ - 寄稿者・投稿者・編集者・管理者だけ有効にする
‘edit_post’
表示する権限のないユーザーが管理画面のページを直接URL入力しても開かないようにするコードと設定例
/******* 表示する権限のないユーザーが管理画面のページを直接URL入力しても開かないようにする *******/
add_action( 'auth_redirect', 'subscriber_go_to_home' );
function subscriber_go_to_home( $user_id ) {
$user = get_userdata( $user_id );
if ( !$user->has_cap( '「Capabilityを設定」' ) ) {
wp_redirect( get_home_url() );
exit();
}
}
- 管理者だけ有効にする
‘switch_themes’ - 編集者・管理者だけ有効にする
‘edit_others_posts’ - 投稿者・編集者・管理者だけ有効にする
‘publish_posts’ - 寄稿者・投稿者・編集者・管理者だけ有効にする
‘edit_post’
表示する権限のないユーザーはログイン後にトップページへ飛ばすためのコードと設定例
/******* 管理者権限以外はログイン後にトップページへ飛ばす *******/
add_action( 'admin_init', 'disable_admin_pages' );
function disable_admin_pages() {
if(!current_user_can('「権限名を設定」')){
$redirect_url = get_option('home');
header("Location: ".$redirect_url);
exit;
}
}
許可される権限を限定するための権限名
- 管理者
admimistrator - 編集者・管理者
editor - 投稿者・編集者・管理者
author - 寄稿者・投稿者・編集者・管理者
contributor
参考にさせていただいたサイト
今回の記事は以下の2つのページを参考にさせていただき、簡単にカスタマイズできるように再編集させていただきました
【WordPress】管理者以外のユーザーが管理画面にアクセスしたらリダイレクトさせる方法
2018年1月20日「WordPress Popular Posts」の動作で不具合
このコードで実装したところ、私の環境では「WordPress Popular Posts」のアクセス数計測がストップしてしまいました。他のプラグインとの兼ね合いや環境などによるとは思いますが、「WordPress Popular Posts」だけに限らず導入後はチェックすることをおすすめします