2,055 views
この記事は最終更新から 2231日 が経過しています。
やりたいこと
今回は (25) WordPressで設定画面付きプラグインを作成 で作ったあいさつプラグインのデータ保存周りを少し改良してみる。上記の投稿では、各時間帯ごとのあいさつ文をDBテーブル wp_option に以下のように格納していた。
(option_name, option_value) =
(Greeting_morning, おはようございます!),
(Greeting_afternoon, こんにちは!),
(Greeting_evening, こんばんは!)
すなわち、wp_optionテーブルに当該プラグイン用のレコードを 3個作っていた。
ところが…
1つのプラグインで wp_option 上に複数レコードを挿入することはマナーとしてよろしくないようだ。
「みんなで共有する領域に自分専用データをまき散らすな」、ということだろう。
ではどうするか?
1個のプラグインでは、1個のレコードのみを使用する。
その1個のレコードの中に、複数の情報をまとめて保存する。
すなわち、配列データとして格納しておきなさいとのこと。
プログラム
WORDPRESSのオプション設定関数は、配列データの展開・格納処理をラップしてくれている。
すなわち、レコードに格納するデータを配列(key & valueの辞書形式)で渡すと、レコード保存時に自動的に展開(Serialize)してくれる。逆にレコードから取得したデータは配列に格納(Deserialize)してくれる。
<?php /* Plugin Name: Greeting2 */ //////////////////////////////////////////////////////////////////////// // 当該プラグインクラスに実体を持たせる。→ __construct()から処理起動 if (class_exists('Greeting')) { $greeting = new Greeting(); } //////////////////////////////////////////////////////////////////////// class Greeting { private $m_setting_group; private $m_option_name; private $m_options; ////////////////////////////////////////////////////////////////////// public function __construct() { $this->m_setting_group = 'Greeting-setting-group'; $this->m_option_name = 'Greeting'; $this->m_options = array('morning' =>array('t'=>'朝のあいさつ','v'=>'おはようございます!') ,'afternoon'=>array('t'=>'昼のあいさつ','v'=>'こんにちは!') ,'evening' =>array('t'=>'夜のあいさつ','v'=>'こんばんは!')); //------------------------------------------------------------------ add_shortcode('ytmr_greeting', array($this, 'proc_shortcode')); add_filter('widget_text', 'do_shortcode'); add_action('admin_menu', array($this, 'proc_create_menu')); add_action('admin_init', array($this,'proc_register_settings')); //------------------------------------------------------------------ register_activation_hook( __FILE__, array($this, 'proc_plugin_activate')); register_deactivation_hook(__FILE__, array($this, 'proc_plugin_deactivate')); } ////////////////////////////////////////////////////////////////////// public function proc_plugin_activate(){ add_option($this->m_option_name, $option_val); } ////////////////////////////////////////////////////////////////////// public function proc_plugin_deactivate(){ delete_option($this->m_option_name); } ////////////////////////////////////////////////////////////////////// public function proc_shortcode(){ // 時刻に応じたあいさつを選択する。 $ary_greeting = get_option($this->m_option_name); $h = intval(date_i18n('G')); // 現在時刻を取得 (G: Hour, 24-hour, without leading zeros) if( 4 <= $h && $h < 10){ $str = esc_attr($ary_greeting['morning']['v']);} elseif(10 <= $h && $h < 18){ $str = esc_attr($ary_greeting['afternoon']['v']);} else{ $str = esc_attr($ary_greeting['evening']['v']);} return $str; } ////////////////////////////////////////////////////////////////////// public function proc_create_menu() { add_submenu_page('options-general.php', 'Greeting2', 'Greeting2', 'administrator', __FILE__, array($this, 'proc_display_settings_page')); } ////////////////////////////////////////////////////////////////////// public function proc_register_settings() { register_setting($this->m_setting_group, $this->m_option_name, array($this, 'proc_handle_sanitization')); } ////////////////////////////////////////////////////////////////////// public function proc_handle_sanitization($ary_set) { $ary_options = $this->m_options; foreach($ary_set as $key => &$ary_tv){ $ary_options[$key]['v'] = esc_attr($ary_tv['v']); } return $ary_options; } ////////////////////////////////////////////////////////////////////// public function proc_display_settings_page() { $html_input = ""; $ary_greeting = get_option($this->m_option_name); foreach($ary_greeting as $key => $ary_kv){ $title = esc_attr($ary_kv['t']); $value = esc_attr($ary_kv['v']); $html_input .= <<< EOM <tr valign="top"> <th scope="row">{$title}</th> <td><input type="text" name="{$this->m_option_name}[{$key}][v]" value="{$value}" /></td> </tr> EOM; } ?> <div class="wrap"> <h2>Greeting Setting</h2> <p>Short code : <span style="background:#fff;color:#00f;padding:3px 5px;font-size:1.2rem">[ytmr_greeting]</span></p> <form method="post" action="options.php"> <?php settings_fields($this->m_setting_group); ?> <?php do_settings_sections($this->m_setting_group); ?> <table class="form-table"> <?php echo $html_input; ?> </table> <?php submit_button(); ?> </form> </div> <?php } } // end of class ?>
データベースを確認
確かにシリアライズされたデータが格納されている。
郷に入っては郷に従えというので、WORDPRESSプラグイン作成のマナーに従っておこう。