ネットワーク設定画面内のページを条件によってアクセス制限する

WordPressのネットワーク管理画面内のテーマアップロード機能を有償オプション化する

テーマアップロード機能とは

WordPressのマルチサイトで各ブログサイトに対してテーマアップロード機能を有償オプションとして提供したい。

テーマアップロード機能は標準で備わっている機能になっていて、ネットワーク管理画面の以下の部分で操作することが可能になっている。

theme-upload

画像の画面からwebで公開されているテーマだけでなく、ユーザーが自由に作成したテーマをアップロードすることができる。

URLだと、

http://blog.local/wp-admin/network/theme-install.php?tab=upload

というページが該当する。このページに対するアクセスを有償オプションに契約していないブログ(ユーザー)については、オプション契約が必要であるメッセージを表示してアップロード機能を提供しないというのが要件になる。

ネットワーク管理画面にアクセスできるのは特権管理者だけではないのか

オプション契約以前に、WordPressマルチサイトの管理画面には特権管理者しかアクセスできないはずである。しかし、

MultisiteレベルのOptions APIでwordpressの特権管理者を追加する方法

上の記事で書いたように、一時的に特権管理者権限を付与することで各ブログの管理者がネットワーク管理画面にアクセス可能な状態になっていることを前提にしている。

各ブログの管理者がネットワーク管理画面にアクセスするようにカスタマイズしているものの、その中で操作できる機能は一部制限をかけたいという要件になり、テーマのアップロード機能が本エントリーで制限する機能ということになる。

install_themes_pre_{$tab}アクションフック

テーマアップロード機能を提供する画面のアクセス制御のためにアクションフックを利用する。WordPressマルチサイトの管理画面においてもアクションフックは豊富に設定されている。今回は、

wp-admin/theme-install.php

というファイル内から、

install_themes_pre_{$tab}

というアクションフックを利用することにした。このフックは、

/wp-admin/network/theme-install.php

というURLを含むアクセス全般で利用することができるフックで、フック名として$_GET['tab']の値を指定することで、該当するページのHTML出力前に処理を追加することができるアクションフックになっている。今回制御しようとしているページは上にも書いたように、

http://blog.local/wp-admin/network/theme-install.php?tab=upload

になる。$_GET['tab']が、

upload

なので、指定するアクションは、

install_themes_pre_upload

となる。具体的な指定方法は以下のようにした。

add_action('install_themes_pre_upload', array($this, 'check_plan_flag'));

アクションにcheck_plan_flagという独自関数を関連付けている。この関数内で、ブログサイトが有償オプション契約済みか確認し、未契約の場合には、エラーメッセージを表示する。その処理が以下のコードになる。

function check_plan_flag()
{
        // ネットワーク管理画面でブログサイトのURLを特定するためにユーザー情報を得る
	global $current_user;
	get_currentuserinfo();
	$user_info = get_userdata($current_user->ID); // $user_info->primary_blogでブログIDを特定
	
//delete_blog_option($user_info->primary_blog, 'upgrade_status');
	
	if( !get_blog_option($user_info->primary_blog, 'upgrade_status') ) // 有償契約オプションの確認
	{
                // network_admin_noticesにフックすることでエラーメッセージを表示する
		add_action( 'network_admin_notices', array($this, 'get_upgrade_notice') );
	}
}

function get_upgrade_notice()
{
    ?>
	<div class="wrap">
	    <h2><?php _e( 'Theme Install' ); ?></h2>
	    <div class="updated">
	        <p><?php _e( 'If you want upload your custom theme, you need Upgrade option.', 'my-text-domain' ); ?></p>
	    </div>
	</div>
    <?php
    exit();
}

ネットワーク管理画面はルートドメインでアクセスする

各ブログの管理画面では、WordPressの

  • blog_id
  • ドメイン名

といったデータを起点に処理を制御することができるが、ネットワーク管理画面は基本的に特権管理者が利用する管理画面なので、各ブログ固有の情報ではなく、ユーザープロファイルで処理を制御する必要がある。そのため、上のコードの冒頭でユーザデータを取得し、ユーザープロファイルからブログのIDを取得するという処理を行っている。

また、ブログサイトのwp_optionsテーブルにアクセスするためにget_optionではなく、

get_blog_option

を利用している。上にも書いたようにネットワーク管理画面はルートドメインでアクセスすることになるため、get_optionで操作しようとするとルートドメインのwp_optionsに対して操作することになってしまう。各ブログサイトのwp_optionsを操作するためには、

get_blog_option($user_info->primary_blog, 'upgrade_status')

という方法で有償オプション契約を確認している。

network_admin_noticesでカスタマイズしたエラーメッセージを表示

有償オプション契約をしていないユーザーに対してはエラーメッセージを表示する。そのためのアクションフックがadmin_noticesになる。

  • ブログの管理画面ではadmin_notices
  • ネットワーク管理画面ではnetwork_admin_notices

でフックすることができる。上のコードによりオプション契約をしていないユーザーに対しては画像のようなメッセージを表示するようにした。

network-admin-notices

テーマアップロードのページのみを条件に基づいてアクセス制限することができた。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ネットワーク設定画面内のページを条件によってアクセス制限するの記事にコメントを投稿