WordPressのネットワーク管理画面内のテーマアップロード機能を有償オプション化する
テーマアップロード機能とは
WordPressのマルチサイトで各ブログサイトに対してテーマアップロード機能を有償オプションとして提供したい。
テーマアップロード機能は標準で備わっている機能になっていて、ネットワーク管理画面の以下の部分で操作することが可能になっている。
画像の画面から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
でフックすることができる。上のコードによりオプション契約をしていないユーザーに対しては画像のようなメッセージを表示するようにした。
テーマアップロードのページのみを条件に基づいてアクセス制限することができた。