• EN
香港:(852)3749 9734
廣州: (020) 3808 3267
[email protected]

新聞資料

WordPress教程:為插件自定義數據表

  當你寫插件的時候,你可能需要寫東西到數據庫中去,一般來說,有兩種數據要存儲,第一種是安裝數據,一般存儲在 wp_options 表中,使用 WordPress 的 options 機制來實現。第二種是數據,可以存儲到 postmeta 表或者 usermeta 表中。如果數據特別多,就需要單獨創建數據表了。這篇文章就講講如何在寫插件時候創建數據表。

  
  一般在寫插件時候創建數據庫有如下三個步驟:
  
  創建一個添加新數據表的 PHP 函數。
  
  保證插件啟動的時候調用這個函數。
  
  如果新版本有不同的數據表結構,創建一個升級函數。
  
  今天我就以微信機器人 WordPress 插件高級版的 新功能:自定義文本回復,來講解下這個過程,其中的第三步,由于沒有數據庫的升級不涉及。
  
  創建一個添加新數據表的 PHP 函數
  
  我們這個插件的安裝函數叫做:weixin_robot_texts_crate_table。
  
  1. 數據庫表前綴
  
  默認 WordPress 數據庫標簽前綴都是 wp_,但是有人如果在一個數據庫安裝兩個及以上 WordPress,就需要在 wp-config.php設置 WordPress 數據庫表前綴來區別,所以我們向 WordPress 數據庫添加新表的時候,要先找找到網頁設計數據庫表前綴。我們可以在變量 $wpdb->prefix 找到。代碼如下:
  
  global $wpdb;$table_name = $wpdb->prefix . "weixin_robot_texts";
  
  2. 判斷表是否存在
  
  可以通過一條 SHOW TABLES SQL 查詢來判斷。
  
  if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name)
  
  3. 創建數據表
  
  這步就是實際來創建一個數據表了。我們這個表有5個字段,id 自定義文本回復的 ID。keyword 微信發送過來的關鍵字,reply 自定義回復,time 添加的時間,status是否啟用,有時候只是不想暫時不想啟用,而不是刪除。
  
  這里我不用直接的 SQL 查詢來創建,而是使用在 wp-admin/upgrade-functions.php(我們需要加載該文件,默認是不會加載的)中的 dbDelta。dbDelta 函數會檢查當前的表結構,和需要的表結構進行比較,所以無論添加或者修改表都會非常方便。關于網頁設計具體怎樣使用 dbDelta,詳細可以看 wp-admin/upgrade-schema.php 中的例子。
  
  $sql = "CREATE TABLE " . $tablename . " (
  
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  
  `keyword` varchar(255) CHARACTER SET utf8 NOT NULL,
  
  `reply` text CHARACTER SET utf8 NOT NULL,
  
  `status` int(1) NOT NULL DEFAULT '1',
  
  `time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  
  PRIMARY KEY (`id`),
  
  UNIQUE KEY `keyword` (`keyword`)
  
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  
  ";
  
  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  
  最后這個 weixin_robot_texts_crate_table 函數為:
  
  function weixin_robot_texts_crate_table() {
  
  global $wpdb;
  
  $table_name = $wpdb->prefix . "weixin_robot_texts";
  
  if($wpdb->get_var("show tables like '$table_name'") != $weixin_robot_texts_table)
  
  {
  
  $sql = "CREATE TABLE " . $table_name . " (
  
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  
  `keyword` varchar(255) CHARACTER SET utf8 NOT NULL,
  
  `reply` text CHARACTER SET utf8 NOT NULL,
  
  `status` int(1) NOT NULL DEFAULT '1',
  
  `time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  
  PRIMARY KEY (`id`),
  
  UNIQUE KEY `keyword` (`keyword`)
  
  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  
  ";
  
  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  
  dbDelta($sql);    }}
  
  保證插件啟動的時候調用創建數據表函數
  
  我們使用 register_activation_hook 調用上面創建數據表的函數。
  
  register_activation_hook( __FILE__,'weixin_robot_texts_crate_table');