WordFes Nagoya 2015のセッションで取り上げるサンプルプラグインの解説です。

管理画面の登録

管理画面をまず作る処理です。add_options_pageを使います。このページへの実際の出力はコールバック関数で設定します。

Settings APIの場合、「ページ」「セクション」「フィールド」の順に作っていきます。

// 設定画面を追加する
function my_slider_settings_menu() {
    add_options_page(
        'スライダー詳細設定', // ページのタイトル
        'スライダー詳細設定', // メニューのタイトル
        'manage_options', // このページを操作する権限
        'my_slider_settings', // ページ名
        'my_slider_settings_plugin_options' // コールバック関数。この関数の実行結果が出力される
    );
}
add_action('admin_menu', 'my_slider_settings_menu');

// フォームの枠組を出力する
function my_slider_settings_plugin_options() {
?>
    <div class="wrap">
        <form action="options.php" method="post">
<?php do_settings_sections('my_slider_settings'); // ページ名 ?>
<?php settings_fields('my_slider_settings-group'); // グループ名 ?>
<?php submit_button(); ?>
        </form>
    </div>
<?php
}

do_settings_sectionsで設定セクションを作ります。 settings_fieldsは画面が正当であることを証明するコード等を出力します。つまり、settings_fieldsを入れるだけで、面倒な処理をWPが面倒見てくれます。

画面上にセクションを作成

次に、セクションを作ります。add_settings_sectionを使います。4番目の引数は、先ほどdo_settings_sectionsで設定したページ名に合わせます。

// 管理画面の作成
function my_slider_settings_init() {
    add_settings_section(
        'my_slider_settings_section', // セクション名
        'スライダーの設定', // タイトル
        'my_slider_settings_section_callback_function', // コールバック関数。この関数の実行結果が出力される
        'my_slider_settings' // このセクションを表示するページ名。do_settings_sectionsで設定
    );
}
add_action('admin_init', 'my_slider_settings_init');

function my_slider_settings_section_callback_function() {
    echo '<p>スライダーの詳細設定を行います</p>';
}

画面上にフィールドを作成

さて、ようやくフィールドを作ります。このフィールドのところが、入力項目を作る部分になります。 add_settings_fieldを使います。4番目の引数は、先ほどdo_settings_sectionsで設定したページ名に合わせます。5番目の引数は、先ほどadd_settings_sectionで設定したセクション名に合わせます。

入力項目の処理は、register_settingで設定します。1番目の引数は、先ほどsettings_fieldsで設定したグループ名に合わせます。 実際の処理内容は、3番目の引数でコールバック関数を指定します。

// フィールドの追加1
function my_slider_field1() {

    add_settings_field(
        'num_of_slides', // フィールド名
        '枚数', // タイトル
        'num_of_slides_callback_function', // コールバック関数。この関数の実行結果が出力される
        'my_slider_settings', // このフィールドを表示するページ名。do_settings_sectionsで設定
        'my_slider_settings_section' // このフィールドを表示するセクション名。add_settings_sectionで設定
    );

    register_setting(
        'my_slider_settings-group', // グループ名。settings_fieldsで設定
        'my_slider_settings_num_of_slides', // オプション名
        'my_slider_settings_num_of_slides_check' // 入力値をサニタイズする関数
    );
}
add_action('admin_init', 'my_slider_field1', 15);

// フォーム項目を表示する
function num_of_slides_callback_function() {
    echo '<input name="my_slider_settings_num_of_slides" id="my_slider_settings_num_of_slides" type="text" value="';
    form_option( 'my_slider_settings_num_of_slides' );
    echo '" />';
}

// 入力値「スライド枚数」を検証する
// 必要に応じてエラーメッセージを出す
function my_slider_settings_num_of_slides_check( $input ) {
    $filter_option = array(
        'options' => array(
            'min_range' => 1,
        ),
    );
    if ( filter_var( $input, FILTER_VALIDATE_INT, $filter_option) ) {
        return $input;
    } else {
        add_settings_error(
            'my_slider_settings',
            'invalid_num',
            '枚数: ' . intval( $filter_option['options']['min_range'] ) . ' 以上の数字を指定してください。',
            'error'
        );
        return intval( get_option( 'my_slider_settings_num_of_slides' ) );
    }
}

コールバック関数my_slider_settings_num_of_slides_checkの内部で、入力が適切かどうかをチェックします。この例では、PHPの標準機能であるフィルタ機能を使って、「入力が数値である&1以上である」をチェックしています。

入力が条件を満たさなかった場合

コールバック関数内で検証した結果、入力が条件を満たさなかった場合は、add_settings_errorでエラーメッセージを設定することができます。 こうしておくと、WPがエラーメッセージを表示してくれます。このようにWPの標準機能を使うと、画面遷移等の面倒な処理を自分で記述する必要はありません。

フィールドの数だけ繰り返す

複数のフィールドが有る場合は、add_settings_fieldとregister_settingを繰り返し記述してください。

(データベースで一つの項目として保存したい場合は、記述を変更する必要がありますが、今回はSettings APIの使い方の説明を中心にしたので、単純な方式で記述しています。)

// フィールドの追加2
function my_slider_field2() {

    add_settings_field(
        'random', // フィールド名
        'ランダム表示', // タイトル
        'random_callback_function', // コールバック関数。この関数の実行結果が出力される
        'my_slider_settings', // このフィールドを表示するページ名。do_settings_sectionsで設定
        'my_slider_settings_section' // このフィールドを表示するセクション名。add_settings_sectionで設定
    );

    register_setting(
        'my_slider_settings-group', // グループ名。settings_fieldsで設定
        'my_slider_settings_random', // オプション名
        'intval' // 入力値をサニタイズする関数
    );
}
add_action('admin_init', 'my_slider_field2', 25);

// フォーム項目を表示する
function random_callback_function() {
    echo '<input name="my_slider_settings_random" id="my_slider_settings_random" type="checkbox" value="1" ';
    checked( 1, get_option( 'my_slider_settings_random' ) ) ;
    echo ' />';
    echo 'ランダム表示する';
}

WordPress 管理画面を効率よく、安全に作成する方法 from Fumito Mizuno

記事公開日: 2015年08月27日
#

PHP技術者認定試験の初級~上級認定者が投票して認定するPHP... 詳細はこちら

#

WordPress4.2から4.3リリースにおける、フォーラムの常連回答... 詳細はこちら

#

WordPress5.2から導入されたリカバリーモードでは、「サイト... 詳細はこちら