這個篇的學習難度比較高,包含資料表與添加新的功能,再把功能要儲存的資料寫在自訂的資料表中,在這篇文章中,將會知道資料如何在 WordPress 添加自訂資料表與功能將資料存入自訂資料表,那就開始吧~!
使用情境:
因為工作關西,上司需求😒而我不想把工作的心力都耗在手動登載資料上,由於接手維護 WordPress 但上位人兄以非常 FREE 的方式使用,安裝了五十幾個外掛,我經過一年的努力減少了十幾個外掛,而上司需要我記錄下每次更新外掛名稱版本與日期😩六個 WordPress 網站合計 47 個外掛,手動記錄更新歷程…是不是很哭,所以有了這篇文章。
自製外掛起手式
*一句老話,程式碼要放在佈景主題的 function 裡,還是要放在外掛裡,來使用這功能都可,外掛起手式這裡不再詳述,去看WordPress custom post type 如何自訂文章類型這篇😃
如何自訂資料表
這次的寫入的資料不是放在 WordPress 裡的 _posts 或 _postmeta 資料表裡,而是自訂資料表 _update_plugin_log,先來定義一下要儲存的資料欄位,ID、類型、名稱、版本、更新日期差不多就這些,使用 hook 來建立自訂資料表:
// 在插件激活時創建自訂資料表
register_activation_hook(__FILE__, 'create_update_plugin_log_table');
function create_update_plugin_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'update_plugin_log';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
item_type varchar(20) NOT NULL COMMENT '類型',
item_name varchar(100) NOT NULL COMMENT '名稱',
item_version varchar(20) NOT NULL COMMENT '版本',
update_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '更新時間',
PRIMARY KEY (id)
) $charset_collate;";
//打發時間 https://dafatime.idv.tw
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
將 Log 資料寫入自訂資料表
上述SQL建立資料表語句就不詳述,有興趣的可以研究看看,也是個坑,一樣使用 hook 來取得更新資訊,再寫入到資料表中:
// 記錄更新事件
add_action('upgrader_process_complete', 'log_update_plugin_event', 10, 2);
function log_update_plugin_event($upgrader_object, $options) {
global $wpdb;
$table_name = $wpdb->prefix . 'update_plugin_log';
// 紀錄外掛更新
if ($options['type'] == 'plugin' && isset($options['plugins'])) {
foreach ($options['plugins'] as $plugin) {
$plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin);
$plugin_name = $plugin_data['Name'];
$plugin_version = $plugin_data['Version'];
$wpdb->insert(
$table_name,
array(
'item_type' => 'plugin',
'item_name' => $plugin_name,
'item_version' => $plugin_version,
'update_date' => current_time('mysql')
)
);
}
}
//打發時間 https://dafatime.idv.tw
}
在後台自訂選單與 Log 列表頁面
要在後台自訂選單與頁面可以看這片,這裡就不再詳述WordPress 在後台添加自訂選單與頁面,要取的自訂資料表顯示在列表中,列表使用內建函式 WP_List_Table 可以減少不必要的麻煩(例如分頁與頁碼),下面 hook 會添加一下更新紀錄的選單與頁面,頁面列表包含搜尋與排序功能,如下圖:
// 添加管理選單項
add_action('admin_menu', 'update_plugin_log_admin_menu');
function update_plugin_log_admin_menu() {
add_menu_page(
'更新紀錄', // 頁面標題
'更新紀錄', // 選單標題
'manage_options', // 權限
'update-plugin-log', // 選單slug
'display_update_log' // 回呼函數
);
}
// 顯示更新紀錄列表
function display_update_log() {
// 檢查使用者權限
if (!current_user_can('manage_options')) {
return;
}
// 包含 WP_List_Table 類別
if (!class_exists('WP_List_Table')) {
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
}
// 自訂 WP_List_Table 類別
class Update_Log_List_Table extends WP_List_Table {
function get_columns() {
$columns = array(
'id' => 'ID',
'item_type' => '類型',
'item_name' => '名稱',
'item_version' => '版本',
'update_date' => '更新日期'
);
return $columns;
}
function get_sortable_columns() {
$sortable_columns = array(
'update_date' => array('update_date', true) // 默認按日期排序
);
return $sortable_columns;
}
function prepare_items() {
global $wpdb;
$table_name = $wpdb->prefix . 'update_plugin_log';
$per_page = 20;
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array($columns, $hidden, $sortable);
// 處理搜索查詢
$search = (isset($_REQUEST['s'])) ? wp_unslash(trim($_REQUEST['s'])) : '';
$current_page = $this->get_pagenum();
$orderby = (isset($_REQUEST['orderby'])) ? sanitize_sql_orderby($_REQUEST['orderby']) : 'update_date';
$order = (isset($_REQUEST['order'])) ? sanitize_key($_REQUEST['order']) : 'desc';
// 查詢總數
$total_items = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(id) FROM $table_name WHERE item_name LIKE %s",
'%' . $wpdb->esc_like($search) . '%'
));
// 查詢記錄
$this->items = $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table_name WHERE item_name LIKE %s ORDER BY $orderby $order LIMIT %d OFFSET %d",
'%' . $wpdb->esc_like($search) . '%',
$per_page,
($current_page - 1) * $per_page
));
$this->set_pagination_args(array(
'total_items' => $total_items,
'per_page' => $per_page,
'total_pages' => ceil($total_items / $per_page)
));
}
function column_default($item, $column_name) {
switch ($column_name) {
case 'id':
case 'item_type':
case 'item_name':
case 'item_version':
case 'update_date':
return esc_html($item->$column_name);
default:
return print_r($item, true);
}
}
function get_bulk_actions() {
$actions = array();
return $actions;
}
}
// 創建表格
$updateLogTable = new Update_Log_List_Table();
$updateLogTable->prepare_items();
echo '<div class="wrap">';
echo '<h1>更新紀錄</h1>';
echo '<form method="post">';
$updateLogTable->search_box('搜尋紀錄', 'search_id');
$updateLogTable->display();
echo '</form>';
echo '</div>';
}//打發時間 https://dafatime.idv.tw
結論
這個外掛功能,只要在按下更新外掛的時候,就會自動寫入一筆資料到自訂資料表中,只要搜尋外卦名稱就可以看到該外掛名稱外掛的更新歷程,這樣就可以不需要手動在那一筆一筆輸入,時間可貴不要浪費生命,那就掰掰!
留言