WordPressの管理画面に自作でメニューを追加する方法

WordPressの管理画面にメニューを追加する方法です。

ついでにフォーム的なものを設置してメッセージの表示までやります。

メニューの設置の仕方

functions.php

add_action( 'admin_menu', 'my_menu' );
function my_menu() {
 add_menu_page(
 'メニューページのタイトル', // タイトルタグ
 'メニュー名', // メニューのテキスト
 'manage_options', // 権限(manage_optionsは管理者の権限です。)
 'my_menu_slug', // スラッグ名
 'my_menu_func', // コールバック関数(メニューを表示する時に起動します。)
 '', // メニューのアイコン
 '6' // メニューの表示位置(小数点まで可)
 );
}

メニューが追加されました。

参考:関数リファレンス/add menu page

メニュー画面の設定

メニューは追加されましたが、クリックしてもエラー画面だけが表示されます。

コールバック関数を使って中身を作ってあげましょう。

functions.php

function my_menu_func() {
 $text = '
 <h2>HTMLをそのまま書けばOK</h2>
 <form method="post" action="">
 ' . 
 wp_nonce_field( 'my_nonce_key', 'my_menu_slug' )
 . '
 <p><span>テキストエリア</span> <input type="text" name="text"></p>
 <input type="submit" value="ボタン">
 </form>
 ';
 echo $text;
}

wp_nonce_field

はformの中での隠し要素(hidden)を自動生成してくれる関数です。どこのメニューからボタンが押されたかを判断するための重要なキーですので必ず設定してください。

第一引数のmy_nonce_keyはhiddenのキー。第二引数のmy_menu_slugはメニューのスラッグ名を指定します。

なんとなくメニュー感が出てきましたね。

ボタンを押した時の動きを設定

functions.php

add_action( 'admin_init', 'my_menu_click' );
function my_menu_click() {
 if ( isset( $_POST['my_menu_slug'] ) && $_POST['my_menu_slug'] ) {
 if ( check_admin_referer( 'my_nonce_key', 'my_menu_slug' ) ) {
 set_transient( 'my_menu_message', array( 'ここに表示させたいメッセージを登録します', ) , 10 );
 }
 }
}

最初のifでメニューの存在を確認し、次のifでどこのフォームからクリックされたかを確認しています。

メッセージの表示

functions.php

add_action( 'admin_notices', 'my_menu_notices' );
function my_menu_notices() {
 if ( $messages = get_transient( 'my_menu_message' ) ) {
 $text_li = '';
 if ( is_array( $messages ) ) {
 foreach( $messages as $message ) {
 $text_li .= '<li>' . esc_html( $message ) . '</li>';
 }
 } else {
 $text_li = '<li>' . esc_html( $messages ) . '</li>';
 }
 $text = '
 <div class="updated">
 <ul>' . $text_li . '</ul>
 </div>
 ';
 echo $text;
 }
}

set_transientで設定した値を表示させる処理を行っています。メッセージ用のアクションフックに登録しておくことで適宜表示させることが可能です。