Last active
April 23, 2018 23:25
-
-
Save kurozumi/5d1e6517ddb15473c5be to your computer and use it in GitHub Desktop.
【ワードプレス】プラグインによる管理画面の設定ページ作成用のテンプート
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: WP Setting Page | |
Version: 0.1-alpha | |
Description: wordpress setting page template | |
Author: kurozumi | |
Author URI: http://a-zumi.net | |
Plugin URI: http://a-zumi.net | |
Text Domain: wp-setting-page | |
Domain Path: /languages | |
*/ | |
$wp_setting_page = new WP_Setting_Page(); | |
$wp_setting_page->register(); | |
class WP_Setting_Page | |
{ | |
private $options; | |
private $option_name = "wp_setting_page"; | |
private $option_group = "wp_setting_page"; | |
private $menu_slug = "wp_setting_page"; | |
private $section_id = "wp_setting_page_section_id"; | |
public function register() | |
{ | |
add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ) ); | |
} | |
public function plugins_loaded() | |
{ | |
add_action('admin_menu', array($this, 'admin_menu')); | |
add_action('admin_init', array($this, 'admin_init')); | |
} | |
public function admin_menu() | |
{ | |
/** | |
* 管理者メニューのサイドバーにトップレベルのメニューを追加 | |
* | |
* @param string $page_title 設定ページ名 | |
* @param string $menu_title メニュー名 | |
* @param string $capability 権限 | |
* @param string $menu_slug メニューのslug | |
* @param callback $function 設定ページの出力を行う関数 | |
* @param string $icon_url メニューに表示するアイコン | |
* @param int $position メニューの位置 | |
* | |
* @return string The resulting page's hook_suffix | |
*/ | |
add_menu_page( '設定ページ', '設定ページ', 'manage_options', $this->menu_slug, array( $this, 'admin_page' ) ); | |
} | |
public function admin_init() | |
{ | |
/** | |
* サニタイズ用コールバックを登録します | |
* | |
* @param string $option_group 設定のグループ名。settings_fields()のグループ名と一致しなければならない。 | |
* @param string $option_name 設定項目名(DBに保存するオプション名) | |
* @param callable $sanitize_callback 入力値のサニタイズを行う際に呼ばれる関数 | |
*/ | |
register_setting($this->option_group, $this->option_name, array( $this, 'sanitize' ) ); | |
/** | |
* Add a new section to a settings page. | |
* | |
* @param string $id セクションID | |
* @param string $title セクション名 | |
* @param string $callback セクションの説明などを出力するための関数 | |
* @param string $page 設定ページのslug ※add_menu_page()の$menu_slugと同じものにする | |
*/ | |
add_settings_section( $this->section_id, '', '', $this->menu_slug ); | |
/** | |
* 設定項目を設定ページととセクションへ登録します。 | |
* | |
* @param string $id 入力項目ID | |
* @param string $title 入力項目名 | |
* @param string $callback 入力項目のHTMLを出力する関数 | |
* @param string $page 設定ページのslug ※addd_menu_page()の$menu_slugと同じものにする | |
* @param string $section セクションID add_settings_section()の$idと同じものにする | |
* @param array $args $callbackの追加引数 | |
*/ | |
add_settings_field('message', 'メッセージ', array($this, 'input_callback'), $this->menu_slug, $this->section_id, array('name' => 'message')); | |
} | |
public function admin_page() | |
{ | |
global $title; | |
$this->options = get_option($this->option_name); | |
?> | |
<div class="wrap"> | |
<h2><?php echo esc_html($title);?></h2> | |
<?php | |
global $parent_file; | |
if($parent_file != 'options-general.php') | |
require(ABSPATH . 'wp-admin/options-head.php'); | |
?> | |
<form method="post" action="options.php"> | |
<?php | |
// 隠しフィールド出力 | |
settings_fields($this->option_group); | |
// 入力項目出力 | |
do_settings_sections($this->menu_slug); | |
// 送信ボタン出力 | |
submit_button(); | |
?> | |
</from> | |
</div> | |
<?php | |
} | |
public function input_callback($args) | |
{ | |
$value = isset( $this->options[$args['name']] ) ? $this->options[$args['name']] : ''; | |
?> | |
<input type="text" id="<?php esc_attr_e($args['name']);?>" name="<?php printf("%s[%s]", $this->option_name, esc_attr($args['name']));?>" value="<?php esc_attr_e($value) ?>" /> | |
<?php | |
} | |
public function sanitize($input) | |
{ | |
global $wp_settings_fields; | |
$section = $wp_settings_fields[$this->menu_slug][$this->section_id]; | |
$this->options = get_option($this->option_name); | |
$new_input = array(); | |
foreach($input as $k => $v) | |
{ | |
if(trim($v) != '') { | |
$new_input[$k] = sanitize_text_field($v); | |
}else{ | |
/** | |
* Register a settings error to be displayed to the user | |
* | |
* @param string $setting 設定ページのslug ※addd_menu_page()の$menu_slugと同じものにする | |
* @param string $code エラーコードのslug | |
* @param string $message エラーメッセージの内容 | |
* @param string $type メッセージのタイプ。'updated' (成功) か 'error' (エラー) のどちらか | |
*/ | |
add_settings_error($this->menu_slug, $k, sprintf('%sを入力して下さい。', $section[$k]['title'])); | |
$new_input[$k] = isset($this->options[$k]) ? $this->options[$k] : ''; | |
} | |
} | |
return $new_input; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment