WordPressの管理画面に独自の設定画面を追加する方法

PHP

WordPressで自作テーマを作っている人なんかは特に、テーマ独自の設定画面を管理画面に追加したいと考えると思います。
この記事ではそんな時に役立つ、管理画面に独自の設定画面を追加する方法を紹介します。

スポンサーリンク

functions.php

まずはadd_actionで管理画面の左側メニューに設定項目を追加してみましょう。
functions.phpに次のコードを貼り付けてみてください。

add_action('admin_menu', 'register_my_custom_menu_page');
function register_my_custom_menu_page(){
    add_menu_page(
        get_template().' 設定',
        get_template().' 設定',
        'manage_options',
        'theme-settings',
        'create_setting_page',
        'dashicons-admin-generic',
        30
    );
    add_submenu_page(
        'theme-settings',
        get_template().' プロフィール設定',
        'プロフィール',
        'manage_options',
        'theme-settings-profile',
        'create_profile_setting_page'
    );
    add_action('admin_init', 'save_my_settings');
    add_action('admin_init', 'save_my_profile_settings');
}

register_my_custom_menu_page関数の中にadd_menu_page関数とadd_submenu_page関数がありますが、違いは以下の図の通りです。

add_menu_pageはメインメニューを作る関数で、add_submenu_pageはサブメニューを作る関数という違いがあります。
今回は基本設定と、その下にプロフィール設定を追加しています。

get_template()と書いているところは、テーマ名が出力されます。

次に、以下のコードを追加します。

function save_my_settings(){
    register_setting('myoption-group', 'site-name');
}
function save_my_profile_settings(){
    register_setting('profile_option-group', 'profile-your_name');
    register_setting('profile_option-group', 'profile-your_details');
    register_setting('profile_option-group', 'profile-your_contact_page');
}

save_my_settingssave_my_profile_settingsは、
それぞれ最初のコード内にある、以下の部分と一致しなければいけません。
register_settingの説明はこの後にします。

    add_action('admin_init', 'save_my_settings');
    add_action('admin_init', 'save_my_profile_settings');

次に入力フォームの設定です。
次のコードは、基本設定の入力フォームと、プロフィール設定の入力フォームです。

create_setting_pagecreate_profile_setting_pageという関数名は、
add_menu_pageadd_submenu_pageの引数と一致しなければいけません。

settings_fieldsdo_settings_sectionsの引数は、
フォームが複数ある場合、重複しないようにしてください。

フォーム内の入力フィールドを増やす場合は、上記で紹介したregister_settingという記述を増やして、対応する名前を引数に与えます。register_settingは、フォームをsubmitした際に内容を保存する関数です。

function create_setting_page(){
?>
<div class="wrap">
    <h2><?php echo get_template(); ?> 基本設定</h2>
    <form method="post" action="options.php">
        <?php settings_fields('myoption-group'); ?>
        <?php do_settings_sections('myoption-group'); ?>
        <table class="form-table">
            <tr valign="top">
                <th scope="row">サイトカラー</th>
                <td>
                    <input type="text" name="site-name" value="<?php echo esc_attr(get_option('site-name')); ?>" size="50" />
                </td>
            </tr>
        </table>
        <?php submit_button(); ?>
    </form>
</div>
<?php
}
function create_profile_setting_page(){
?>
<div class="wrap">
    <h2>プロフィール 設定</h2>
    <form method="post" action="options.php">
        <?php settings_fields('profile_option-group'); ?>
        <?php do_settings_sections('profile_option-group'); ?>
        <table class="form-table">
            <tr valign="top">
                <th scope="row">名前</th>
                <td>
                    <input type="text" name="profile-your_name" value="<?php echo esc_attr(get_option('profile-your_name')); ?>" size="50" />
                </td>
            </tr>

            <tr valign="top">
                <th scope="row">プロフィール</th>
                <td>
                    <textarea name="profile-your_details" cols="70" rows="10"><?php echo esc_attr(get_option('profile-your_details')); ?></textarea>
                </td>
            </tr>

            <tr valign="top">
                <th scope="row">お問い合わせページのURL、<br />またはメールアドレス</th>
                <td>
                    <input type="text" name="profile-your_contact_page" value="<?php echo esc_attr(get_option('profile-your_contact_page')); ?>" size="50" />
                </td>
            </tr>
        </table>
        <?php submit_button(); ?>
    </form>
</div>
<?php
}
タイトルとURLをコピーしました