WordPressプラグイン設定の追加

WordPressプラグイン設定の追加 制作ブログ

利用価値のあるプラグインを作ると、シンプルな機能を追求したプラグインを作る場合を除き、ユーザーが細かい設定をできるようにする設定画面が必要になってくる事が多いと思います。
簡単な設定画面の表示方法から、その設定データの扱われ方を解説します。

まずは設定メニューを追加

今回はWordPressの[設定]メニュー配下に追加するので、[admin_menu]にフックして[add_options_page]でメニューを追加。
他にも、テーマ配下ならadd_theme_page()、メディア配下ならadd_media_page()、トップレベルに追加するならadd_menu_page()、その配下ならadd_submenu_page()など、好きな所に作れます。

▼例)下記内容をプラグインphpに追加。

add_action('admin_menu',function() {
  add_options_page(
    'Success Base',//メニュー上の名前(プラグイン名がわかりやすい)
    'Success Base 設定',//メニュー上の名前
    'administrator',//capability(必要権限)
    'success-base',//スラッグ
    'success_base_option'//function
  );
});

function success_base_option() {
  echo <<<EOF
<div class="wrap">
<h2>Success Base 設定画面</h2>
</div>
EOF;
}

参考 設定画面が複雑で外部phpにする場合などは▼下記のように外部化するのをオススメします。

function success_base_option() {
  require_once 'base_option.php';
}

ここまでで、何も設定できない設定画面を呼び出すところまで確認できるかと思います。

設定データの保存先を決める

プラグインの設定データは基本的にWordPressのoption値として保存する事が多いです。
今回もoption値として設定データを保管する例を紹介します。

他の保存方法としては、ファイルやデータベースに保管するなど、基本的に制限はありません。

wp_options

WordPressのデータベースのoption値として保存する事ができますが、同じデータ名の重複ができないため、単純な変数名にすると他のプラグインと干渉してしまう事があります。
逆に考えると設定値を参照して他のプラグインと軽い連携をする事もできます。

想定しうる流れとしては、、、

>プラグインインストール時もしくは有効時にget_option()で存在チェック
>add_option()でoption値を生成し、設定ページでは変更フォームを作成し
>さらに受け取り用のphpでPOSTされた内容をupdate_option()で保存する
>データが大きくなる可能性のあるものなら残骸を残さないように、無効化時もしくはアンインストール時に削除するなどの配慮も必要かもしれません。

ですが、プラグインやテーマの設定用にregister_setting() や settings_fields() といった便利なフックを用意してあります。

register_setting

まずはregister_setting(グループ名,オプション名[,サニタイズ等コールバック])で変数の登録。

add_action('admin_init', function(){
    register_setting('success-base-group', 'access_notify_flag');
});

後述するoption.php内で使われるのでそれよりも早く呼び出されるadmin_initでフックするのが基本です。

設定変更用フォーム作成

先程のfunction success_base_optionを書き換え、設定画面内にフォームを追加していきます。

▼まずはコードを見てください。

function success_base_option() {
  $access_notify_flag_ck = get_option('access_notify_flag') ? ' checked': '';
  ?>
<div class="wrap">
<h2>Success Base 設定画面</h2>
<form method="post" action="options.php">
  <?php settings_fields('success-base-group'); ?>
  <input type="checkbox" name="access_notify_flag" id="access_notify_flag" value="1"<?php echo $access_notify_flag_ck ?>>送信する<br>
  <?php submit_button(); ?>
</form>
</div>
<?php
}

チェックボックス型の設定データなので
form内にsettings_fields(グループ名)で出力したhidden内容をoption.phpに同時ポストするのが基本的な使い方です。
あとはregister_settingで登録されている内容にそってoption.phpが処理してから保存結果付きで設定画面に戻ってきます。

さいごに

今回のプラグイン設定の方法は、あくまで簡易設定用の場合の例です。
管理ページレベルのデータも多く業務上入力を頻繁に行うものはデータベースの方が最善だったりします。