WordPress 中的自定義數據庫表:第一部分

已發表: 2022-06-27

在本系列文章中,我們將了解如何在 WordPress 中使用或不使用插件創建自定義數據庫表。

何時以及為什麼應該使用自定義數據庫表?

在大多數情況下,您只需要安裝 WordPress 時創建的默認 WordPress 數據庫表即可。 這些表包含各種信息,例如帖子類型及其相關元數據。 那麼,為什麼需要自定義數據庫表呢?

當您處理不屬於 WordPress 中使用的正常信息的數據時,這些就會發揮作用。 因此,當您構建需要將信息存儲在數據庫中的插件時,您可能希望將數據放在自定義表中。 這就是為什麼你會看到像 WooCommerce 這樣的插件有自己的自定義表格的原因。

使用 Pressidium 託管您的網站

60 天退款保證

查看我們的計劃

除了作為一種更簡潔的信息存儲方式之外,使用單獨的表還可以幫助提高性能,因為使用的任何查詢都不必搜索不必要的數據行和行。 相反,他們可以被引導到“正確的”表格,在那裡他們可以更快、更有效地找到所需的信息。 當數據庫表開始增長時,這變得非常重要。

創建 WordPress 自定義數據庫表

假設我們想構建一個簡單的插件來幫助我們組織學生列表。 實際上,像這樣的簡單任務意味著我們根本不需要使用自定義表。 自定義帖子類型可以完美地完成這項工作。

然而,為了這個例子,這種數據非常適合展示自定義表背後的理論,所以我們將使用它來運行。 注意:我們假設您具備一些基本的 PHP 和 mySQL 知識。

入門

首先,我們將創建一個“學生”數據庫表,其中包含姓名、年齡、電子郵件和唯一 ID 列。 我們將通過創建一個自定義插件來完成這項工作。

注意:如果您還不熟悉如何創建自定義插件,請在繼續本教程之前查看我們關於構建您自己的自定義 WordPress 插件的指南!

創建插件文件

我們將在 plugins 文件夾中創建一個名為“my-custom-db-tables”的文件夾,並在其中創建一個名為“my-custom-db-tables.php”的文件,其中包含以下代碼:

 <?php /* Plugin Name: My Custom DB Tables Description: A plugin for registering my students Author: Tassos Antoniou */ function create_the_custom_table() { // THE CODE } register_activation_hook(__FILE__, 'create_the_custom_table');

我們所做的是引入插件信息,以便 WordPress 能夠識別插件。 顯然,您還需要一個將表模式添加到數據庫的函數,該函數將是create_the_custom_table()函數。

在大多數情況下,您只需要運行一次此功能,最好在插件激活時運行。 因此,我們使用了 WordPress 提供的 register_activation_hook() 來確保該函數在插件激活時運行。

定義表的結構

當然,如果我們激活插件,什麼都不會發生,因為該功能仍然是空的。 所以讓我們用這段代碼填充它,以便實際創建表:

 <?php /* Plugin Name: My Custom DB Tables Description: A plugin for registering my students Author: Tassos Antoniou */ function create_the_custom_table() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); $table_name = $wpdb->prefix . 'students'; $sql = "CREATE TABLE " . $table_name . " ( id int(11) NOT NULL AUTO_INCREMENT, name tinytext NOT NULL, email VARCHAR(100) NOT NULL, age int(11) NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } register_activation_hook(__FILE__, 'create_the_custom_table');

現在讓我們暫停一下,看看我們用這段代碼做了什麼。

首先,我們使用與數據庫通信的全局$wpdb WordPress 類來獲取表前綴。 它與wp-config.php文件中定義的前綴相同,並且在您的自定義表中使用它也是一個好習慣。 我們還將通過將當前排序規則保存在$charset_collate變量中來繼承當前排序規則,以便稍後在查詢中設置它。

我們的下一步是在 sql 查詢中定義表的結構,以正確獲取所需的模式。 正如我們所說,一個 id、email、name 和 age 列,每個列都有正確的數據類型。

 $sql = "CREATE TABLE " . $table_name . " ( id int(11) NOT NULL AUTO_INCREMENT, name tinytext NOT NULL, email VARCHAR(100) NOT NULL, age int(11) NULL, PRIMARY KEY (id) ) $charset_collate;";

接下來,我們require_onceupgrade.php文件。 為了使用緊隨其後的dbDelta函數,這是強制性的。 在 WordPress 上,為了創建數據庫表(或將現有表更新為新結構),我們需要使用 dbDelta 函數。

注意:此函數不是直接執行 SQL 查詢,而是用於根據指定的 SQL 語句通過創建或更新表來修改數據庫。 使用它的$queries參數,我們可以傳遞自定義表的方案。

現在,如果您激活插件並檢查您的數據庫,您應該會看到該表已創建。

現在,如果您閱讀wp-admin/includes/upgrade.php文件,您會注意到dbDelta()使用preg_match()函數從 SQL 語句中檢索信息。 因此,您在編輯時需要小心。 官方文檔提供了更多信息,但我們強調了以下要點:

  • 您必須在 SQL 語句中將每個字段放在自己的行中。
  • PRIMARY KEY 和主鍵定義之間必須有兩個空格
  • 您必須使用關鍵字KEY而不是其同義詞 INDEX,並且您必須至少包含一個KEY。
  • KEY 後面必須跟一個空格,然後是鍵名,然後是空格,然後是帶有字段名稱的左括號,然後是右括號。
  • 除主鍵之外的其他 KEY 應指定名稱。 例如:
 ... PRIMARY KEY (id), KEY age (age) ...
  • 不得在字段名稱周圍使用任何撇號或反引號。
  • 字段類型必須全部小寫
  • SQL 關鍵字,如 CREATE TABLE 和 UPDATE,必須是大寫的。
  • 您必須指定接受長度參數的所有字段的長度,例如 id 列的 int(11)。

您可能還注意到,我們沒有檢查該表是否已存在於數據庫中。 那是因為dbDelta為我們做了這件事。 無需擔心更新查詢。 它不僅會創建表,還會檢查同名表是否已經存在,如果存在,則不會創建表。 如果需要,它只會更新現有的表結構。

我們將在本系列的後續文章中對此進行更多介紹。

功能性和可擴展性

那麼,當插件被停用或卸載時會發生什麼? 理想情況下,當插件被停用或刪除時,應該有一個管理員選項來選擇是否從數據庫中刪除此表。

此外,您幾乎可以肯定遲早會發現您需要更改您的插件(以改進它或消除錯誤)。 也許您想改變它存儲數據的方式,向表中添加列,或者改變它的設計。 這意味著您應該以確保它盡可能可擴展並且可以適應所做的任何更改的方式構建插件。

在本系列的下一篇文章中,我們將深入探討這些主題並向您展示如何實現這一目標。 稍後檢查!