這個篇的學習難度比較高,包含資料表與添加新的功能,再把功能要儲存的資料寫在自訂的資料表中,在這篇文章中,將會知道資料如何在 WordPress 添加自訂資料表與功能將資料存入自訂資料表,那就開始吧~!

使用情境:

因為工作關西,上司需求😒而我不想把工作的心力都耗在手動登載資料上,由於接手維護 WordPress 但上位人兄以非常 FREE 的方式使用,安裝了五十幾個外掛,我經過一年的努力減少了十幾個外掛,而上司需要我記錄下每次更新外掛名稱版本與日期😩六個 WordPress 網站合計 47 個外掛,手動記錄更新歷程…是不是很哭,所以有了這篇文章。

自製外掛起手式

*一句老話,程式碼要放在佈景主題的 function 裡,還是要放在外掛裡,來使用這功能都可,外掛起手式這裡不再詳述,去看WordPress custom post type 如何自訂文章類型這篇😃

如何自訂資料表

這次的寫入的資料不是放在 WordPress 裡的 _posts 或 _postmeta 資料表裡,而是自訂資料表 _update_plugin_log,先來定義一下要儲存的資料欄位,ID、類型、名稱、版本、更新日期差不多就這些,使用 hook 來建立自訂資料表:

PHP
// 在插件激活時創建自訂資料表
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 來取得更新資訊,再寫入到資料表中:

PHP
// 記錄更新事件
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 會添加一下更新紀錄的選單與頁面,頁面列表包含搜尋與排序功能,如下圖:

PHP
// 添加管理選單項
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

結論

這個外掛功能,只要在按下更新外掛的時候,就會自動寫入一筆資料到自訂資料表中,只要搜尋外卦名稱就可以看到該外掛名稱外掛的更新歷程,這樣就可以不需要手動在那一筆一筆輸入,時間可貴不要浪費生命,那就掰掰!

最後修改日期: 2024 年 8 月 10 日

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。