問題描述

對不起,如果這個問題是微不足道的。我剛剛開始在 WordPress 中開發插件。

在所有教程中,我發現這一點:在創建自定義表時,使用 $wpdb->prefix

例:

$table_name = $wpdb->prefix . "liveshoutbox";

我的問題:

Is it mandatory to use $wpdb->prefix? What happens If I don’t use prefix for my custom tables?

最佳解決方案

這不是強制性的,但您應該始終使用它,並應將其視為強制性的。

考慮兩個 Wordpress 站點在同一個數據庫中設置的情況。一個前綴為 wp_,另一個與 wp2_。如果您在兩個具有前綴的站點中安裝了插件,則您創建的數據庫將是第一個站點的 wp_liveshoutbox 和第二個站點的 wp2_liveshoutbox 。但是如果您省略了前綴,那麼這兩個站點都將使用相同的名為 liveshoutbox 的數據庫,整個事情將會分解。

次佳解決方案

考慮以下幾點:

您的插件用於 Wordpress 網絡,每個網站使用不同的表前綴。您的插件可以在 836 個不同的站點上同時運行,所有這些站點都在同一個數據庫中。 wp_385677_liveshoutbox 是一個完全合理的表名。

您的插件由具有一些安全概念的用户安裝,並將表前綴更改為阻止漫遊器嘗試將 select * from wp_users 注入系統。即使他們發現一個新的漏洞,它將無法正常工作。

使用硬編碼表名稱的快捷方式是讓產品開始運行的好方法,但不是釋放它的好方法。在很短的時間內,插件將有一堆 「不工作」 的意見,在最壞的情況下,你會打破別人的網站。

如果我有一個複雜的查詢,我不想處理寫'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id .... 的痛苦,你可以使用替換。例如:

$query = 'select foo from %table% left join %meta% on %table%.ID = %meta%.meta_id ... ';

$change = array (
    '%table%' => $wpdb->prefix . '_mytable',
    '%meta%'  => $wpdb->prefix . '_mytablemeta'
    );


$sql = str_replace( array_keys( $change ), array_values( $change ), $query );

$results = $wpdb->get_results( $sql );

WordPress 不斷變化今天”works” 今天可能不工作。這就是為什麼有 API 函數。 WordPress 開發人員將確保公共 API 行為是一致的 (或者它們會貶值該功能) 。如果您開始使用內部方法調用,因為它的 「速度更快」,通常會回來咬你。軟件中的真正快捷鍵很少 – 他們只需將所需的工作從現在開始轉移到以後,像您的信用卡一樣,”later” 的成本更高。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。