管理メニュー

PHP

【WordPress】管理メニューの『設定』の既存サブページに項目を追加する方法

更新日:2023/02/02

WordPress管理画面に設定メニューがあります。このメニューにはいくつかの子メニュー(サブメニュー)があります。
今回は、このサブメニューに項目を追加する方法をお伝えします。

 

『設定』のサブページに項目を追加

次の図のように、管理画面の設定のサブページに項目を追加します。

一般設定に項目追加

設定の各サブページは入力項目タグがphpファイル内でベタ打ちされているため、任意の位置に独自項目を挿入できません。
そのため、最終行に追加する形になります。

 

項目の追加方法の概要

サブページへの項目追加は、add_settings_field()とregister_setting()を使用します。

サブページへ項目追加するコード例

add_action( 'admin_init', function () {
  add_settings_field( 'test_option_item', 'テスト', 'display_test_option_item', 'general' );
  register_setting( 'general', 'test_option_item' );
} );
function display_test_option_item(){
	$option_value = get_option( 'test_option_item' ,'');
	?>
    <input name="test_option_item" id="test_option_item" type="text" value="<?= esc_attr( $option_value ); ?>" class="regular-text">
  <?php
}

add_settings_field()

add_settings_field()は、追加項目の画面表示についての設定関数です。

add_settings_fieldの構文

function add_settings_field( $id, $title, $callback, $page, $section = 'default', $args = array() )
  • $id: オプション名
  • $title: 入力欄のタイトル
  • $callback: input等の入力タグをechoする関数
    6番目の引数$argを、引数として受け取ります。
  • $page: ページID(確認方法)
  • $section: セクションID
    セクション毎にセクションタイトルとテーブルタグが出力されます。
    規定値の'default'と異なるセクションを追加するには、add_settings_section()を呼び出す必要があります。
  • $args: $callback関数に渡す引数
    任意のキーを指定できますが、次のキーは意味を持ちます。
    'class'=>trタグのクラス
    'label_for'=>キー存在時labelタグ出力およびfor属性の値

この情報をもとにtableタグ内に、次のようなタグが出力されます。

<tr *1><th scope="row">{$title}*2</th><td>$callback($arg)</td></tr>

*1:$args['class']が存在するとき、 class="{$args['class']}"が出力される
*2:$args['label_for']が存在するとき、<label for="{$args['label_for']}">{$title}</label>が出力される

register_setting()

設定ページはデータベースに登録可能なオプション名を制限しています。
register_setting()を呼び出すことで、独自項目を登録可能にできます。

また、受け取った値を検証する関数を登録できます。

register_settingの構文

function register_setting( $option_group, $option_name, $args = array() ) 
  • $option_group: ページID(確認方法)
  • $option_name: オプション名
  • $args: input等の入力タグをechoする関数
    6番目の引数$argを、引数として受け取ります。

この情報をもとにtableタグ内に、次のようなタグが出力されます。

<tr *1><th scope="row">{$title}*2</th><td>$callback($arg)</td></tr>

*1:$args['class']が存在するとき、 class="{$args['class']}"が出力される
*2:$args['label_for']が存在するとき、<label for="{$args['label_for']}">{$title}</label>が出力される

 

ページIDの確認

サブページに項目を追加するには、各ページのIDをadd_settings_field()の4番目、register_setting()の1番目の引数で使用します。

各ページのIDは次のようになっています。

ページタイトルID備考:ファイル名
一般'general'/wp-admin/options-general.php
投稿設定'writing'/wp-admin/options-writing.php
表示設定'reading'/wp-admin/options-reading.php
ディスカッション'discussion'/wp-admin/options-discussion.php
メディア設定'media'/wp-admin/options-media.php
パーマリンク設定'permalink'/wp-admin/options-permalink.php
プライバシー追加できません/wp-admin/options-privacy.php

プライバシーは、プライバシーポリシーページの生成ツールという意味合いがあるので、項目を追加できないようです。

IDは、add_settings_field()の4番目、register_setting()の1番目の引数で使用します。

備考として表示してあるファイル名を見ると、IDはファイル名と関連してるような印象を受けます。
実際は関係なくて、各ファイルを解析して確認する必要があります。

例えば options-media.phpを開いて最終行までスクロールすると、次のようなコードが記述されています。

/wp-admin/options-media.php

<?php do_settings_sections( 'media' ); ?>

この'media'が、add_settings_field()に指定するページIDです。

50行目付近に、次のようなコードが記述されています。

/wp-admin/options-media.php

<?php settings_fields( 'media' ); ?>

この'media'が、register_setting()に指定するページIDです。

 

入力値の検証

項目に入力された値をデータベースに登録する前に検証したいケースがあります。

検証は次のように、"pre_update_option_{$option_name}"フィルターで行います。

$option_name = 'my_option_item';
register_setting( 'my_option_page', $option_name );

add_filter( "pre_update_option_{$option_name}"
	, function( $value, $old_value, $option){

		if( preg_match('/^[a-zA-Z]+$/',$value) ) return $value;

		add_settings_error($option, $option, 'アルファベットのみを指定', 'error');
		return $old_value;
	},10,3 );

詳しくは次のページを読んでみてください。

WordPressはHTMやCSSの知識も必要。総合的な知識を身につけよう。

更新日:2023/02/02

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。