経緯

WordPressを使ってWebサイトなどを構築していると、設定で管理すべき部分が出てくると思います。

例えば、企業のWebページとかだと、所在地や電話番号などはアクセスのページにあったり、footerにあったり。

こういう情報はカスタムフィールドなんかで登録するより、設定で管理したほうが自然です。独自の設定の作り方について。

作り方

設定項目の追加

まずは、functions.phpがごちゃごちゃするのは嫌なので、ファイルを新しくつくりましょう。
ここではcompany_setting.phpという名前にしておきます。

<?php
// メニューに会社情報管理を追加
add_action('admin_menu', 'company_settings_menu');

function company_settings_menu() {
  // 第1引数: タイトル
  // 第2引数: 表示名
  // 第3引数: 管理権限(普通はmanage_optionsでいいと思います)
  // 第4引数: ページのid
  // 第5引数: 読みだすViewを記述する関数名
  add_options_page('会社情報管理', '会社情報管理', 'manage_options', 'company_settings', 'company_settings_page');
}

// フィールドの作成
add_action( 'admin_init', 'register_company_settings' );

function register_company_settings() {
  $my_options = ['name', 'tel', 'email', 'postal_code', 'address', 'business_time'];
  foreach($my_options as $my_option){
    register_setting( 'company_settings', 'company_'.$my_option );
  }
}

// Viewの設定
function company_settings_page() {
  include 'views/company_setting.php';
}

Viewの作成

company_settings_pageで指定したファイルを作り、Viewを記述しましょう。

<div class="wrap">
  <h2>会社情報設定</h2>

  // actionは必ずoption.phpにする
  <form method="post" action="options.php">

    // この2行でどの設定かを指定する
    <?php settings_fields( 'company_settings' ); ?>
    <?php do_settings_sections( 'company_settings' ); ?>

    // ここからシコシコとフィールドを作る。
    // tableにform-tableというクラスをつけて以下のようなテーブル構造にすると、
    // 他の設定画面と同様の表示になる
    <table class="form-table">
      <tbody>
        <tr>
          <th scope="row">
            <label for="company_name">会社名</label>
          </th>
          <td><input type="text" id="company_name" class="regular-text" name="company_name" value="<?= get_option('company_name'); ?>"></td>
        </tr>
        <tr>
          <th scope="row">
            <label for="company_tel">電話番号</label>
          </th>
          <td><input type="text" id="company_tel" class="regular-text" name="company_tel" value="<?= get_option('company_tel'); ?>"></td>
        </tr>
        <tr>
          <th scope="row">
            <label for="company_tel">メールアドレス</label>
          </th>
          <td><input type="text" id="company_email" class="regular-text" name="company_email" value="<?= get_option('company_email'); ?>"></td>
        </tr>
        <tr>
          <th scope="row">
            <label for="company_postal_code">会社所在地の郵便番号</label>
          </th>
          <td><input type="text" id="company_postal_code" class="regular-text" name="company_postal_code" value="<?= get_option('company_postal_code'); ?>"></td>
        </tr>
        <tr>
          <th scope="row">
            <label for="company_address">会社所在地</label>
          </th>
          <td><input type="text" id="company_address" class="regular-text" name="company_address" value="<?= get_option('company_address'); ?>"></td>
        </tr>
        <tr>
          <th scope="row">
            <label for="company_business_time">営業時間</label>
          </th>
          <td><input type="text" id="company_business_time" class="regular-text" name="company_business_time" value="<?= get_option('company_business_time'); ?>"></td>
        </tr>
      </tbody>
    </table>
    <?php submit_button(); ?>
  </form>
</div>

これでおしまいです。

functions.php内で読み込む

ここまで来たら、ほぼ完成です。

あとはfunctions.php内でinclude 'company_setting.php'と書いてやるだけで、管理画面の設定の項目の中に「会社情報設定」があると思います。

まとめ

ページ全体で使う基本情報みたいなものは設定を新しく作って管理しましょう!