關於 WordPress 的 Transients

內容更新於 — 2022-12-26 17:14

❝廣告,是為了讓這裡能夠永續經營,多多包容囉^v^❞

在 WordPress 生態系統中,Transients 是程式庫中很少被提及的那一塊;但是,對於開發人員來說,在編寫外掛或主題的程式碼類型中,Transients 可以大大提升程式庫的性能;尤其是當正要運行複雜的數據庫查詢,或者是調用不經常更改結果的外部 API,它將會直接提供調用臨時儲存的數據,這意味著頁面載入的速度會更快。

這篇文章將解釋什麼是 Transients ,它們又如何在 WordPress 中工作,以及如何在程式碼中運用 Transients 來提高主題和外掛的性能。

什麼是 Transients,為什麼需要它們?

WordPress Transients API 是 WordPress 程式庫的一部分,允許外掛和主題的開發人員存儲快取資料。 而這些資料最終會過期,之後也會被自動刪除。

Transients 通常用來快取〖來自可能引入延遲的外部 API 請求〗的數據,或者是來自〖緩慢的資料庫查詢〗的數據,因為這些數據在每次頁面載入的時候會降低網站的性能。

Transients 如何運作?

在 WordPress 數據庫中,Transients 會被儲存成後綴為〖 wp_options 〗的檔案,很類似於 Options API;不過,兩者的區別在於 Transients 有時效性,時效過了就會自動被刪除,而 WordPress Options 則不會。
正因為 Transients 有時效性,所以,編寫程式碼應考慮並計算 Transients 的時效,在可能需要再次調用之前重新填充 Transients ,以防在發出請求時瞬態不再存在。
編寫 Transients 程式碼,有 3 個主要函數:包含 set_transient()get_transient() 以及 delete_transient() ,依序為〖設定 Transients〗、〖取得 Transients〗以刪除 Transients〗。

函數範例如下:

// Setting a value
set_transient( $name, $value, $expiration );

// Accessing a value
get_transient( $name );

// Removing a value
delete_transient( $name );

舉個例子來示範 Transients 的工作原理,假設,你想要在網站顯示能夠每日自動更新的〖名人名言〗,Zen Quotes 是一個很棒的來源,不需要密鑰就可以透過 API 來取得服務。比如,Zen Quotes 提供了一組〖當日名言〗的 API 端點:https://zenquotes.io/api/today,我們可以透過 php 函式調用 API 來取得〖當日名言〗的實時更新,示範的函式如下:

$response = wp_remote_get( 'https://zenquotes.io/api/today );
$body     = json_decode( wp_remote_retrieve_body( $response ) );
$quote = $body->q;

而這段程式碼可以放在主題的 php 檔案中,不過,這時候問題就來了,因為每次有訪客載入頁面的時候,它都會調用 API,這將會造成過多的 API 請求,此外,根據 API 的響應時間,還可能減慢頁面載入的速度。所以,更好的作法是使用 Transients 來確保只有當 Zen Quotes 提供的端點更新的時候才需要調用實時 API,於是,加入 Transients 的程式碼,來設定 Transients 的到期時間如下:

$response = wp_remote_get( 'https://zenquotes.io/api/today' );
$body     = json_decode( wp_remote_retrieve_body( $response ) );
$quote = $body->q;

set_transient( 'quote', $quote, DAY_IN_SECONDS );

以上的 Transients 程式碼是將將 Transients 設置為 24 小時到期(WordPress DAY_IN_SECONDS)。
不過,事情還沒完,我們還要設定一個檢查機制告訴它:『只有在 Transients 到期的時候才需要調用實時 API。』,否則,前面設定的〖 24 小時到期〗也沒用,函式如下:

if( get_transient( 'quote' ) ) {
    $quote = get_transient( 'quote' );
} else {
    $response = wp_remote_get( 'https://zenquotes.io/api/today' );
    $body     = json_decode( wp_remote_retrieve_body( $response ) );
    $quote = $body->q;

    set_transient( 'quote', $quote, DAY_IN_SECONDS );
}

set_transient 和 get_transient 的用法類似 ,至於 delete_transient 的用法則是:假設,想在 Transients 到期之前自動刪除它,可以使用以下命令:

delete_transient( 'quote' );

在WordPress 中常見的 Transients 用法

以下是常見的幾種 Transients 的深入使用。

快取長時間運行的數據庫查詢

WordPress 的數據庫查詢的優化做得很好,像是 WP_Query。但是,如果要從 wp_postmeta 查詢大量數據,那麼,就會影響到前端網站載入的性能,尤其是擁有上萬或數十萬則文章的網站。

但是,如果這些文章並不是經常更改,就可以執行一次長時間運行的數據庫查詢,將查詢結果保存在 Transients ,並且為 Transients 設定到期時間,然後,從保存的 Transients 為每個頁面視圖執行查找,這將確保快速執行對該數據的後續調用,例如,可以設定瞬態的到期時間為一小時、一天甚至是更久的時間。

減少外部 API 請求的等待時間

另一個常見的瞬態用法則是透過 API 調用外部資源。因為我們無法控制外部資源的響應速度甚至是持續可用性,於是,使用 Transients 可以更好地控制這種情況。就像前面的〖當日名言〗的案例,我們可以將遠端 API 返回的數據暫時保存在 Transients ,之後的頁面載入就可以從預先保存的 Transients 中讀取數據,而不是重新調用,需要考慮的則是數據更改的頻率。

假設, API 調用的是〖天氣〗,幾乎可說是需要分秒更新的資料,那麼, Transients 將無濟於事。但是,如果要查詢或調用的資料數小時更新即可,那 Transients 便有機會幫助提高網站的性能,也能確保獲得所需的新數據。

❝廣告,是為了讓這裡能夠永續經營,多多包容囉^v^❞

Transients 的優缺點

Transients 可以大大提高程式碼性能,尤其是需要經常使用長時間運行的查詢或執行的渲染阻塞請求,Transients 改善的是程式碼中的潛在性能。

至於使用 Transients 最大的缺點則是,即使已設定了到期時間,也不能保證在到期之前的 Transients 一定可用,因此,如果有需要在準確時間轉換的數據,那麼 Transients 可能不是最佳選擇。

Transients 最理想的作用是在於,需要提取大量數據或與外部資源的主題或外掛,並且將在高流量的網站上運行時,那麼,Transients 是一個有用的概念,去快取需要長時間或緩慢的操作,以便在不需要更新數據的前提下保持較高的網站性能。此外,日益複雜的程式碼中,Transients 也可以確保從複雜的程式庫中獲得最佳性能。

原始發布日:
2022-11-15
最新留言
▍關於作者|MiriamMibao温唯
2019.02.11,我開始了這裡…
非網頁程式背景的 me 硬要WordPress架站一切自己來,所有的細節,從0開始,自己架站會遇到的問題,遇到了才知道!一路走來跌跌撞撞,摸索過國內外能夠解決問題的資料,是不是該好好紀錄這一段跌跌撞撞的探索日記?
或許,也能帶給你們一些幫助...
文章中所推薦或提及的架站產品或服務,部分是聯盟合作所提供的,如果你透過我所提供的聯盟網址去購買,我也能獲得收益,雖然金額很少,但是,你們的隨手點擊與購買,就能讓我繼續經營下去,提供更多免費的 WordPress 架站教學。
以下歡迎留言討論囉!
我只想當個旁觀者,有新的留言請通知我(按一下輸入Email信箱)
想Fallow哪種留言?
0 留言板
Inline Feedbacks
查看所有留言

Copyright ©miriammibao.com all rights reserved|Designed by MiriamMibao温唯 Since 2014.

-
CLOUDWAYS 專屬折扣☞註冊輸入折扣碼
MMM8
,獲得首二月8折優惠!
CLOUDWAYS 專屬折扣☞輸入折扣碼
享首二月8折優惠!
miriam wei design wp logo-4 circlemiriam wei design wp logo sticky
0
對文章有任何疑問或想法嗎?歡迎一起討論唷!x