マルチサイトにおける退会機能
wordpressに退会機能がない
インターネットwebサービスを構築することを前提に、wordpressのマルチサイト機能を利用している。自分がネットワーク管理者(super admin)となり、新規ブログ登録者が管理者(administrator)としてブログ運営を行う第三者向けのことである。
本エントリーで対象とするのは、各ブログ管理者の退会処理のことを指す。各ブログでユーザー登録を可能としている場合、各ブログ内での退会が必要になることもあるかもしれない。その場合には、Never Let Me Goというwordpressプラグインが有効かもしれない。シングルサイト構成における退会処理を検討している場合には、こちらのプラグインを設定してみることをおすすめする。
簡単な退会機能の概要
マルチサイト環境下で簡単に退会処理を受け付けるために、サイト毎に状態を持たせるのが有効。
状態 → statusというデータをsite_statusとして、wordpressのデータベースに格納しておけばその値をフラグとしてサイト毎に異なる処理を行うことができる。フラグの保存場所は、wp_optionsが利用できる。マルチサイト環境下では、データベーステーブルをサイト毎に分けて管理している。ブログの新規セットアップ時に、必要なテーブルを新しく作成しており、その過程でwp_optionsテーブルも新規に作られる。
具体的には、
wp_2_options
wp_3_options
wp_4_options
という感じでサイトが追加されるごとにテーブルが増えていく。このテーブルにsite_statusというシステム固有の値を持たせ、退会を行ったサイトについてはフラグを持たせておき、リクエストの際にフラグの値を参照し、フラグが立っていれば404エラーを返すという方法。
退会ページ
site_statusという開発者固有のデータをwp_optionsに格納するための安全な方法がwordpressには存在する。
update_optionでサイトの初期値をカスタマイズで触れたOptions APIを利用して固有のデータを格納する。が、そのデータを格納するためのアクションが必要となり、今回の場合は、管理画面の退会フォームから行うことになる。そのあたりのコードは以下のようになる。
$init = new Init; class Init { function __construct() { // 管理画面に退会処理を行うページを追加 add_action('admin_menu', array($this, 'seeyou_page')); } function seeyou_page() { add_options_page('Test Options', '退会処理', 8, 'seeyou', array($this, 'mt_options_page')); } function mt_options_page() { // 退会処理を行うページの内容と処理 $opt_name = 'site_status'; $hidden_field_name = 'mt_submit_hidden'; $data_field_name = 'site_status'; if( $_POST[ $hidden_field_name ] == 'Y' ) { $opt_val = $_POST[ $data_field_name ]; update_option( $opt_name, $opt_val ); ?> <div class="updated"><p><strong><?php _e('退会処理が完了しました', 'mt_trans_domain' ); ?></strong></p></div> <?php } echo '<div class="wrap">'; echo "<h2>" . __( '退会処理', 'mt_trans_domain' ) . "</h2>"; ?> <form name="form1" method="post" action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>"> <input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y"> <input type="hidden" name="<?php echo $data_field_name; ?>" value="1"> <p class="submit"> <input type="submit" name="Submit" value="<?php _e('退会する', 'mt_trans_domain' ) ?>" /> </p> </form> </div> <?php } }
上のコードで、
- 退会処理管理メニューの追加
- 退会ボタンを押した時の処理
が実装される。退会ボタンは管理メニューの設定配下にサブメニューとして追加され、ボタンを押すとwordpressデータベースにフラグが立つ。なお、上のコードはテーマ内のfunctions.phpではなくプラグインとして記述されているコードになっている。
参考
サイトの状態を常時確認
wp_options内にsite_statusというフラグ値を格納することができたので、このフラグを活用して退会処理が行われたサイトとその管理画面へのアクセスには404エラーを返すようする。
add_action('init', array($this, 'site_status_check'));
上のコードをconstruct内に追記して、site_status_checkという関数を呼び出す。そのsite_status_checkは以下のとおり
function site_status_check() { //delete_option( 'site_status' ); $opt_name = 'site_status'; $opt_val = get_option( $opt_name ); if( $opt_val ) { header("HTTP/1.1 404 Not Found"); include(get_query_template('404')); exit(); } }
site_statusというキーでフラグを抽出し、値が真であればHTTP 404エラーを返している。
冒頭のコメントアウトされた部分は開発時に利用する部分で、フラグを立てて元に戻す場合に利用する。delete_optionを使わずに手動で直接データベースを削除しても内部のキャッシュが削除されず、$opt_valが真を返し続けるので注意したい。
delete_optionを利用すればwordpressのデータベースを安全に更新できるので、options apiを利用する場合にはおぼえておきたい。
まとめ
wp_optionsは開発者が任意にデータをセットできるテーブルとして活用できるとされている。サイトの状態を保持しサイト単位で異なる処理を行うときにおぼえておきたいノウハウである。
アカウントの削除、退会を希望します。