問題描述

我一直在使用 get_theme_mod()一段時間在我的各種項目。我決定在 WordPress v3.4 中使用主題自定義 API,因為我覺得這是我客户使用不可或缺的工具。

過了一段時間,我開始注意到我的網站比平常感覺有點遲鈍,而且定製器特別需要相當長的時間來加載。在調查過程中經過大量的嘗試和錯誤,當我將設置 ($wp_customize->add_setting()) 從 theme_mod 註冊到 option 時,我決定嘗試關閉 type

一旦我做到了這一點,並把我所有的 get_theme_mod()調用換成 get_option(),我注意到使用後一種設置,而不是在前端,特別是在後台定製器上,速度顯著提高。我一直在瀏覽 WordPress 核心,試圖找出一個為什麼這樣做的答案,但似乎無法辨別這種情況下特定的掛起是什麼。

get_option()get_theme_mod()性能明顯快於 get_theme_mod()所能獲得的任何見解將不勝感激。

最佳解決方案

答案是肯定的,theme_mod 的功能會更慢,但不是很明顯,而且效益大於差異。

主題模式存儲為選項。因此,實質上,theme_mod 功能是選項功能周圍的包裝器。

首先,瞭解 theme_mod 設置是作為一個數組存儲在一個選項中,鍵入特定的主題名稱。所以,如果我這樣做:

set_theme_mod('aaa',123);
set_theme_mod('bbb',456);

那麼我在數據庫中實際獲得的是一個名為 theme_mods_themename 的單個選項行,它包含一個帶有 (‘aaa’ => 123,’bbb’ => 456) 的序列化數組。

現在,get_theme_mod 將會更慢,因為它實際上正在進行兩個 get_option 調用。首先,它得到主題的名稱。然後,它獲得 theme_mods_themename 選項。那麼那就是 50%的速度損失。完成的其餘工作主要在於過濾器,因為有一個額外的過濾器調用,但是除非您在該過濾器上有某些內容,否則這並不重要。

請注意,選項系統將檢索到的數據存儲在對象緩存中,因此在此處不會進行多個數據庫調用。只有第一次使用導致數據庫命中。

set_theme_mod 會稍微慢一點,因為它使得兩個相同的選項被調用,那麼它再次創建了一個 get_option 調用來獲取主題名稱,然後它就是 update_option 的全套現在更改的選項。這導致數據庫更新,並且發送更多數據的事實確實可能是導致顯著減速的原因。更新幾個字節比更新更大的行更快。但是,通常不會像你注意到的那麼多。除非你有很多設置的整體…

主題 mod 函數可能是為了優化整體而言,但是,但是您仍然應該使用它們而不是 get_option,因此是由於子主題。

直接使用選項行的問題是您直接使用它們,並使用特定的密鑰名稱進行設置。

如果我有一個名為”AAA” 的主題,並且我創建一個名為”BBB” 的子主題,以便在另一個站點上使用,那麼我的”AAA” 主題可能會使用名為”example” 的選項。當我更新一個網站,並更新我的選項,那麼相同的選項現在將適用於我的孩子主題。如果我不想這樣做,該怎麼辦?如果我想讓孩子主題使用不同的選項設置,該怎麼辦?

主題模式,通過包括實際的主題名稱 (而不是硬編碼的值) 作為密鑰的一部分,確保網站上的每個”theme” 使用其自己的一組設置。我可以來回切換,設置不會在它們之間轉移,它們會保留我如何設置它們。更簡單,更明顯,更直觀。

如果未來的核心更改或插件修改了 theme_mods 的工作原理,那麼您將自動獲得其優點,無需任何更改。包裝總是慢一點,這是不可避免的,它是包裝紙的本質。不過,您仍然在編寫 PHP 代碼,而不是機器語言。我們使用這樣的包裝器來簡化和分離功能。主題不應該需要知道或關心他們的選項如何存儲在數據庫中,或者命名如何工作。 theme_mod 功能提供更簡單的更清潔的解決方案。

參考文獻

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