(35) 【WORDPRESS】オプションデータを1レコードにまとめる。

投稿者: | 2017年9月4日

この記事は最終更新から 451日 が経過しています。

やりたいこと

今回は (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">こんにちは!</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プラグイン作成のマナーに従っておこう。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)