Skip to content

Instantly share code, notes, and snippets.

@kurozumi
Last active April 23, 2018 23:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kurozumi/5d1e6517ddb15473c5be to your computer and use it in GitHub Desktop.
Save kurozumi/5d1e6517ddb15473c5be to your computer and use it in GitHub Desktop.
【ワードプレス】プラグインによる管理画面の設定ページ作成用のテンプート
<?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