2,527 views
この記事は最終更新から 2662日 が経過しています。
やりたいこと
今回は (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プラグイン作成のマナーに従っておこう。

アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2025-12-09: 0回 2025-12-08: 0回 2025-12-07: 2回 2025-12-06: 3回 2025-12-05: 0回 2025-12-04: 0回 2025-12-03: 1回