問題描述

對不起,如果這個問題是微不足道的。我剛剛開始在 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。