menu
書いてる野郎
orebike@gmail.com
サイトを作っていると、開発環境と本番環境の違い等を吸収するための設定を書いておきたくなる場合がある。 そのような場合に独自の設定画面を作りたくなる。
の作り方。
まず、設定画面へのリンクを追加する。
使っているテーマ中の functions.php に書き込んで拡張する。
このように書く
<?php // ...... function register_ore_custom_menu_page(){ add_menu_page( '俺設定', '俺設定', 'manage_options', 'custompage', 'ore_custom_menu_page', '', 6 ); }
この記述により、サイドメニュー「投稿」の下あたりに独自設定画面へのリンクが追加される。
manage_options
というのはそのユーザーの権限を表している。
大体、こういうことやるときは最強権限で運用すると思うのであんまり関係ない。
コード中の ore_custom_menu_page
という記述はこの画面本体を描画するための PHP の関数を指す。
これはこのように書く
長々と書いているが、WordPress 特有の何かはデータベース操作のメソッドだけで、後は原始時代レベルの PHP コード。
<?php // ...... function ore_custom_menu_page(){ // 権限確認 if (!current_user_can('manage_options')){ wp_die( __('You do not have sufficient permissions to access this page.') ); } // 原始時代コードだから、POST と GET、保存と表示を区別してない // そのためそれを区別するための印を格納する変数 $hidden_field_name = 'ore_opt_hidden'; // 設定値の定義 // キーに内部で使う名前をいれて、値に画面表示で使う名前を入れる。 // 別になんでもいいわけだが、この値は被るとまずいのでかぶらないように長い名前をつける // 長い名前をつけると後の記述が面倒になるのでここにまとめているだけ // 頑張って全部書いてもいい $options = array( 'ore_option_1' => '俺の設定1', 'ore_option_2' => '俺の設定2' ); // 現状データベースに格納されている設定値そのものを取ってくる。 // $$ の記述はその変数の中身の文字列を変数名にするという PHP のあまりよくない機能を使っている foreach($options as $k => $v){ $$k = get_option($k); } // ユーザーが何か情報を POST したかどうかを確認 // POST していれば、隠しフィールドに 'Y' が設定されている // WordPress だからといって何かしてくれるわけじゃない。 // 普通にスーパーグローバル変数からパラメータ値を取得する // ここでは POST されたか否かを判定している if(isset($_POST[ $hidden_field_name]) && $_POST[$hidden_field_name] == 'Y'){ foreach($options as $k => $v){ // POST されてたら対象の変数で更新する $$k = $_POST[$k]; update_option($k, $$k); } // 画面に「設定は保存されました」メッセージを表示 ?> <div>保存したよ</div> <?php } // ここからは GET でも POST でも表示される内容を書いている ?> <h2>俺設定</h2> <!-- name はなんでもよい --> <!-- action は自身にPOSTするので設定しなくてよい --> <form name="form1" method="POST" action=""> <!-- ここで送信する隠しパラメータで POST と GET を区別する --> <input type="hidden" name="<?= $hidden_field_name ?>" value="Y"> <!-- 入力フォームを構築する --> <?php foreach($options as $k => $v): ?> <?= $v ?> <input type="text" name="<?= $k ?>" value="<?= $$k ?>" /><br /> <?php endforeach; ?> <!-- 送信ボタン --> <button type="submit">保存</button> </form> <?php } // 最後に作った関数をメニュー構築タイミングで動くようにフックする add_action('admin_menu', 'register_ore_custom_menu_page' );
これで完成し、画面から設定を行うと設定値が Wordpress のデータベースに保存される。どこかは知らん。
いろんな意味で最低レベルな実装だが、サンプルで説明のためにやっているのではなく、WordPress のコードでは本番レベルこうするのである。